From 7c1a3b547e9b1d177a1ce048556edefaa14580e5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sun, 5 Mar 2023 05:08:02 +0000 Subject: [PATCH 01/80] chore(release): bump package version(s) [skip ci] --- packages/core/package.json | 2 +- packages/frameworks-sveltekit/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index d1090362..b9edd730 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@auth/core", - "version": "0.5.0", + "version": "0.5.1", "description": "Authentication for the Web.", "keywords": [ "authentication", diff --git a/packages/frameworks-sveltekit/package.json b/packages/frameworks-sveltekit/package.json index 6ab964c3..4adba140 100644 --- a/packages/frameworks-sveltekit/package.json +++ b/packages/frameworks-sveltekit/package.json @@ -1,6 +1,6 @@ { "name": "@auth/sveltekit", - "version": "0.2.2", + "version": "0.3.0", "description": "Authentication for SvelteKit.", "keywords": [ "authentication", From 5cb8dd5f370492eb2490bbfded75cd7dded8235b Mon Sep 17 00:00:00 2001 From: Lluis Agusti Date: Sun, 5 Mar 2023 15:56:10 +0100 Subject: [PATCH 02/80] fix(docs): add docs to source code (#6870) * docs(adapters): move dgraph adapters docs to source code * refactor: review suggestions (1) --- .gitignore | 2 +- docs/docs/reference/06-adapters/dgraph.md | 248 --------------------- docs/docusaurus.config.js | 15 ++ docs/sidebars.js | 1 + packages/adapter-dgraph/src/index.ts | 249 ++++++++++++++++++++++ 5 files changed, 266 insertions(+), 249 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/dgraph.md diff --git a/.gitignore b/.gitignore index 1f4e2442..8b34733c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ yarn-error.log* firebase-debug.log ui-debug.log .pnpm-debug.log - +.husky # Dependencies node_modules diff --git a/docs/docs/reference/06-adapters/dgraph.md b/docs/docs/reference/06-adapters/dgraph.md deleted file mode 100644 index a395059c..00000000 --- a/docs/docs/reference/06-adapters/dgraph.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -id: dgraph -title: Dgraph ---- - -This is the Dgraph Adapter for [`next-auth`](https://authjs.dev). - -## Getting Started - -1. Install the necessary packages - -```bash npm2yarn -npm install next-auth @next-auth/dgraph-adapter -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import { DgraphAdapter } from "@next-auth/dgraph-adapter" - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/provideres/oauth-builtin - providers: [], - adapter: DgraphAdapter({ - endpoint: process.env.DGRAPH_GRAPHQL_ENDPOINT, - authToken: process.env.DGRAPH_GRAPHQL_KEY, - - // you can omit the following properties if you are running an unsecure schema - authHeader: process.env.AUTH_HEADER, // default: "Authorization", - jwtSecret: process.env.SECRET, - }), -}) -``` - -## Quick start with the unsecure schema - -The quickest way to use Dgraph is by applying the unsecure schema to your [local](https://dgraph.io/docs/graphql/admin/#modifying-a-schema) Dgraph instance or if using Dgraph [cloud](https://dgraph.io/docs/cloud/cloud-quick-start/#the-schema) you can paste the schema in the codebox to update. - -:::warning -This approach is not secure or for production use, and does not require a `jwtSecret`. -::: - -> This schema is adapted for use in Dgraph and based upon our main [schema](/reference/adapters/models) - -#### Unsecure schema - -```graphql -type Account { - id: ID - type: String - provider: String @search(by: [hash]) - providerAccountId: String @search(by: [hash]) - refreshToken: String - expires_at: Int64 - accessToken: String - token_type: String - refresh_token: String - access_token: String - scope: String - id_token: String - session_state: String - user: User @hasInverse(field: "accounts") -} -type Session { - id: ID - expires: DateTime - sessionToken: String @search(by: [hash]) - user: User @hasInverse(field: "sessions") -} -type User { - id: ID - name: String - email: String @search(by: [hash]) - emailVerified: DateTime - image: String - accounts: [Account] @hasInverse(field: "user") - sessions: [Session] @hasInverse(field: "user") -} - -type VerificationToken { - id: ID - identifier: String @search(by: [hash]) - token: String @search(by: [hash]) - expires: DateTime -} -``` - -## Securing your database - -For production deployments you will want to restrict the access to the types used -by next-auth. The main form of access control used in Dgraph is via `@auth` directive alongside types in the schema. - -#### Secure schema - -```graphql -type Account - @auth( - delete: { rule: "{$nextAuth: { eq: true } }" } - add: { rule: "{$nextAuth: { eq: true } }" } - query: { rule: "{$nextAuth: { eq: true } }" } - update: { rule: "{$nextAuth: { eq: true } }" } - ) { - id: ID - type: String - provider: String @search(by: [hash]) - providerAccountId: String @search(by: [hash]) - refreshToken: String - expires_at: Int64 - accessToken: String - token_type: String - refresh_token: String - access_token: String - scope: String - id_token: String - session_state: String - user: User @hasInverse(field: "accounts") -} -type Session - @auth( - delete: { rule: "{$nextAuth: { eq: true } }" } - add: { rule: "{$nextAuth: { eq: true } }" } - query: { rule: "{$nextAuth: { eq: true } }" } - update: { rule: "{$nextAuth: { eq: true } }" } - ) { - id: ID - expires: DateTime - sessionToken: String @search(by: [hash]) - user: User @hasInverse(field: "sessions") -} -type User - @auth( - query: { - or: [ - { - rule: """ - query ($userId: String!) {queryUser(filter: { id: { eq: $userId } } ) {id}} - """ - } - { rule: "{$nextAuth: { eq: true } }" } - ] - } - delete: { rule: "{$nextAuth: { eq: true } }" } - add: { rule: "{$nextAuth: { eq: true } }" } - update: { - or: [ - { - rule: """ - query ($userId: String!) {queryUser(filter: { id: { eq: $userId } } ) {id}} - """ - } - { rule: "{$nextAuth: { eq: true } }" } - ] - } - ) { - id: ID - name: String - email: String @search(by: [hash]) - emailVerified: DateTime - image: String - accounts: [Account] @hasInverse(field: "user") - sessions: [Session] @hasInverse(field: "user") -} - -type VerificationToken - @auth( - delete: { rule: "{$nextAuth: { eq: true } }" } - add: { rule: "{$nextAuth: { eq: true } }" } - query: { rule: "{$nextAuth: { eq: true } }" } - update: { rule: "{$nextAuth: { eq: true } }" } - ) { - id: ID - identifier: String @search(by: [hash]) - token: String @search(by: [hash]) - expires: DateTime -} - -# Dgraph.Authorization {"VerificationKey":"","Header":"","Namespace":"","Algo":"HS256"} -``` - -#### Dgraph.Authorization - -In order to secure your graphql backend define the `Dgraph.Authorization` object at the -bottom of your schema and provide `authHeader` and `jwtSecret` values to the DgraphClient. - -```js -# Dgraph.Authorization {"VerificationKey":"","Header":"","Namespace":"YOUR CUSTOM NAMESPACE HERE","Algo":"HS256"} -``` - -#### VerificationKey and jwtSecret - -This is the key used to sign the JWT. Ex. `process.env.SECRET` or `process.env.APP_SECRET`. - -#### Header and authHeader - -The `Header` tells Dgraph where to lookup a JWT within the headers of the incoming requests made to the dgraph server. -You have to configure it at the bottom of your schema file. This header is the same as the `authHeader` property you -provide when you instantiate the `DgraphClient`. - -#### The nextAuth secret - -The `$nextAuth` secret is securely generated using the `jwtSecret` and injected by the DgraphAdapter in order to allow interacting with the JWT DgraphClient for anonymous user requests made within the system `ie. login, register`. This allows -secure interactions to be made with all the auth types required by next-auth. You have to specify it for each auth rule of -each type defined in your secure schema. - -```js -type VerificationRequest - @auth( - delete: { rule: "{$nextAuth: { eq: true } }" }, - add: { rule: "{$nextAuth: { eq: true } }" }, - query: { rule: "{$nextAuth: { eq: true } }" }, - update: { rule: "{$nextAuth: { eq: true } }" } - ) { - ... -} -``` - -## Working with JWT session and @auth directive - -Dgraph only works with HS256 or RS256 algorithms. If you want to use session jwt to securely interact with your dgraph -database you must customize next-auth `encode` and `decode` functions, as the default algorithm is HS512. You can -further customize the jwt with roles if you want to implement [`RBAC logic`](https://dgraph.io/docs/graphql/authorization/directive/#role-based-access-control). - -```js -import * as jwt from "jsonwebtoken" -export default NextAuth({ - session: { - strategy: "jwt", - }, - jwt: { - secret: process.env.SECRET, - encode: async ({ secret, token }) => { - return jwt.sign({ ...token, userId: token.id }, secret, { - algorithm: "HS256", - expiresIn: 30 * 24 * 60 * 60, // 30 days - }) - }, - decode: async ({ secret, token }) => { - return jwt.verify(token, secret, { algorithms: ["HS256"] }) - }, - }, -}) -``` - -Once your `Dgraph.Authorization` is defined in your schema and the JWT settings are set, this will allow you to define -[`@auth rules`](https://dgraph.io/docs/graphql/authorization/authorization-overview/) for every part of your schema. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 0ae8e673..c486fbe0 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -241,6 +241,21 @@ const docusaurusConfig = { }, }, ], + [ + "docusaurus-plugin-typedoc", + { + ...typedocConfig, + id: "dgraph-adapter", + plugin: [require.resolve("./typedoc-mdn-links")], + watch: process.env.TYPEDOC_WATCH, + entryPoints: ["../packages/adapter-dgraph/src/index.ts"], + tsconfig: "../packages/adapter-dgraph/tsconfig.json", + out: "reference/adapter/dgraph", + sidebar: { + indexLabel: "Dgraph", + }, + }, + ], ], } diff --git a/docs/sidebars.js b/docs/sidebars.js index 375a583c..17e4b966 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -51,6 +51,7 @@ module.exports = { link: { type: "doc", id: "reference/adapters/overview" }, items: [ { type: "doc", id: "reference/adapter/firebase/index" }, + { type: "doc", id: "reference/adapter/dgraph/index" }, { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, diff --git a/packages/adapter-dgraph/src/index.ts b/packages/adapter-dgraph/src/index.ts index e1345e26..8d609049 100644 --- a/packages/adapter-dgraph/src/index.ts +++ b/packages/adapter-dgraph/src/index.ts @@ -1,3 +1,16 @@ +/** + *
+ *

Official Dgraph adapter for Auth.js / NextAuth.js.

+ *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/dgraph-adapter + * ``` + * + * @module @next-auth/dgraph-adapter + */ import { client as dgraphClient } from "./client" import { format } from "./utils" import type { Adapter } from "next-auth/adapters" @@ -6,7 +19,15 @@ import * as defaultFragments from "./graphql/fragments" export type { DgraphClientParams, DgraphClientError } from "./client" +/** This is the interface of the Dgraph adapter options. */ export interface DgraphAdapterOptions { + /** + * The GraphQL {@link https://dgraph.io/docs/query-language/fragments/ Fragments} you can supply to the adapter + * to define how the shapes of the `user`, `account`, `session`, `verificationToken` entities look. + * + * By default the adapter will uses the [default defined fragments](https://github.com/nextauthjs/next-auth/blob/main/packages/adapter-dgraph/src/graphql/fragments.ts) + * , this config option allows to extend them. + */ fragments?: { User?: string Account?: string @@ -17,6 +38,234 @@ export interface DgraphAdapterOptions { export { format } +/** + * ### Basic usage + * + * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. + * + * ```ts title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import { DgraphAdapter } from "@next-auth/dgraph-adapter" + * + * export default NextAuth({ + * providers: [], + * adapter: DgraphAdapter({ + * endpoint: process.env.DGRAPH_GRAPHQL_ENDPOINT, + * authToken: process.env.DGRAPH_GRAPHQL_KEY, + * // you can omit the following properties if you are running an unsecure schema + * authHeader: process.env.AUTH_HEADER, // default: "Authorization", + * jwtSecret: process.env.SECRET, + * }), + * }) + * ``` + * ### Unsecure schema + * + * The quickest way to use Dgraph is by applying the unsecure schema to your [local](https://dgraph.io/docs/graphql/admin/#modifying-a-schema) Dgraph instance or if using Dgraph [cloud](https://dgraph.io/docs/cloud/cloud-quick-start/#the-schema) you can paste the schema in the codebox to update. + * + * :::warning + * This approach is not secure or for production use, and does not require a `jwtSecret`. + * ::: + * + * > This schema is adapted for use in Dgraph and based upon our main [schema](/reference/adapters/models) + * + * #### Example + * + *```graphql + * type Account { + * id: ID + * type: String + * provider: String @search(by: [hash]) + * providerAccountId: String @search(by: [hash]) + * refreshToken: String + * expires_at: Int64 + * accessToken: String + * token_type: String + * refresh_token: String + * access_token: String + * scope: String + * id_token: String + * session_state: String + * user: User @hasInverse(field: "accounts") + * } + * type Session { + * id: ID + * expires: DateTime + * sessionToken: String @search(by: [hash]) + * user: User @hasInverse(field: "sessions") + * } + * type User { + * id: ID + * name: String + * email: String @search(by: [hash]) + * emailVerified: DateTime + * image: String + * accounts: [Account] @hasInverse(field: "user") + * sessions: [Session] @hasInverse(field: "user") + * } + * + * type VerificationToken { + * id: ID + * identifier: String @search(by: [hash]) + * token: String @search(by: [hash]) + * expires: DateTime + * } + *``` + * ### Secure schema + * + * For production deployments you will want to restrict the access to the types used + * by next-auth. The main form of access control used in Dgraph is via `@auth` directive alongside types in the schema. + * #### Example + * + * ```graphql + * type Account + * @auth( + * delete: { rule: "{$nextAuth: { eq: true } }" } + * add: { rule: "{$nextAuth: { eq: true } }" } + * query: { rule: "{$nextAuth: { eq: true } }" } + * update: { rule: "{$nextAuth: { eq: true } }" } + * ) { + * id: ID + * type: String + * provider: String @search(by: [hash]) + * providerAccountId: String @search(by: [hash]) + * refreshToken: String + * expires_at: Int64 + * accessToken: String + * token_type: String + * refresh_token: String + * access_token: String + * scope: String + * id_token: String + * session_state: String + * user: User @hasInverse(field: "accounts") + * } + * type Session + * @auth( + * delete: { rule: "{$nextAuth: { eq: true } }" } + * add: { rule: "{$nextAuth: { eq: true } }" } + * query: { rule: "{$nextAuth: { eq: true } }" } + * update: { rule: "{$nextAuth: { eq: true } }" } + * ) { + * id: ID + * expires: DateTime + * sessionToken: String @search(by: [hash]) + * user: User @hasInverse(field: "sessions") + * } + * type User + * @auth( + * query: { + * or: [ + * { + * rule: """ + * query ($userId: String!) {queryUser(filter: { id: { eq: $userId } } ) {id}} + * """ + * } + * { rule: "{$nextAuth: { eq: true } }" } + * ] + * } + * delete: { rule: "{$nextAuth: { eq: true } }" } + * add: { rule: "{$nextAuth: { eq: true } }" } + * update: { + * or: [ + * { + * rule: """ + * query ($userId: String!) {queryUser(filter: { id: { eq: $userId } } ) {id}} + * """ + * } + * { rule: "{$nextAuth: { eq: true } }" } + * ] + * } + * ) { + * id: ID + * name: String + * email: String @search(by: [hash]) + * emailVerified: DateTime + * image: String + * accounts: [Account] @hasInverse(field: "user") + * sessions: [Session] @hasInverse(field: "user") + * } + * + * type VerificationToken + * @auth( + * delete: { rule: "{$nextAuth: { eq: true } }" } + * add: { rule: "{$nextAuth: { eq: true } }" } + * query: { rule: "{$nextAuth: { eq: true } }" } + * update: { rule: "{$nextAuth: { eq: true } }" } + * ) { + * id: ID + * identifier: String @search(by: [hash]) + * token: String @search(by: [hash]) + * expires: DateTime + * } + * + * # Dgraph.Authorization {"VerificationKey":"","Header":"","Namespace":"","Algo":"HS256"} + * ``` + * ### Dgraph.Authorization + * + * In order to secure your graphql backend define the `Dgraph.Authorization` object at the + * bottom of your schema and provide `authHeader` and `jwtSecret` values to the DgraphClient. + * + * ```js + * # Dgraph.Authorization {"VerificationKey":"","Header":"","Namespace":"YOUR CUSTOM NAMESPACE HERE","Algo":"HS256"} + * ``` + * + * ### VerificationKey and jwtSecret + * + * This is the key used to sign the JWT. Ex. `process.env.SECRET` or `process.env.APP_SECRET`. + * + * ### Header and authHeader + * + * The `Header` tells Dgraph where to lookup a JWT within the headers of the incoming requests made to the dgraph server. + * You have to configure it at the bottom of your schema file. This header is the same as the `authHeader` property you + * provide when you instantiate the `DgraphClient`. + * + * ### The nextAuth secret + * + * The `$nextAuth` secret is securely generated using the `jwtSecret` and injected by the DgraphAdapter in order to allow interacting with the JWT DgraphClient for anonymous user requests made within the system `ie. login, register`. This allows + * secure interactions to be made with all the auth types required by next-auth. You have to specify it for each auth rule of + * each type defined in your secure schema. + * + * ```js + * type VerificationRequest + * @auth( + * delete: { rule: "{$nextAuth: { eq: true } }" }, + * add: { rule: "{$nextAuth: { eq: true } }" }, + * query: { rule: "{$nextAuth: { eq: true } }" }, + * update: { rule: "{$nextAuth: { eq: true } }" } + * ) { + * ... + * } + * ``` + * ### JWT session and `@auth` directive + * + * Dgraph only works with HS256 or RS256 algorithms. If you want to use session jwt to securely interact with your dgraph + * database you must customize next-auth `encode` and `decode` functions, as the default algorithm is HS512. You can + * further customize the jwt with roles if you want to implement [`RBAC logic`](https://dgraph.io/docs/graphql/authorization/directive/#role-based-access-control). + * + * ```js + * import * as jwt from "jsonwebtoken" + * export default NextAuth({ + * session: { + * strategy: "jwt", + * }, + * jwt: { + * secret: process.env.SECRET, + * encode: async ({ secret, token }) => { + * return jwt.sign({ ...token, userId: token.id }, secret, { + * algorithm: "HS256", + * expiresIn: 30 * 24 * 60 * 60, // 30 days + * }) + * }, + * decode: async ({ secret, token }) => { + * return jwt.verify(token, secret, { algorithms: ["HS256"] }) + * }, + * }, + * }) + * ``` + * + * Once your `Dgraph.Authorization` is defined in your schema and the JWT settings are set, this will allow you to define + * [`@auth rules`](https://dgraph.io/docs/graphql/authorization/authorization-overview/) for every part of your schema. + **/ export function DgraphAdapter( client: DgraphClientParams, options?: DgraphAdapterOptions From d06a552bf6739a30a4094e2673aeea97dd8c843c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Sun, 5 Mar 2023 16:07:51 +0100 Subject: [PATCH 03/80] chore: format --- docs/vercel.json | 57 ++++++++---------------------------------------- 1 file changed, 9 insertions(+), 48 deletions(-) diff --git a/docs/vercel.json b/docs/vercel.json index 4623996f..332dd7b7 100644 --- a/docs/vercel.json +++ b/docs/vercel.json @@ -4,18 +4,9 @@ { "source": "/(.*)", "headers": [ - { - "key": "X-Content-Type-Options", - "value": "nosniff" - }, - { - "key": "X-Frame-Options", - "value": "DENY" - }, - { - "key": "X-XSS-Protection", - "value": "1; mode=block" - } + { "key": "X-Content-Type-Options", "value": "nosniff" }, + { "key": "X-Frame-Options", "value": "DENY" }, + { "key": "X-XSS-Protection", "value": "1; mode=block" } ] } ], @@ -67,62 +58,32 @@ }, { "source": "/", - "has": [ - { - "type": "host", - "value": "sveltekit.authjs.dev" - } - ], + "has": [{ "type": "host", "value": "sveltekit.authjs.dev" }], "destination": "https://authjs.dev/reference/sveltekit" }, { "source": "/", - "has": [ - { - "type": "host", - "value": "solid-start.authjs.dev" - } - ], + "has": [{ "type": "host", "value": "solid-start.authjs.dev" }], "destination": "https://authjs.dev/reference/solid-start" }, { "source": "/:path(.*)", - "has": [ - { - "type": "host", - "value": "errors.authjs.dev" - } - ], + "has": [{ "type": "host", "value": "errors.authjs.dev" }], "destination": "https://authjs.dev/reference/core/errors/:path*" }, { "source": "/:path(.*)", - "has": [ - { - "type": "host", - "value": "warnings.authjs.dev" - } - ], + "has": [{ "type": "host", "value": "warnings.authjs.dev" }], "destination": "https://authjs.dev/reference/warnings/:path*" }, { "source": "/:path(.*)", - "has": [ - { - "type": "host", - "value": "adapters.authjs.dev" - } - ], + "has": [{ "type": "host", "value": "adapters.authjs.dev" }], "destination": "https://authjs.dev/reference/adapters/:path*" }, { "source": "/:path", - "has": [ - { - "type": "host", - "value": "providers.authjs.dev" - } - ], + "has": [{ "type": "host", "value": "providers.authjs.dev" }], "destination": "https://authjs.dev/reference/core/providers_:path.default" } ] From 2e8e90a9be3348d53ecf85472934b8948f657cd0 Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Sun, 5 Mar 2023 16:32:08 +0100 Subject: [PATCH 04/80] chore(docs): new guide for sending email via http api (#6555) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(docs): new guide for sending email via http api * chore(docs): prettier code blocks * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * fix: relative links and remove prisma specific mention * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * Update docs/docs/guides/04-providers/03-email-http-api.md Co-authored-by: Balázs Orbán * chore: reword to be more inclusive * feat: use custom provider * Apply suggestions from code review * code review changes --------- Co-authored-by: Balázs Orbán --- .../guides/04-providers/03-email-http-api.md | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 docs/docs/guides/04-providers/03-email-http-api.md diff --git a/docs/docs/guides/04-providers/03-email-http-api.md b/docs/docs/guides/04-providers/03-email-http-api.md new file mode 100644 index 00000000..4184d0a4 --- /dev/null +++ b/docs/docs/guides/04-providers/03-email-http-api.md @@ -0,0 +1,109 @@ +--- +id: email-http +title: HTTP-based Email Provider +--- + +## Introduction + +:::note +The following guide is written for `next-auth` (NextAuth.js), but it should work for any of the Auth.js framework libraries (`@auth/*`) as well. +::: + + +There is a built-in Email provider with which you could connect to the SMTP server of your choice to send "magic link" emails for sign-in purposes. However, the Email provider can also be used with HTTP-based email services, like AWS SES, Postmark, Sendgrid, etc. In this guide, we are going to explain how to use our Email magic link provider with any of the more modern HTTP-based Email APIs. + +For this example, we will be using [SendGrid](https://sendgrid.com), but any email service providing an HTTP API or JS client library will work. +We will also refer to the [Prisma Adapter](/reference/adapter/prisma). A [database adapter](/adapters/overview) is a requirement for the Email provider. + +## Setup + +First, if you do not have a project using Auth.js, clone and set up a basic Auth.js project like the one [provided in](https://github.com/nextauthjs/next-auth-example.git) our example repo](https://github.com/nextauthjs/next-auth-example.git). + +- Install the [Prisma Adapter](/reference/adapter/prisma) +- Generate an API key from your cloud Email provider of choice and add it to your `.env.*` file. For example, mine is going to be called `SENDGRID_API` +- Add the following configuration to your configuration file: + +```js title="pages/api/auth/[...nextauth].ts" +import NextAuth, { NextAuthOptions } from "next-auth" +import { PrismaAdapter } from "@next-auth/prisma-adapter" +import { PrismaClient } from "@prisma/client" + +const prisma = new PrismaClient() + +export const authOptions: NextAuthOptions = { + adapter: PrismaAdapter(prisma), + providers: [ + { + id: 'sendgrid', + type: 'email', + async sendVerificationRequest({identifier: email, url}) { + } + } + ], +} + +export default NextAuth(authOptions) +``` + +Next, all that's left to do is call the HTTP endpoint from our cloud email provider and pass it the required metadata like the `to` address, the email `body`, and any other fields we may need to include. + +As mentioned earlier, we're going to be using SendGrid in this example, so the appropriate endpoint is `https://api.sendgrid.com/v3/mail/send` ([more info](https://docs.sendgrid.com/for-developers/sending-email/api-getting-started)). Therefore, we're going to pull out some of the important information from the `params` argument and use it in a `fetch()` call to the previously mentioned SendGrid API. + +```js title="pages/api/auth/[...nextauth].ts" +import NextAuth, { NextAuthOptions } from "next-auth" +import { PrismaAdapter } from "@next-auth/prisma-adapter" +import { PrismaClient } from "@prisma/client" + +const prisma = new PrismaClient() + +export const authOptions: NextAuthOptions = { + adapter: PrismaAdapter(prisma), + providers: [ + { + id: 'sendgrid', + type: 'email', + async sendVerificationRequest({identifier: email, url}) { + // highlight-start + // Call the cloud Email provider API for sending emails + // See https://docs.sendgrid.com/api-reference/mail-send/mail-send + const response = await fetch("https://api.sendgrid.com/v3/mail/send", { + // The body format will vary depending on provider, please see their documentation + // for further details. + body: JSON.stringify({ + personalizations: [{ to: [{ email }] }], + from: { email: "noreply@company.com" }, + subject: "Sign in to Your page", + content: [ + { + type: "text/plain", + value: `Please click here to authenticate - ${url}`, + }, + ], + }), + headers: { + // Authentication will also vary from provider to provider, please see their docs. + Authorization: `Bearer ${process.env.SENDGRID_API}`, + "Content-Type": "application/json", + }, + method: "POST", + }) + + if (!response.ok) { + const { errors } = await response.json() + throw new Error(JSON.stringify(errors)) + } + // highlight-end + }, + } + ], +} +``` + +And that's all we need to do to send Emails via an HTTP API! Note here that the example is only using `text/plain` as the body type. You'll probably want to change that to `text/html` and pass in a nice-looking HTML email. See, for example, our `html` function in [the Auth.js docs](/providers/email#customizing-emails). + +To sign in via this custom provider, you would refer to it by the `id` in when you are calling the sign-in method, for example: `signIn('sendgrid', { email: 'user@company.com' })`. + +## References + +- [Email provider documentation with HTML generation and more](/reference/core/modules/providers_email) +- [SendGrid JSON Body documentation](https://docs.sendgrid.com/api-reference/mail-send/mail-send#body) From 36286b1fae4f07fa8c204e88aefb0876479e8b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Sun, 5 Mar 2023 16:39:23 +0100 Subject: [PATCH 05/80] fix(adapter): improve `Adapter` docs, add runtime assertions (#6612) * fix(ts): improve Adapter documentation * chore: simplify code * assert missing adapter methods * add federated logout guide link * oidc -> oauth --- packages/core/src/adapters.ts | 208 ++++++++++++++++------ packages/core/src/index.ts | 42 ++++- packages/core/src/lib/assert.ts | 58 ++++-- packages/core/src/lib/callback-handler.ts | 15 +- packages/core/src/lib/cookie.ts | 9 +- packages/core/src/lib/init.ts | 6 +- packages/core/src/lib/routes/callback.ts | 9 +- packages/core/src/lib/routes/session.ts | 2 +- packages/core/src/lib/routes/shared.ts | 15 -- packages/core/src/lib/routes/signin.ts | 9 +- packages/core/src/types.ts | 71 ++------ 11 files changed, 273 insertions(+), 171 deletions(-) diff --git a/packages/core/src/adapters.ts b/packages/core/src/adapters.ts index 9e4520fe..4d67cbce 100644 --- a/packages/core/src/adapters.ts +++ b/packages/core/src/adapters.ts @@ -1,19 +1,22 @@ /** - * This module contains functions and types that a database adapter - * can use to be compatible with Auth.js. + * Auth.js can be integrated with _any_ data layer (database, ORM, or backend API, HTTP client) + * in order to automatically create users, handle account linking automatically, support passwordless login, + * and to store session information. * - * A database adapter provides a common interface for Auth.js so that it can work with - * _any_ database/ORM adapter without concerning itself with the implementation details of the database/ORM. + * This module contains utility functions and types to create an Auth.js compatible adapter. * * Auth.js supports 2 session strategies to persist the login state of a user. * The default is to use a cookie + {@link https://authjs.dev/concepts/session-strategies#jwt JWT} * based session store (`strategy: "jwt"`), * but you can also use a database adapter to store the session in a database. * - * :::info Note - * Auth.js _currently_ does **not** implement {@link https://authjs.dev/concepts/session-strategies#federated-logout federated logout}. - * So even if the session is deleted from the database, the user will still be logged in to the provider (but will be logged out of the app). - * See [this discussion](https://github.com/nextauthjs/next-auth/discussions/3938) for more information. + * Before you continue, Auth.js has a list of {@link https://authjs.dev/reference/adapters/overview official database adapters}. If your database is listed there, you + * probably do not need to create your own. If you are using a data solution that cannot be integrated with an official adapter, this module will help you create a compatible adapter. + * + * :::caution Note + * Although `@auth/core` _is_ framework/runtime agnostic, an adapter might rely on a client/ORM package, + * that is not yet compatible with your framework/runtime (e.g. it might rely on [Node.js APIs](https://nodejs.org/docs/latest/api)). + * Related issues should be reported to the corresponding package maintainers. * ::: * * ## Installation @@ -22,73 +25,143 @@ * npm install @auth/core * ``` * - * You can then import this submodule from `@auth/core/adapters`. + * Then, you can import this submodule from `@auth/core/adapters`. * * ## Usage * - * {@link https://authjs.dev/reference/adapters/overview Built-in adapters} already implement this interface, so you likely won't need to - * implement it yourself. If you do, you can use the following example as a - * starting point. + * Each adapter method and its function signature is documented in the {@link Adapter} interface. * - * ```ts title=your-adapter.ts + * ```ts title=my-adapter.ts * import { type Adapter } from "@auth/core/adapters" * - * export function MyAdapter(config: {}): Adapter { - * // implement the adapter methods + * // 1. Simplest form, a plain object. + * export const MyAdapter: Adapter { + * // implement the adapter methods here * } + * + * // or + * + * // 2. A function that returns an object. Official adapters use this pattern. + * export function MyAdapter(config: any): Adapter { + * // Instantiate a client/ORM here with the provided config, or pass it in as a parameter. + * // Usually, you might already have a client instance elsewhere in your application, + * // so you should only create a new instance if you need to or you don't have one. + * + * return { + * // implement the adapter methods + * } + * } + * * ``` * - * ```ts title=index.ts - * import { MyAdapter } from "./your-adapter" + * Then, you can pass your adapter to Auth.js as the `adapter` option. * - * const response = Auth({ - * adapter: MyAdapter({ /* ...adapter config *\/ }), - * // ... auth config + * ```ts title=index.ts + * import { MyAdapter } from "./my-adapter" + * + * const response = await Auth(..., { + * adapter: MyAdapter, // 1. + * // or + * adapter: MyAdapter({ /* config *\/ }), // 2. + * ... * }) * ``` * - * :::caution Note - * Although `@auth/core` is framework/runtime agnostic, an adapter might rely on a client/ORM package, - * that is not yet compatible with your runtime - * (E.g. it might rely on [Node.js-specific APIs](https://nodejs.org/docs/latest/api)) when you are trying to use it elsewhere. - * Related issues should be reported to the corresponding package maintainers. - * ::: + * Note, you might be able to tweak an existing adapter to work with your data layer, instead of creating one from scratch. * - * ### Testing - * :::tip - * If you are writing your own adapter, there is a test suite [available](https://github.com/nextauthjs/next-auth/tree/main/packages/adapter-test) + * ```ts title=my-adapter.ts + * import { type Adapter } from "@auth/core/adapters" + * import { PrismaAdapter } from "@next-auth/prisma-adapter" + * import { PrismaClient } from "@prisma/client" + * + * const prisma = new PrismaClient() + * + * const adapter: Adapter = { + * ...PrismaAdapter(prisma), + * // Add your custom methods here + * } + * + * const request = new Request("https://example.com") + * const response = await Auth(request, { adapter, ... }) + * ``` + * + * ## Testing + * + * There is a test suite [available](https://github.com/nextauthjs/next-auth/tree/main/packages/adapter-test) * to ensure that your adapter is compatible with Auth.js. - * ::: * - * ## Resources + * ## Known issues * - * - [What is a database session strategy?](https://authjs.dev/concepts/session-strategies#database) + * The following are missing built-in features in Auth.js but can be solved in user land. If you would like to help implement these features, please reach out. + * + * ### Token rotation + * + * Auth.js _currently_ does not support {@link https://authjs.dev/concepts/oauth#token-rotation `access_token` rotation} out of the box. + * The necessary information (`refresh_token`, expiry, etc.) is being stored in the database, but the logic to rotate the token is not implemented + * in the core library. + * [This guide](https://authjs.dev/guides/basics/refresh-token-rotation#database-strategy) should provide the necessary steps to do this in user land. + * + * ### Federated logout + * + * Auth.js _currently_ does not support {@link https://authjs.dev/concepts/oauth#federated-logout federated logout} out of the box. + * This means that even if an active session is deleted from the database, the user will still be signed in to the identity provider, + * they will only be signed out of the application. + * Eg. if you use Google as an identity provider, and you delete the session from the database, + * the user will still be signed in to Google, but they will be signed out of your application. + * + * If your users might be using the application from a publicly shared computer (eg: library), you might want to implement federated logout. + * {@link https://authjs.dev/guides/providers/federated-logout This guide} should provide the necessary steps. * * @module adapters */ +import { ProviderType } from "./providers/index.js" import type { Account, Awaitable, User } from "./types.js" - // TODO: Discuss if we should expose methods to serialize and deserialize // the data? Many adapters share this logic, so it could be useful to // have a common implementation. +/** + * A user represents a person who can sign in to the application. + * If a user does not exist yet, it will be created when they sign in for the first time, + * using the information (profile data) returned by the identity provider. + * A corresponding account is also created and linked to the user. + */ export interface AdapterUser extends User { + /** A unique identifier for the user. */ id: string + /** The user's email address. */ email: string + /** + * Whether the user has verified their email address via an [Email provider](https://authjs.dev/reference/core/providers_email). + * It is `null` if the user has not signed in with the Email provider yet, or the date of the first successful signin. + */ emailVerified: Date | null } +/** + * An account is a connection between a user and a provider. + * + * There are two types of accounts: + * - OAuth/OIDC accounts, which are created when a user signs in with an OAuth provider. + * - Email accounts, which are created when a user signs in with an [Email provider](https://authjs.dev/reference/core/providers_email). + * + * One user can have multiple accounts. + */ export interface AdapterAccount extends Account { userId: string + type: Extract } /** - * The session object implementing this interface - * is used to look up the user in the database. + * A session holds information about a user's current signin state. */ export interface AdapterSession { - /** A randomly generated value that is used to get hold of the session. */ + /** + * A randomly generated value that is used to look up the session in the database + * when using `"database"` `AuthConfig.strategy` option. + * This value is saved in a secure, HTTP-Only cookie on the client. + */ sessionToken: string /** Connects the active session to a user in the database */ userId: string @@ -96,8 +169,8 @@ export interface AdapterSession { * The absolute date when the session expires. * * If a session is accessed prior to its expiry date, - * it will be extended based on the `maxAge` option as defined in by {@linkcode SessionOptions.maxAge}. - * It is never extended more than once in a period defined by {@linkcode SessionOptions.updateAge}. + * it will be extended based on the `maxAge` option as defined in by `SessionOptions.maxAge`. + * It is never extended more than once in a period defined by `SessionOptions.updateAge`. * * If a session is accessed past its expiry date, * it will be removed from the database to clean up inactive sessions. @@ -106,62 +179,79 @@ export interface AdapterSession { expires: Date } +/** + * A verification token is a temporary token that is used to sign in a user via their email address. + * It is created when a user signs in with an [Email provider](https://authjs.dev/reference/core/providers_email). + * When the user clicks the link in the email, the token and email is sent back to the server + * where it is hashed and compared to the value in the database. + * If the tokens and emails match, and the token hasn't expired yet, the user is signed in. + * The token is then deleted from the database. + */ export interface VerificationToken { + /** The user's email address. */ identifier: string + /** The absolute date when the token expires. */ expires: Date + /** + * A [hashed](https://authjs.dev/concepts/hashing) token, using the `AuthConfig.secret` value. + */ token: string } /** - * Using a custom adapter you can connect to any database backend or even several different databases. - * Custom adapters created and maintained by our community can be found in the adapters repository. - * Feel free to add a custom adapter from your project to the repository, - * or even become a maintainer of a certain adapter. - * Custom adapters can still be created and used in a project without being added to the repository. + * An adapter is an object with function properties (methods) that read and write data from a data source. + * Think of these methods as a way to normalize the data layer to common interfaces that Auth.js can understand. * - * ## Resources + * This is what makes Auth.js very flexible and allows it to be used with any data layer. * - * - [Session strategies](https://authjs.dev/concepts/session-strategies#database) - * - [Using a database adapter](https://authjs.dev/guides/adapters/using-a-database-adapter) - * - [Creating a database adapter](https://authjs.dev/guides/adapters/creating-a-database-adapter) + * The adapter methods are used to perform the following operations: + * - Create/update/delete a user + * - Link/unlink an account to/from a user + * - Handle active sessions + * - Support passwordless authentication across multiple devices + * + * :::note + * If any of the methods are not implemented, but are called by Auth.js, + * an error will be shown to the user and the operation will fail. + * ::: */ export interface Adapter { - createUser(user: Omit): Awaitable - getUser(id: string): Awaitable - getUserByEmail(email: string): Awaitable + createUser?(user: Omit): Awaitable + getUser?(id: string): Awaitable + getUserByEmail?(email: string): Awaitable /** Using the provider id and the id of the user for a specific account, get the user. */ - getUserByAccount( + getUserByAccount?( providerAccountId: Pick ): Awaitable - updateUser(user: Partial): Awaitable - /** @todo This method is currently not implemented. Defining it will have no effect */ + updateUser?(user: Partial): Awaitable + /** @todo This method is currently not invoked yet. */ deleteUser?( userId: string ): Promise | Awaitable - linkAccount( + linkAccount?( account: AdapterAccount ): Promise | Awaitable - /** @todo This method is currently not implemented. Defining it will have no effect */ + /** @todo This method is currently not invoked yet. */ unlinkAccount?( providerAccountId: Pick ): Promise | Awaitable /** Creates a session for the user and returns it. */ - createSession(session: { + createSession?(session: { sessionToken: string userId: string expires: Date }): Awaitable - getSessionAndUser( + getSessionAndUser?( sessionToken: string ): Awaitable<{ session: AdapterSession; user: AdapterUser } | null> - updateSession( + updateSession?( session: Partial & Pick ): Awaitable /** * Deletes a session from the database. It is preferred that this method also * returns the session that is being deleted for logging purposes. */ - deleteSession( + deleteSession?( sessionToken: string ): Promise | Awaitable createVerificationToken?( diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 827fb6bb..02308bd9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -49,7 +49,6 @@ import type { CookiesOptions, EventCallbacks, PagesOptions, - SessionOptions, Theme, } from "./types.js" import type { Provider } from "./providers/index.js" @@ -182,15 +181,50 @@ export interface AuthConfig { * If not specified, it falls back to `AUTH_SECRET` or `NEXTAUTH_SECRET` from environment variables. * To generate a random string, you can use the following command: * - * On Unix systems: `openssl rand -hex 32` - * Or go to https://generate-secret.vercel.app/32 + * - On Unix systems, type `openssl rand -hex 32` in the terminal + * - Or generate one [online](https://generate-secret.vercel.app/32) */ secret?: string /** * Configure your session like if you want to use JWT or a database, * how long until an idle session expires, or to throttle write operations in case you are using a database. */ - session?: Partial + session?: { + /** + * Choose how you want to save the user session. + * The default is `"jwt"`, an encrypted JWT (JWE) in the session cookie. + * + * If you use an `adapter` however, we default it to `"database"` instead. + * You can still force a JWT session by explicitly defining `"jwt"`. + * + * When using `"database"`, the session cookie will only contain a `sessionToken` value, + * which is used to look up the session in the database. + * + * [Documentation](https://authjs.dev/reference/configuration/auth-config#session) | [Adapter](https://authjs.dev/reference/configuration/auth-config#adapter) | [About JSON Web Tokens](https://authjs.dev/reference/faq#json-web-tokens) + */ + strategy?: "jwt" | "database" + /** + * Relative time from now in seconds when to expire the session + * + * @default 2592000 // 30 days + */ + maxAge?: number + /** + * How often the session should be updated in seconds. + * If set to `0`, session is updated every time. + * + * @default 86400 // 1 day + */ + updateAge?: number + /** + * Generate a custom session token for database-based sessions. + * By default, a random UUID or string is generated depending on the Node.js version. + * However, you can specify your own custom string (such as CUID) to be used. + * + * @default `randomUUID` or `randomBytes.toHex` depending on the Node.js version + */ + generateSessionToken?: () => string + } /** * JSON Web Tokens are enabled by default if you have not specified an {@link AuthConfig.adapter}. * JSON Web Tokens are encrypted (JWE) by default. We recommend you keep this behaviour. diff --git a/packages/core/src/lib/assert.ts b/packages/core/src/lib/assert.ts index 797d1df7..28bd9af2 100644 --- a/packages/core/src/lib/assert.ts +++ b/packages/core/src/lib/assert.ts @@ -34,9 +34,33 @@ function isValidHttpUrl(url: string, baseUrl: string) { } } +let hasCredentials = false +let hasEmail = false + +const emailMethods = [ + "createVerificationToken", + "useVerificationToken", + "getUserByEmail", +] + +const sessionMethods = [ + "createUser", + "getUser", + "getUserByEmail", + "getUserByAccount", + "updateUser", + "linkAccount", + "createSession", + "getSessionAndUser", + "updateSession", + "deleteSession", +] + /** * Verify that the user configured Auth.js correctly. * Good place to mention deprecations as well. + * + * This is invoked before the init method, so default values are not available yet. */ export function assertConfig( request: RequestInternal, @@ -77,8 +101,6 @@ export function assertConfig( ) } - let hasCredentials, hasEmail - for (const provider of options.providers) { if ( (provider.type === "oauth" || provider.type === "oidc") && @@ -123,23 +145,29 @@ export function assertConfig( } } - if (hasEmail) { - const { adapter } = options - if (!adapter) { - return new MissingAdapter("E-mail login requires an adapter.") + const { adapter, session } = options + if ( + hasEmail || + session?.strategy === "database" || + (!session?.strategy && adapter) + ) { + let methods: string[] + + if (hasEmail) { + if (!adapter) + return new MissingAdapter("Email login requires an adapter.") + methods = emailMethods + } else { + if (!adapter) + return new MissingAdapter("Database session requires an adapter.") + methods = sessionMethods } - const missingMethods = ( - [ - "createVerificationToken", - "useVerificationToken", - "getUserByEmail", - ] as const - ).filter((method) => !adapter[method]) + const missing = methods.filter((m) => !adapter[m as keyof typeof adapter]) - if (missingMethods.length) { + if (missing.length) { return new MissingAdapterMethods( - `Required adapter methods were missing: ${missingMethods.join(", ")}` + `Required adapter methods were missing: ${missing.join(", ")}` ) } } diff --git a/packages/core/src/lib/callback-handler.ts b/packages/core/src/lib/callback-handler.ts index f05623bf..2344a81d 100644 --- a/packages/core/src/lib/callback-handler.ts +++ b/packages/core/src/lib/callback-handler.ts @@ -1,7 +1,11 @@ import { AccountNotLinked } from "../errors.js" import { fromDate } from "./utils/date.js" -import type { AdapterSession, AdapterUser } from "../adapters.js" +import type { + AdapterAccount, + AdapterSession, + AdapterUser, +} from "../adapters.js" import type { Account, InternalOptions, User } from "../types.js" import type { JWT } from "../jwt.js" import type { OAuthConfig } from "../providers/index.js" @@ -22,13 +26,13 @@ import type { SessionToken } from "./cookie.js" export async function handleLogin( sessionToken: SessionToken, _profile: User | AdapterUser | { email: string }, - account: Account | null, + _account: AdapterAccount | Account | null, options: InternalOptions ) { // Input validation - if (!account?.providerAccountId || !account.type) + if (!_account?.providerAccountId || !_account.type) throw new Error("Missing or invalid provider account") - if (!["email", "oauth", "oidc"].includes(account.type)) + if (!["email", "oauth", "oidc"].includes(_account.type)) throw new Error("Provider not supported") const { @@ -41,10 +45,11 @@ export async function handleLogin( // If no adapter is configured then we don't have a database and cannot // persist data; in this mode we just return a dummy session object. if (!adapter) { - return { user: _profile as User, account } + return { user: _profile as User, account: _account as Account } } const profile = _profile as AdapterUser + const account = _account as AdapterAccount const { createUser, diff --git a/packages/core/src/lib/cookie.ts b/packages/core/src/lib/cookie.ts index 42edff56..4c434278 100644 --- a/packages/core/src/lib/cookie.ts +++ b/packages/core/src/lib/cookie.ts @@ -1,9 +1,4 @@ -import type { - CookieOption, - CookiesOptions, - LoggerInstance, - SessionStrategy, -} from "../types.js" +import type { CookieOption, CookiesOptions, LoggerInstance } from "../types.js" // Uncomment to recalculate the estimated size // of an empty session cookie @@ -41,7 +36,7 @@ export type SetCookieOptions = Partial & { * If `options.session.strategy` is set to `jwt`, this is a stringified `JWT`. * In case of `strategy: "database"`, this is the `sessionToken` of the session in the database. */ -export type SessionToken = T extends "jwt" +export type SessionToken = T extends "jwt" ? JWTString : string diff --git a/packages/core/src/lib/init.ts b/packages/core/src/lib/init.ts index 3a105b01..7ef95f71 100644 --- a/packages/core/src/lib/init.ts +++ b/packages/core/src/lib/init.ts @@ -181,10 +181,10 @@ function eventsErrorHandler( } /** Handles adapter induced errors. */ -function adapterErrorHandler( - adapter: TAdapter | undefined, +function adapterErrorHandler( + adapter: AuthConfig["adapter"], logger: LoggerInstance -): TAdapter | undefined { +) { if (!adapter) return return Object.keys(adapter).reduce((acc, name) => { diff --git a/packages/core/src/lib/routes/callback.ts b/packages/core/src/lib/routes/callback.ts index 6c372818..7a81683b 100644 --- a/packages/core/src/lib/routes/callback.ts +++ b/packages/core/src/lib/routes/callback.ts @@ -2,7 +2,7 @@ import { handleLogin } from "../callback-handler.js" import { CallbackRouteError, Verification } from "../../errors.js" import { handleOAuth } from "../oauth/callback.js" import { createHash } from "../web.js" -import { getAdapterUserFromEmail, handleAuthorized } from "./shared.js" +import { handleAuthorized } from "./shared.js" import type { AdapterSession } from "../../adapters.js" import type { @@ -180,8 +180,11 @@ export async function callback(params: { const invalidInvite = !hasInvite || expired if (invalidInvite) throw new Verification({ hasInvite, expired }) - // @ts-expect-error -- Verified in `assertConfig`. - const user = await getAdapterUserFromEmail(identifier, adapter) + const user = (await adapter!.getUserByEmail(identifier)) ?? { + id: identifier, + email: identifier, + emailVerified: null, + } const account: Account = { providerAccountId: user.email, diff --git a/packages/core/src/lib/routes/session.ts b/packages/core/src/lib/routes/session.ts index 3c5251db..a7a67ad8 100644 --- a/packages/core/src/lib/routes/session.ts +++ b/packages/core/src/lib/routes/session.ts @@ -85,7 +85,7 @@ export async function session( // Retrieve session from database try { const { getSessionAndUser, deleteSession, updateSession } = - adapter as Adapter + adapter as Required let userAndSession = await getSessionAndUser(sessionToken) // If session has expired, clean up the database diff --git a/packages/core/src/lib/routes/shared.ts b/packages/core/src/lib/routes/shared.ts index 9706aa21..1216d0b5 100644 --- a/packages/core/src/lib/routes/shared.ts +++ b/packages/core/src/lib/routes/shared.ts @@ -1,8 +1,6 @@ import { AuthorizedCallbackError } from "../../errors.js" import { InternalOptions } from "../../types.js" -import type { Adapter, AdapterUser } from "../../adapters.js" - export async function handleAuthorized( params: any, { url, logger, callbacks: { signIn } }: InternalOptions @@ -23,16 +21,3 @@ export async function handleAuthorized( return { status: 500 as const, redirect: url.toString() } } } - -/** - * Query the database for a user by email address. - * If it's an existing user, return a user object, - * otherwise use placeholder. - */ -export async function getAdapterUserFromEmail( - email: string, - adapter: Adapter -): Promise { - const user = await adapter.getUserByEmail(email) - return user ?? { id: email, email, emailVerified: null } -} diff --git a/packages/core/src/lib/routes/signin.ts b/packages/core/src/lib/routes/signin.ts index 3cdd190c..da873e9c 100644 --- a/packages/core/src/lib/routes/signin.ts +++ b/packages/core/src/lib/routes/signin.ts @@ -1,7 +1,7 @@ import emailSignin from "../email/signin.js" import { SignInError } from "../../errors.js" import { getAuthorizationUrl } from "../oauth/authorization-url.js" -import { getAdapterUserFromEmail, handleAuthorized } from "./shared.js" +import { handleAuthorized } from "./shared.js" import type { Account, @@ -28,8 +28,11 @@ export async function signin( const normalizer = provider.normalizeIdentifier ?? defaultNormalizer const email = normalizer(body?.email) - // @ts-expect-error -- Verified in `assertConfig` - const user = await getAdapterUserFromEmail(email, options.adapter) + const user = (await options.adapter!.getUserByEmail(email)) ?? { + id: email, + email, + emailVerified: null, + } const account: Account = { providerAccountId: email, diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 9e4f0f12..555bbdaa 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -71,6 +71,7 @@ import type { import type { JWT, JWTOptions } from "./jwt.js" import type { Cookie } from "./lib/cookie.js" import type { LoggerInstance } from "./lib/utils/logger.js" +import { AuthConfig } from "./index.js" export type { AuthConfig } from "./index.js" export type Awaitable = T | PromiseLike @@ -103,19 +104,19 @@ export type TokenSet = Partial< * and also extends `TokenSet`, which is different tokens returned by OAuth Providers. */ export interface Account extends Partial { + /** Provider's id for this account. Eg.: "google" */ + provider: string /** * This value depends on the type of the provider being used to create the account. - * - oauth: The OAuth account's id, returned from the `profile()` callback. + * - oauth/oidc: The OAuth account's id, returned from the `profile()` callback. * - email: The user's email address. * - credentials: `id` returned from the `authorize()` callback */ providerAccountId: string - /** id of the user this account belongs to. */ - userId?: string - /** id of the provider used for this account */ - provider: string /** Provider's type for this account */ type: ProviderType + /** id of the user this account belongs to */ + userId?: string } /** The OAuth profile returned from your provider */ @@ -265,7 +266,7 @@ export interface EventCallbacks { */ signOut: ( message: - | { session: Awaited> } + | { session: Awaited["deleteSession"]>> } | { token: Awaited> } ) => Awaitable createUser: (message: { user: User }) => Awaitable @@ -349,53 +350,6 @@ export interface DefaultSession { */ export interface Session extends DefaultSession {} -export type SessionStrategy = "jwt" | "database" - -/** [Documentation](https://authjs.dev/reference/configuration/auth-config#session) */ -export interface SessionOptions { - /** - * Choose how you want to save the user session. - * The default is `"jwt"`, an encrypted JWT (JWE) in the session cookie. - * - * If you use an `adapter` however, we default it to `"database"` instead. - * You can still force a JWT session by explicitly defining `"jwt"`. - * - * When using `"database"`, the session cookie will only contain a `sessionToken` value, - * which is used to look up the session in the database. - * - * [Documentation](https://authjs.dev/reference/configuration/auth-config#session) | [Adapter](https://authjs.dev/reference/configuration/auth-config#adapter) | [About JSON Web Tokens](https://authjs.dev/reference/faq#json-web-tokens) - */ - strategy: SessionStrategy - /** - * Relative time from now in seconds when to expire the session - * - * @default 2592000 // 30 days - */ - maxAge: number - /** - * How often the session should be updated in seconds. - * If set to `0`, session is updated every time. - * - * @default 86400 // 1 day - */ - updateAge: number - /** - * Generate a custom session token for database-based sessions. - * By default, a random UUID or string is generated depending on the Node.js version. - * However, you can specify your own custom string (such as CUID) to be used. - * - * @default `randomUUID` or `randomBytes.toHex` depending on the Node.js version - */ - generateSessionToken: () => string -} - -export interface DefaultUser { - id: string - name?: string | null - email?: string | null - image?: string | null -} - /** * The shape of the returned object in the OAuth providers' `profile` callback, * available in the `jwt` and `session` callbacks, @@ -406,7 +360,12 @@ export interface DefaultUser { * [`jwt` callback](https://authjs.dev/guides/basics/callbacks#jwt-callback) | * [`profile` OAuth provider callback](https://authjs.dev/guides/providers/custom-provider) */ -export interface User extends DefaultUser {} +export interface User { + id: string + name?: string | null + email?: string | null + image?: string | null +} // Below are types that are only supposed be used by next-auth internally @@ -469,11 +428,11 @@ export interface InternalOptions { theme: Theme debug: boolean logger: LoggerInstance - session: Required + session: NonNullable> pages: Partial jwt: JWTOptions events: Partial - adapter: Adapter | undefined + adapter: Required | undefined callbacks: CallbacksOptions cookies: CookiesOptions callbackUrl: string From 7462e797dee6f2ecd405cc37885b6ceb36f3be91 Mon Sep 17 00:00:00 2001 From: Lluis Agusti Date: Sun, 5 Mar 2023 17:18:31 +0100 Subject: [PATCH 06/80] fix(adapter): improve Adapter docs, add runtime assertions (#6877) * docs(adapters): move dgraph adapters docs to source code * refactor: review suggestions (1) * docs(prisma): move content to source code * chore: sort * fix: dgraph logo and content --- docs/docs/reference/06-adapters/prisma.md | 210 --------------------- docs/docusaurus.config.js | 48 +++-- docs/sidebars.js | 3 +- packages/adapter-dgraph/README.md | 6 - packages/adapter-dgraph/logo.svg | 15 ++ packages/adapter-dgraph/src/index.ts | 7 +- packages/adapter-prisma/src/index.ts | 219 ++++++++++++++++++++++ 7 files changed, 271 insertions(+), 237 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/prisma.md create mode 100644 packages/adapter-dgraph/logo.svg diff --git a/docs/docs/reference/06-adapters/prisma.md b/docs/docs/reference/06-adapters/prisma.md deleted file mode 100644 index a9cbbc95..00000000 --- a/docs/docs/reference/06-adapters/prisma.md +++ /dev/null @@ -1,210 +0,0 @@ ---- -id: prisma -title: Prisma ---- - -To use this Adapter, you need to install Prisma Client, Prisma CLI, and the separate `@next-auth/prisma-adapter` package: - -```bash npm2yarn -npm install next-auth @prisma/client @next-auth/prisma-adapter -npm install prisma --save-dev -``` - -Configure your Auth.js to use the Prisma Adapter: - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import GoogleProvider from "next-auth/providers/google" -import { PrismaAdapter } from "@next-auth/prisma-adapter" -import { PrismaClient } from "@prisma/client" - -const prisma = new PrismaClient() - -export default NextAuth({ - adapter: PrismaAdapter(prisma), - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - }), - ], -}) -``` - -Schema for the Prisma Adapter (`@next-auth/prisma-adapter`) - -## Setup - -### Create the Prisma schema - -You need to use at least Prisma 2.26.0. Create a schema file in `prisma/schema.prisma` similar to this one: - -> This schema is adapted for use in Prisma and based upon our main [schema](/reference/adapters/models) - -```json title="schema.prisma" -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") - shadowDatabaseUrl = env("SHADOW_DATABASE_URL") // Only needed when using a cloud provider that doesn't support the creation of new databases, like Heroku. Learn more: https://pris.ly/d/migrate-shadow -} - -generator client { - provider = "prisma-client-js" - previewFeatures = ["referentialActions"] // You won't need this in Prisma 3.X or higher. -} - -model Account { - id String @id @default(cuid()) - userId String - type String - provider String - providerAccountId String - refresh_token String? @db.Text - access_token String? @db.Text - expires_at Int? - token_type String? - scope String? - id_token String? @db.Text - session_state String? - - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - - @@unique([provider, providerAccountId]) -} - -model Session { - id String @id @default(cuid()) - sessionToken String @unique - userId String - expires DateTime - user User @relation(fields: [userId], references: [id], onDelete: Cascade) -} - -model User { - id String @id @default(cuid()) - name String? - email String? @unique - emailVerified DateTime? - image String? - accounts Account[] - sessions Session[] -} - -model VerificationToken { - identifier String - token String @unique - expires DateTime - - @@unique([identifier, token]) -} -``` - -:::note -When using the MySQL connector for Prisma, the [Prisma `String` type](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#string) gets mapped to `varchar(191)` which may not be long enough to store fields such as `id_token` in the `Account` model. This can be avoided by explicitly using the `Text` type with `@db.Text`. -::: - -### Create the database schema with Prisma Migrate - -``` -npx prisma migrate dev -``` - -This will create an SQL migration file and execute it. - -Note that you will need to specify your database connection string in the environment variable `DATABASE_URL`. You can do this by setting it in a `.env` file at the root of your project. - -To learn more about [Prisma Migrate](https://www.prisma.io/migrate), check out the [Migrate docs](https://www.prisma.io/docs/concepts/components/prisma-migrate). - -### Generate Client - -Once you have saved your schema, use the Prisma CLI to generate the Prisma Client: - -``` -npx prisma generate -``` - -To configure your database to use the new schema (i.e. create tables and columns) use the `prisma migrate` command: - -``` -npx prisma migrate dev -``` - -### MongoDB - -Prisma supports MongoDB, and so does Auth.js. Following the instructions of the [Prisma documentation](https://www.prisma.io/docs/concepts/database-connectors/mongodb) on the MongoDB connector, things you have to change are: - -1. Make sure that the id fields are mapped correctly - -```prisma -id String @id @default(auto()) @map("_id") @db.ObjectId -``` - -2. The Native database type attribute to `@db.String` from `@db.Text` and userId to `@db.ObjectId`. - -```prisma -user_id String @db.ObjectId -refresh_token String? @db.String -access_token String? @db.String -id_token String? @db.String -``` - -Everything else should be the same. - -## Naming Conventions - -If mixed snake_case and camelCase column names is an issue for you and/or your underlying database system, we recommend using Prisma's `@map()`([see the documentation here](https://www.prisma.io/docs/concepts/components/prisma-schema/names-in-underlying-database)) feature to change the field names. This won't affect Auth.js, but will allow you to customize the column names to whichever naming convention you wish. - -For example, moving to `snake_case` and plural table names. - -```json title="schema.prisma" -model Account { - id String @id @default(cuid()) - userId String @map("user_id") - type String - provider String - providerAccountId String @map("provider_account_id") - refresh_token String? @db.Text - access_token String? @db.Text - expires_at Int? - token_type String? - scope String? - id_token String? @db.Text - session_state String? - - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - - @@unique([provider, providerAccountId]) - @@map("accounts") -} - -model Session { - id String @id @default(cuid()) - sessionToken String @unique @map("session_token") - userId String @map("user_id") - expires DateTime - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - - @@map("sessions") -} - -model User { - id String @id @default(cuid()) - name String? - email String? @unique - emailVerified DateTime? @map("email_verified") - image String? - accounts Account[] - sessions Session[] - - @@map("users") -} - -model VerificationToken { - identifier String - token String @unique - expires DateTime - - @@unique([identifier, token]) - @@map("verificationtokens") -} -``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index c486fbe0..7c549057 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,3 +1,5 @@ +// @ts-check + const fs = require("fs") const path = require("path") @@ -11,6 +13,25 @@ const providers = fs const typedocConfig = require("./typedoc.json") delete typedocConfig.$schema +/** + * @param {string} name + * @returns Record + */ +function createTypeDocAdapterConfig(name) { + const slug = name.toLowerCase().replace(" ", "-") + return { + id: slug, + plugin: [require.resolve("./typedoc-mdn-links")], + watch: process.env.TYPEDOC_WATCH, + entryPoints: [`../packages/adapter-${slug}/src/index.ts`], + tsconfig: `../packages/adapter-${slug}/tsconfig.json`, + out: `reference/adapter/${slug}`, + sidebar: { + indexLabel: name, + }, + } +} + /** @type {import("@docusaurus/types").Config} */ const docusaurusConfig = { title: "Auth.js", @@ -230,30 +251,21 @@ const docusaurusConfig = { "docusaurus-plugin-typedoc", { ...typedocConfig, - id: "firebase-adapter", - plugin: [require.resolve("./typedoc-mdn-links")], - watch: process.env.TYPEDOC_WATCH, - entryPoints: ["../packages/adapter-firebase/src/index.ts"], - tsconfig: "../packages/adapter-firebase/tsconfig.json", - out: "reference/adapter/firebase", - sidebar: { - indexLabel: "Firebase", - }, + ...createTypeDocAdapterConfig("Firebase"), }, ], [ "docusaurus-plugin-typedoc", { ...typedocConfig, - id: "dgraph-adapter", - plugin: [require.resolve("./typedoc-mdn-links")], - watch: process.env.TYPEDOC_WATCH, - entryPoints: ["../packages/adapter-dgraph/src/index.ts"], - tsconfig: "../packages/adapter-dgraph/tsconfig.json", - out: "reference/adapter/dgraph", - sidebar: { - indexLabel: "Dgraph", - }, + ...createTypeDocAdapterConfig("Dgraph"), + }, + ], + [ + "docusaurus-plugin-typedoc", + { + ...typedocConfig, + ...createTypeDocAdapterConfig("Prisma"), }, ], ], diff --git a/docs/sidebars.js b/docs/sidebars.js index 17e4b966..929f0de9 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -50,8 +50,9 @@ module.exports = { label: "Database Adapters", link: { type: "doc", id: "reference/adapters/overview" }, items: [ - { type: "doc", id: "reference/adapter/firebase/index" }, { type: "doc", id: "reference/adapter/dgraph/index" }, + { type: "doc", id: "reference/adapter/firebase/index" }, + { type: "doc", id: "reference/adapter/prisma/index" }, { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, diff --git a/packages/adapter-dgraph/README.md b/packages/adapter-dgraph/README.md index 4aa5b16c..813a28b8 100644 --- a/packages/adapter-dgraph/README.md +++ b/packages/adapter-dgraph/README.md @@ -5,11 +5,6 @@

Open Source. Full Stack. Own Your Data.

-

## Overview @@ -152,7 +147,6 @@ type User We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - ## License ISC diff --git a/packages/adapter-dgraph/logo.svg b/packages/adapter-dgraph/logo.svg new file mode 100644 index 00000000..3b26aabc --- /dev/null +++ b/packages/adapter-dgraph/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/adapter-dgraph/src/index.ts b/packages/adapter-dgraph/src/index.ts index 8d609049..62b2c1fb 100644 --- a/packages/adapter-dgraph/src/index.ts +++ b/packages/adapter-dgraph/src/index.ts @@ -1,6 +1,9 @@ /** *
- *

Official Dgraph adapter for Auth.js / NextAuth.js.

+ *

Official Dgraph adapter for Auth.js / NextAuth.js.

+ * + * + * *
* * ## Installation @@ -41,7 +44,7 @@ export { format } /** * ### Basic usage * - * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. + * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object: * * ```ts title="pages/api/auth/[...nextauth].js" * import NextAuth from "next-auth" diff --git a/packages/adapter-prisma/src/index.ts b/packages/adapter-prisma/src/index.ts index ed1bb12c..69897d85 100644 --- a/packages/adapter-prisma/src/index.ts +++ b/packages/adapter-prisma/src/index.ts @@ -1,6 +1,225 @@ +/** + *
+ *

Official Prisma adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @prisma/client @next-auth/prisma-adapter + * npm install prisma --save-dev + * ``` + * + * @module @next-auth/prisma-adapter + */ import type { PrismaClient, Prisma } from "@prisma/client" import type { Adapter, AdapterAccount } from "next-auth/adapters" +/** + * ## Basic usage + * + * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object: + * + * ```js title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import GoogleProvider from "next-auth/providers/google" + * import { PrismaAdapter } from "@next-auth/prisma-adapter" + * import { PrismaClient } from "@prisma/client" + * + * const prisma = new PrismaClient() + * + * export default NextAuth({ + * adapter: PrismaAdapter(prisma), + * providers: [ + * GoogleProvider({ + * clientId: process.env.GOOGLE_CLIENT_ID, + * clientSecret: process.env.GOOGLE_CLIENT_SECRET, + * }), + * ], + * }) + * ``` + * + * ## Schema + * + * ### Create the Prisma schema from scratch + * + * You need to use at least Prisma 2.26.0. Create a schema file in `prisma/schema.prisma` similar to this one: + * + * > This schema is adapted for use in Prisma and based upon our main [schema](/reference/adapters/models) + * + * ```json title="schema.prisma" + * datasource db { + * provider = "postgresql" + * url = env("DATABASE_URL") + * shadowDatabaseUrl = env("SHADOW_DATABASE_URL") // Only needed when using a cloud provider that doesn't support the creation of new databases, like Heroku. Learn more: https://pris.ly/d/migrate-shadow + * } + * + * generator client { + * provider = "prisma-client-js" + * previewFeatures = ["referentialActions"] // You won't need this in Prisma 3.X or higher. + * } + * + * model Account { + * id String @id @default(cuid()) + * userId String + * type String + * provider String + * providerAccountId String + * refresh_token String? @db.Text + * access_token String? @db.Text + * expires_at Int? + * token_type String? + * scope String? + * id_token String? @db.Text + * session_state String? + * + * user User @relation(fields: [userId], references: [id], onDelete: Cascade) + * + * @@unique([provider, providerAccountId]) + * } + * + * model Session { + * id String @id @default(cuid()) + * sessionToken String @unique + * userId String + * expires DateTime + * user User @relation(fields: [userId], references: [id], onDelete: Cascade) + * } + * + * model User { + * id String @id @default(cuid()) + * name String? + * email String? @unique + * emailVerified DateTime? + * image String? + * accounts Account[] + * sessions Session[] + * } + * + * model VerificationToken { + * identifier String + * token String @unique + * expires DateTime + * + * @@unique([identifier, token]) + * } + * ``` + * + * :::note + * When using the MySQL connector for Prisma, the [Prisma `String` type](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#string) gets mapped to `varchar(191)` which may not be long enough to store fields such as `id_token` in the `Account` model. This can be avoided by explicitly using the `Text` type with `@db.Text`. + * ::: + * + * + * ### Create the Prisma schema with `prisma migrate` + * + * This will create an SQL migration file and execute it: + * + * ``` + * npx prisma migrate dev + * ``` + * + * Note that you will need to specify your database connection string in the environment variable `DATABASE_URL`. You can do this by setting it in a `.env` file at the root of your project. + * + * To learn more about [Prisma Migrate](https://www.prisma.io/migrate), check out the [Migrate docs](https://www.prisma.io/docs/concepts/components/prisma-migrate). + * + * ### Generating the Prisma Client + * + * Once you have saved your schema, use the Prisma CLI to generate the Prisma Client: + * + * ``` + * npx prisma generate + * ``` + * + * To configure your database to use the new schema (i.e. create tables and columns) use the `prisma migrate` command: + * + * ``` + * npx prisma migrate dev + * ``` + * + * ### MongoDB support + * + * Prisma supports MongoDB, and so does Auth.js. Following the instructions of the [Prisma documentation](https://www.prisma.io/docs/concepts/database-connectors/mongodb) on the MongoDB connector, things you have to change are: + * + * 1. Make sure that the id fields are mapped correctly + * + * ```prisma + * id String @id @default(auto()) @map("_id") @db.ObjectId + * ``` + * + * 2. The Native database type attribute to `@db.String` from `@db.Text` and userId to `@db.ObjectId`. + * + * ```prisma + * user_id String @db.ObjectId + * refresh_token String? @db.String + * access_token String? @db.String + * id_token String? @db.String + * ``` + * + * Everything else should be the same. + * + * ## Naming Conventions + * + * If mixed snake_case and camelCase column names is an issue for you and/or your underlying database system, we recommend using Prisma's `@map()`([see the documentation here](https://www.prisma.io/docs/concepts/components/prisma-schema/names-in-underlying-database)) feature to change the field names. This won't affect Auth.js, but will allow you to customize the column names to whichever naming convention you wish. + * + * For example, moving to `snake_case` and plural table names. + * + * ```json title="schema.prisma" + * model Account { + * id String @id @default(cuid()) + * userId String @map("user_id") + * type String + * provider String + * providerAccountId String @map("provider_account_id") + * refresh_token String? @db.Text + * access_token String? @db.Text + * expires_at Int? + * token_type String? + * scope String? + * id_token String? @db.Text + * session_state String? + * + * user User @relation(fields: [userId], references: [id], onDelete: Cascade) + * + * @@unique([provider, providerAccountId]) + * @@map("accounts") + * } + * + * model Session { + * id String @id @default(cuid()) + * sessionToken String @unique @map("session_token") + * userId String @map("user_id") + * expires DateTime + * user User @relation(fields: [userId], references: [id], onDelete: Cascade) + * + * @@map("sessions") + * } + * + * model User { + * id String @id @default(cuid()) + * name String? + * email String? @unique + * emailVerified DateTime? @map("email_verified") + * image String? + * accounts Account[] + * sessions Session[] + * + * @@map("users") + * } + * + * model VerificationToken { + * identifier String + * token String @unique + * expires DateTime + * + * @@unique([identifier, token]) + * @@map("verificationtokens") + * } + * ``` + * + **/ export function PrismaAdapter(p: PrismaClient): Adapter { return { createUser: (data) => p.user.create({ data }), From a220245d0341c40e49d40f4f1c52955ff008dbca Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Tue, 7 Mar 2023 02:53:25 +0100 Subject: [PATCH 07/80] chore(repo): add FusionAuth to README supporters (#6883) * chore(repo): add FusionAuthu to README supporters * chore(repo): put sponsors on two lines of 5 --- packages/next-auth/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/next-auth/README.md b/packages/next-auth/README.md index 53d78620..2d4e247a 100644 --- a/packages/next-auth/README.md +++ b/packages/next-auth/README.md @@ -224,6 +224,8 @@ We're happy to announce we've recently created an [OpenCollective](https://openc
Clerk

🥉 Bronze Financial Sponsor + + Lowdefy Logo @@ -238,6 +240,13 @@ We're happy to announce we've recently created an [OpenCollective](https://openc
WorkOS

🥉 Bronze Financial Sponsor + +
+ FusionAuth Logo +
+
FusionAuth

+ 🥉 Bronze Financial Sponsor + Checkly Logo From f6bb16b264f43a0afdbc6c26a2db6cd5c8e6030d Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Wed, 8 Mar 2023 17:54:54 +0100 Subject: [PATCH 08/80] chore: update README sponsors - fusionauth level (#6892) --- packages/next-auth/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/next-auth/README.md b/packages/next-auth/README.md index 2d4e247a..719b6215 100644 --- a/packages/next-auth/README.md +++ b/packages/next-auth/README.md @@ -203,6 +203,13 @@ We're happy to announce we've recently created an [OpenCollective](https://openc
Beyond Identity

🥈 Silver Financial Sponsor + +
+ FusionAuth Logo +
+
FusionAuth

+ 🥈 Silver Financial Sponsor + Vercel Logo @@ -217,15 +224,15 @@ We're happy to announce we've recently created an [OpenCollective](https://openc
Prisma

🥉 Bronze Financial Sponsor + +
Prisma Logo
Clerk

🥉 Bronze Financial Sponsor - - - + Lowdefy Logo @@ -240,13 +247,6 @@ We're happy to announce we've recently created an [OpenCollective](https://openc
WorkOS

🥉 Bronze Financial Sponsor - -
- FusionAuth Logo -
-
FusionAuth

- 🥉 Bronze Financial Sponsor - Checkly Logo From ab13930020d68ea1d0cb575131fccec6e67fc606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 9 Mar 2023 11:48:45 +0100 Subject: [PATCH 09/80] chore: tweak turbo cache --- .gitignore | 1 - .npmrc | 1 + pnpm-lock.yaml | 176 +++++++++++++++++++++++++------------------------ turbo.json | 26 +++++--- 4 files changed, 106 insertions(+), 98 deletions(-) create mode 100644 .npmrc diff --git a/.gitignore b/.gitignore index 8b34733c..a04017ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ # Misc .DS_Store -.npmrc .eslintcache .env .env.local diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..f0c0c3df --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +public-hoist-pattern[]=*prisma* diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bba860c0..0cec98b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,6 +105,57 @@ importers: sqlite3: 5.0.8 typeorm: 0.3.7_pg@8.7.3+sqlite3@5.0.8 + apps/dev/nextjs-2: + specifiers: + '@auth/core': workspace:* + '@next-auth/fauna-adapter': workspace:* + '@next-auth/prisma-adapter': workspace:* + '@next-auth/supabase-adapter': workspace:* + '@next-auth/typeorm-legacy-adapter': workspace:* + '@playwright/test': 1.29.2 + '@prisma/client': ^3 + '@supabase/supabase-js': ^2.0.5 + '@types/jsonwebtoken': ^8.5.5 + '@types/react': ^18.0.15 + '@types/react-dom': ^18.0.6 + dotenv: ^16.0.3 + fake-smtp-server: ^0.8.0 + faunadb: ^4 + next: 13.1.1 + next-auth: workspace:* + nodemailer: ^6 + pg: ^8.7.3 + prisma: ^3 + react: ^18 + react-dom: ^18 + sqlite3: ^5.0.8 + typeorm: 0.3.7 + dependencies: + '@auth/core': link:../../../packages/core + '@next-auth/fauna-adapter': link:../../../packages/adapter-fauna + '@next-auth/prisma-adapter': link:../../../packages/adapter-prisma + '@next-auth/supabase-adapter': link:../../../packages/adapter-supabase + '@next-auth/typeorm-legacy-adapter': link:../../../packages/adapter-typeorm-legacy + '@prisma/client': 3.15.2_prisma@3.15.2 + '@supabase/supabase-js': 2.0.5 + faunadb: 4.6.0 + next: 13.1.1_biqbaboplfbrettd7655fr4n2y + next-auth: link:../../../packages/next-auth + nodemailer: 6.8.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + devDependencies: + '@playwright/test': 1.29.2 + '@types/jsonwebtoken': 8.5.9 + '@types/react': 18.0.26 + '@types/react-dom': 18.0.6 + dotenv: 16.0.3 + fake-smtp-server: 0.8.0 + pg: 8.7.3 + prisma: 3.15.2 + sqlite3: 5.0.8 + typeorm: 0.3.7_pg@8.7.3+sqlite3@5.0.8 + apps/dev/sveltekit: specifiers: '@auth/core': workspace:* @@ -136,7 +187,7 @@ importers: vercel: ^23.1.2 dependencies: dotenv: 16.0.3 - gatsby: 5.8.0-next.0_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y next-auth: link:../../../packages/next-auth react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -6881,7 +6932,7 @@ packages: infima: 0.2.0-alpha.42 lodash: 4.17.21 nprogress: 0.2.0 - postcss: 8.4.20 + postcss: 8.4.21 prism-react-renderer: 1.3.5_react@18.2.0 prismjs: 1.28.0 react: 18.2.0 @@ -9021,7 +9072,7 @@ packages: detect-libc: 2.0.1 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.7 + node-fetch: 2.6.9 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -9605,9 +9656,9 @@ packages: '@rollup/plugin-replace': 5.0.2_rollup@2.79.1 '@vitejs/plugin-vue': 3.2.0_vite@3.2.5+vue@3.2.45 '@vitejs/plugin-vue-jsx': 2.1.1_vite@3.2.5+vue@3.2.45 - autoprefixer: 10.4.13_postcss@8.4.20 + autoprefixer: 10.4.13_postcss@8.4.21 chokidar: 3.5.3 - cssnano: 5.1.14_postcss@8.4.20 + cssnano: 5.1.14_postcss@8.4.21 defu: 6.1.1 esbuild: 0.15.16 escape-string-regexp: 5.0.0 @@ -9623,9 +9674,9 @@ packages: pathe: 1.0.0 perfect-debounce: 0.1.3 pkg-types: 1.0.1 - postcss: 8.4.20 - postcss-import: 15.1.0_postcss@8.4.20 - postcss-url: 10.1.3_postcss@8.4.20 + postcss: 8.4.21 + postcss-import: 15.1.0_postcss@8.4.21 + postcss-url: 10.1.3_postcss@8.4.21 rollup: 2.79.1 rollup-plugin-visualizer: 5.9.0_rollup@2.79.1 ufo: 1.0.1 @@ -12725,8 +12776,10 @@ packages: indent-string: 4.0.0 dev: true - /ajv-formats/2.1.1: + /ajv-formats/2.1.1_ajv@8.11.0: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -13632,7 +13685,7 @@ packages: - supports-color dev: true - /babel-plugin-remove-graphql-queries/5.8.0-next.0_osdpouujtlfd2op5ubueuc4aqi: + /babel-plugin-remove-graphql-queries/5.8.0-next.0_u7ozffrhm6o22jdb3uxxwj2pzm: resolution: {integrity: sha512-emjOEAt/rnb1eGC1ximT3/Rs1i6U6DT2K385uteLPsGsZ8s6fCPvmzm8TLjRM3iWT4LTVc9OBGghkFPCJ8C6Vg==} engines: {node: '>=18.0.0'} peerDependencies: @@ -13642,7 +13695,7 @@ packages: '@babel/core': 7.20.12 '@babel/runtime': 7.20.13 '@babel/types': 7.20.7 - gatsby: 5.8.0-next.0_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y gatsby-core-utils: 4.8.0-next.0 dev: false @@ -15490,44 +15543,6 @@ packages: postcss-unique-selectors: 5.1.1_postcss@8.4.20 dev: true - /cssnano-preset-default/5.2.13_postcss@8.4.20: - resolution: {integrity: sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - css-declaration-sorter: 6.3.1_postcss@8.4.20 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 - postcss-calc: 8.2.4_postcss@8.4.20 - postcss-colormin: 5.3.0_postcss@8.4.20 - postcss-convert-values: 5.1.3_postcss@8.4.20 - postcss-discard-comments: 5.1.2_postcss@8.4.20 - postcss-discard-duplicates: 5.1.0_postcss@8.4.20 - postcss-discard-empty: 5.1.1_postcss@8.4.20 - postcss-discard-overridden: 5.1.0_postcss@8.4.20 - postcss-merge-longhand: 5.1.7_postcss@8.4.20 - postcss-merge-rules: 5.1.3_postcss@8.4.20 - postcss-minify-font-values: 5.1.0_postcss@8.4.20 - postcss-minify-gradients: 5.1.1_postcss@8.4.20 - postcss-minify-params: 5.1.4_postcss@8.4.20 - postcss-minify-selectors: 5.2.1_postcss@8.4.20 - postcss-normalize-charset: 5.1.0_postcss@8.4.20 - postcss-normalize-display-values: 5.1.0_postcss@8.4.20 - postcss-normalize-positions: 5.1.1_postcss@8.4.20 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.20 - postcss-normalize-string: 5.1.0_postcss@8.4.20 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.20 - postcss-normalize-unicode: 5.1.1_postcss@8.4.20 - postcss-normalize-url: 5.1.0_postcss@8.4.20 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.20 - postcss-ordered-values: 5.1.3_postcss@8.4.20 - postcss-reduce-initial: 5.1.1_postcss@8.4.20 - postcss-reduce-transforms: 5.1.0_postcss@8.4.20 - postcss-svgo: 5.1.0_postcss@8.4.20 - postcss-unique-selectors: 5.1.1_postcss@8.4.20 - dev: true - /cssnano-preset-default/5.2.13_postcss@8.4.21: resolution: {integrity: sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -15615,18 +15630,6 @@ packages: yaml: 1.10.2 dev: true - /cssnano/5.1.14_postcss@8.4.20: - resolution: {integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-preset-default: 5.2.13_postcss@8.4.20 - lilconfig: 2.0.6 - postcss: 8.4.20 - yaml: 1.10.2 - dev: true - /cssnano/5.1.14_postcss@8.4.21: resolution: {integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==} engines: {node: ^10 || ^12 || >=14.0} @@ -16236,7 +16239,6 @@ packages: /date-fns/2.29.3: resolution: {integrity: sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==} engines: {node: '>=0.11'} - dev: false /date-utils/1.2.21: resolution: {integrity: sha512-wJMBjqlwXR0Iv0wUo/lFbhSQ7MmG1hl36iuxuE91kW+5b5sWbase73manEqNH9sOLFAMG83B4ffNKq9/Iq0FVA==} @@ -18472,7 +18474,7 @@ packages: dependencies: '@apidevtools/json-schema-ref-parser': 9.0.9 ajv: 8.11.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1_ajv@8.11.0 body-parser: 1.20.0 content-type: 1.0.4 deep-freeze: 0.0.1 @@ -19395,8 +19397,8 @@ packages: /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - /gatsby-cli/5.8.0-next.0: - resolution: {integrity: sha512-oyWlvplp6N9KHHHGKTzqLyKtzB6KOFyS+88Z4kj2QHvRKWPX0KitO7MOp4Xmc6G8Zqrl8JWNqH9+uyVh0m3+BA==} + /gatsby-cli/5.8.0-next.1: + resolution: {integrity: sha512-IWp2ytSdo09wXD9jdoxqnVlckNEx1z2QpFdCuJcyiKbyvuRKGm/PSdwEmjuabvarPCuSEbX3A1MQKOigYi0Ppw==} engines: {node: '>=18.0.0'} hasBin: true requiresBuild: true @@ -19532,7 +19534,7 @@ packages: '@parcel/transformer-json': 2.8.3_@parcel+core@2.8.3 dev: false - /gatsby-plugin-page-creator/5.8.0-next.0_irjlgbbmdc6sbwac5pl62frsae: + /gatsby-plugin-page-creator/5.8.0-next.0_z7kyunzhk3nj7555smr4e43evq: resolution: {integrity: sha512-G3NxUJOTZQFt+b2OO0A9yOxfKGiwnUdvpBymob9kJ/YyxLX82ri3xlXPTxp7imQDIbv1BbVRVFV45EVWrWJWKg==} engines: {node: '>=18.0.0'} peerDependencies: @@ -19544,10 +19546,10 @@ packages: chokidar: 3.5.3 fs-exists-cached: 1.0.0 fs-extra: 11.1.0 - gatsby: 5.8.0-next.0_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y gatsby-core-utils: 4.8.0-next.0 gatsby-page-utils: 3.8.0-next.0 - gatsby-plugin-utils: 4.8.0-next.0_irjlgbbmdc6sbwac5pl62frsae + gatsby-plugin-utils: 4.8.0-next.0_z7kyunzhk3nj7555smr4e43evq gatsby-telemetry: 4.8.0-next.0 globby: 11.1.0 lodash: 4.17.21 @@ -19557,7 +19559,7 @@ packages: - supports-color dev: false - /gatsby-plugin-typescript/5.8.0-next.0_gatsby@5.8.0-next.0: + /gatsby-plugin-typescript/5.8.0-next.0_gatsby@5.8.0-next.2: resolution: {integrity: sha512-ofnAJ/oR0VctV8QqKxYPhLWJPO1iz0Ek4U4mZb2YkknRTPKLnQdeAbohucst66BuHcY8zlZTTwZ2cUw+UW1dnQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -19569,13 +19571,13 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 '@babel/preset-typescript': 7.18.6_@babel+core@7.20.12 '@babel/runtime': 7.20.13 - babel-plugin-remove-graphql-queries: 5.8.0-next.0_osdpouujtlfd2op5ubueuc4aqi - gatsby: 5.8.0-next.0_biqbaboplfbrettd7655fr4n2y + babel-plugin-remove-graphql-queries: 5.8.0-next.0_u7ozffrhm6o22jdb3uxxwj2pzm + gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y transitivePeerDependencies: - supports-color dev: false - /gatsby-plugin-utils/4.8.0-next.0_irjlgbbmdc6sbwac5pl62frsae: + /gatsby-plugin-utils/4.8.0-next.0_z7kyunzhk3nj7555smr4e43evq: resolution: {integrity: sha512-Uzj8sP0tzpMF1wvgW7uct7LiSzkIl2bUpWhuJ9BS63mtWohYPAJIgc+kmeCS501C/SZtUz+Iipk5DKp9mjOV1Q==} engines: {node: '>=18.0.0'} peerDependencies: @@ -19585,7 +19587,7 @@ packages: '@babel/runtime': 7.20.13 fastq: 1.15.0 fs-extra: 11.1.0 - gatsby: 5.8.0-next.0_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y gatsby-core-utils: 4.8.0-next.0 gatsby-sharp: 1.8.0-next.0 graphql: 16.6.0 @@ -19664,8 +19666,8 @@ packages: - supports-color dev: false - /gatsby/5.8.0-next.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-9C7q/Nl8lEIyatk1hryDlUw/TVLsKsJoJ+ZR8Z0t0eE2ulRjpFI3vMFuJLnLQFGfdrWtETrnhZha4NJvTo8Pbw==} + /gatsby/5.8.0-next.2_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-DckTpIu9AHHBODu/oqqPXeACNAUk8/QELhEje4Tdn46ZEiJgC7S65FEFYD+6Q38lpfffz0RiM1wSiIPUK0HNfg==} engines: {node: '>=18.0.0'} hasBin: true requiresBuild: true @@ -19711,7 +19713,7 @@ packages: babel-plugin-add-module-exports: 1.0.4 babel-plugin-dynamic-import-node: 2.3.3 babel-plugin-lodash: 3.3.4 - babel-plugin-remove-graphql-queries: 5.8.0-next.0_osdpouujtlfd2op5ubueuc4aqi + babel-plugin-remove-graphql-queries: 5.8.0-next.0_u7ozffrhm6o22jdb3uxxwj2pzm babel-preset-gatsby: 3.8.0-next.0_pp2vm42zn6vfmnpuhar3irht7i better-opn: 2.1.1 bluebird: 3.7.2 @@ -19753,16 +19755,16 @@ packages: find-cache-dir: 3.3.2 fs-exists-cached: 1.0.0 fs-extra: 11.1.0 - gatsby-cli: 5.8.0-next.0 + gatsby-cli: 5.8.0-next.1 gatsby-core-utils: 4.8.0-next.0 gatsby-graphiql-explorer: 3.8.0-next.0 gatsby-legacy-polyfills: 3.8.0-next.0 gatsby-link: 5.8.0-next.0_uxzdzcrcylloub4rxar25ny6ra gatsby-page-utils: 3.8.0-next.0 gatsby-parcel-config: 1.8.0-next.0_@parcel+core@2.8.3 - gatsby-plugin-page-creator: 5.8.0-next.0_irjlgbbmdc6sbwac5pl62frsae - gatsby-plugin-typescript: 5.8.0-next.0_gatsby@5.8.0-next.0 - gatsby-plugin-utils: 4.8.0-next.0_irjlgbbmdc6sbwac5pl62frsae + gatsby-plugin-page-creator: 5.8.0-next.0_z7kyunzhk3nj7555smr4e43evq + gatsby-plugin-typescript: 5.8.0-next.0_gatsby@5.8.0-next.2 + gatsby-plugin-utils: 4.8.0-next.0_z7kyunzhk3nj7555smr4e43evq gatsby-react-router-scroll: 6.8.0-next.0_uxzdzcrcylloub4rxar25ny6ra gatsby-script: 2.8.0-next.0_uxzdzcrcylloub4rxar25ny6ra gatsby-telemetry: 4.8.0-next.0 @@ -27253,13 +27255,13 @@ packages: enhanced-resolve: 4.5.0 dev: true - /postcss-import/15.1.0_postcss@8.4.20: + /postcss-import/15.1.0_postcss@8.4.21: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.20 + postcss: 8.4.21 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 @@ -28048,7 +28050,7 @@ packages: postcss: 8.4.21 postcss-selector-parser: 6.0.10 - /postcss-url/10.1.3_postcss@8.4.20: + /postcss-url/10.1.3_postcss@8.4.21: resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} engines: {node: '>=10'} peerDependencies: @@ -28057,7 +28059,7 @@ packages: make-dir: 3.1.0 mime: 2.5.2 minimatch: 3.0.4 - postcss: 8.4.20 + postcss: 8.4.21 xxhashjs: 0.2.2 dev: true @@ -29851,7 +29853,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1_ajv@8.11.0 ajv-keywords: 5.1.0_ajv@8.11.0 dev: true @@ -32335,7 +32337,7 @@ packages: buffer: 6.0.3 chalk: 4.1.2 cli-highlight: 2.1.11 - date-fns: 2.28.0 + date-fns: 2.29.3 debug: 4.3.4 dotenv: 16.0.3 glob: 7.2.3 @@ -32417,7 +32419,7 @@ packages: buffer: 6.0.3 chalk: 4.1.2 cli-highlight: 2.1.11 - date-fns: 2.28.0 + date-fns: 2.29.3 debug: 4.3.4 dotenv: 16.0.3 glob: 7.2.3 diff --git a/turbo.json b/turbo.json index 72842365..67d547f2 100644 --- a/turbo.json +++ b/turbo.json @@ -2,7 +2,8 @@ "$schema": "https://turborepo.org/schema.json", "pipeline": { "build": { - "dependsOn": ["^build"] + "dependsOn": ["^build"], + "outputs": ["dist/**/*"] }, "next-auth#build": { "dependsOn": ["^build"], @@ -14,16 +15,20 @@ "next/**", "providers/**", "react/**", - "index.d.ts", - "index.js", - "adapters.d.ts", - "middleware.d.ts", - "middleware.js" + "*.js", + "*.d.ts" ] }, "@auth/core#build": { "dependsOn": ["^build"], - "outputs": ["lib/**", "providers/**", "*.js", "*.d.ts", "*.d.ts.map"] + "outputs": [ + "lib/**/*", + "providers/**/*", + "*.js", + "*.d.ts", + "*.d.ts.map", + "src/lib/pages/styles.ts" + ] }, "@auth/sveltekit#build": { "dependsOn": ["^build"], @@ -51,9 +56,10 @@ "docs#build": { "dependsOn": ["^build"], "outputs": [ - "build", - "docs/reference/core", - "docs/reference/sveltekit", + ".docusaurus/**/*", + "build/**/*", + "docs/reference/core/**/*", + "docs/reference/sveltekit/**/*", "docs/reference/adapter/**" ] } From e3f9b398f08caf8b89145198d4a7ccc5bf647dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 9 Mar 2023 12:00:19 +0100 Subject: [PATCH 10/80] chore: add adapters to docs as dependencies --- docs/package.json | 3 +++ pnpm-lock.yaml | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/docs/package.json b/docs/package.json index aa5183a8..dbc6c6a7 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,6 +18,9 @@ "@auth/core": "workspace:*", "@auth/sveltekit": "workspace:*", "@mdx-js/react": "1.6.22", + "@next-auth/firebase-adapter": "workspace:*", + "@next-auth/dgraph-adapter": "workspace:*", + "@next-auth/prisma-adapter": "workspace:*", "@sapphire/docusaurus-plugin-npm2yarn2pnpm": "1.1.4", "classnames": "^2.3.2", "mdx-mermaid": "1.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cec98b6..e4171d5c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -224,6 +224,9 @@ importers: '@docusaurus/theme-common': 2.2.0 '@docusaurus/types': 2.2.0 '@mdx-js/react': 1.6.22 + '@next-auth/dgraph-adapter': workspace:* + '@next-auth/firebase-adapter': workspace:* + '@next-auth/prisma-adapter': workspace:* '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 classnames: ^2.3.2 docusaurus-plugin-typedoc: 1.0.0-next.2 @@ -241,6 +244,9 @@ importers: '@auth/core': link:../packages/core '@auth/sveltekit': link:../packages/frameworks-sveltekit '@mdx-js/react': 1.6.22_react@18.2.0 + '@next-auth/dgraph-adapter': link:../packages/adapter-dgraph + '@next-auth/firebase-adapter': link:../packages/adapter-firebase + '@next-auth/prisma-adapter': link:../packages/adapter-prisma '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 classnames: 2.3.2 mdx-mermaid: 1.2.2_mermaid@9.0.1+react@18.2.0 From 2c5c4d18c408023f3dd11160979c817805452f78 Mon Sep 17 00:00:00 2001 From: Lluis Agusti Date: Thu, 9 Mar 2023 12:20:04 +0100 Subject: [PATCH 11/80] docs(typeorm): move content to source (#6896) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(typeorm): move content to source * chore: fix fn * chore: document options * Update index.ts * chore: update logo --------- Co-authored-by: Balázs Orbán --- docs/docs/reference/06-adapters/typeorm.md | 234 ------------------ docs/docusaurus.config.js | 16 ++ docs/sidebars.js | 1 + packages/adapter-typeorm-legacy/logo.png | Bin 27489 -> 6516 bytes packages/adapter-typeorm-legacy/src/index.ts | 235 +++++++++++++++++++ 5 files changed, 252 insertions(+), 234 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/typeorm.md diff --git a/docs/docs/reference/06-adapters/typeorm.md b/docs/docs/reference/06-adapters/typeorm.md deleted file mode 100644 index 7e3b025c..00000000 --- a/docs/docs/reference/06-adapters/typeorm.md +++ /dev/null @@ -1,234 +0,0 @@ ---- -id: typeorm -title: TypeORM ---- - -This Adapter is used to support SQL-flavored databases (like SQLite, MySQL, MSSQL, MariaDB, CockroachDB, etc.) through [TypeORM](https://typeorm.io), and mostly kept around for legacy reasons. (See the warning below.) - -:::note -If you previously used this Adapter with MongoDB, check out the [MongoDB Adapter](/reference/adapters/mongodb) instead. -::: - -:::warning -In the future, we might split up this adapter to support single flavors of SQL for easier maintenance and reduced bundle size. -::: - -## Usage - -To use this Adapter, you need to install the following packages: - -```bash npm2yarn -npm install next-auth @next-auth/typeorm-legacy-adapter typeorm -``` - -Configure your Auth.js to use the TypeORM Adapter: - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" - - -export default NextAuth({ - adapter: TypeORMLegacyAdapter("yourconnectionstring"), - ... -}) -``` - -`TypeORMLegacyAdapter` takes either a connection string, or a [`ConnectionOptions`](https://github.com/typeorm/typeorm/blob/master/docs/connection-options.md) object as its first parameter. - -## Custom models - -The TypeORM adapter uses [`Entity` classes](https://github.com/typeorm/typeorm/blob/master/docs/entities.md) to define the shape of your data. - -If you want to override the default entities (for example to add a `role` field to your `UserEntity`), you will have to do the following: - -> This schema is adapted for use in TypeORM and based upon our main [schema](/reference/adapters/models) - -1. Create a file containing your modified entities: - -(The file below is based on the [default entities](https://github.com/nextauthjs/next-auth/blob/main/packages/adapter-typeorm-legacy/src/entities.ts)) - -```diff title="lib/entities.ts" -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - OneToMany, - ValueTransformer, -} from "typeorm" - -const transformer: Record<"date" | "bigint", ValueTransformer> = { - date: { - from: (date: string | null) => date && new Date(parseInt(date, 10)), - to: (date?: Date) => date?.valueOf().toString(), - }, - bigint: { - from: (bigInt: string | null) => bigInt && parseInt(bigInt, 10), - to: (bigInt?: number) => bigInt?.toString(), - }, -} - -@Entity({ name: "users" }) -export class UserEntity { - @PrimaryGeneratedColumn("uuid") - id!: string - - @Column({ type: "varchar", nullable: true }) - name!: string | null - - @Column({ type: "varchar", nullable: true, unique: true }) - email!: string | null - - @Column({ type: "varchar", nullable: true, transformer: transformer.date }) - emailVerified!: string | null - - @Column({ type: "varchar", nullable: true }) - image!: string | null - -+ @Column({ type: "varchar", nullable: true }) -+ role!: string | null - - @OneToMany(() => SessionEntity, (session) => session.userId) - sessions!: SessionEntity[] - - @OneToMany(() => AccountEntity, (account) => account.userId) - accounts!: AccountEntity[] -} - -@Entity({ name: "accounts" }) -export class AccountEntity { - @PrimaryGeneratedColumn("uuid") - id!: string - - @Column({ type: "uuid" }) - userId!: string - - @Column() - type!: string - - @Column() - provider!: string - - @Column() - providerAccountId!: string - - @Column({ type: "varchar", nullable: true }) - refresh_token!: string | null - - @Column({ type: "varchar", nullable: true }) - access_token!: string | null - - @Column({ - nullable: true, - type: "bigint", - transformer: transformer.bigint, - }) - expires_at!: number | null - - @Column({ type: "varchar", nullable: true }) - token_type!: string | null - - @Column({ type: "varchar", nullable: true }) - scope!: string | null - - @Column({ type: "varchar", nullable: true }) - id_token!: string | null - - @Column({ type: "varchar", nullable: true }) - session_state!: string | null - - @Column({ type: "varchar", nullable: true }) - oauth_token_secret!: string | null - - @Column({ type: "varchar", nullable: true }) - oauth_token!: string | null - - @ManyToOne(() => UserEntity, (user) => user.accounts, { - createForeignKeyConstraints: true, - }) - user!: UserEntity -} - -@Entity({ name: "sessions" }) -export class SessionEntity { - @PrimaryGeneratedColumn("uuid") - id!: string - - @Column({ unique: true }) - sessionToken!: string - - @Column({ type: "uuid" }) - userId!: string - - @Column({ transformer: transformer.date }) - expires!: string - - @ManyToOne(() => UserEntity, (user) => user.sessions) - user!: UserEntity -} - -@Entity({ name: "verification_tokens" }) -export class VerificationTokenEntity { - @PrimaryGeneratedColumn("uuid") - id!: string - - @Column() - token!: string - - @Column() - identifier!: string - - @Column({ transformer: transformer.date }) - expires!: string -} -``` - -2. Pass them to `TypeORMLegacyAdapter` - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" -import * as entities from "lib/entities" - -export default NextAuth({ - adapter: TypeORMLegacyAdapter("yourconnectionstring", { entities }), - ... -}) -``` - -:::tip Synchronize your database ♻ -The `synchronize: true` option in TypeORM will generate SQL that exactly matches the entities. This will automatically apply any changes it finds in the entity model. This is a useful option in development. -::: - -:::warning Using synchronize in production -`synchronize: true` should not be enabled against production databases as it may cause data loss if the configured schema does not match the expected schema! We recommend that you synchronize/migrate your production database at build-time. -::: - -## Naming Conventions - -If mixed snake_case and camelCase column names are an issue for you and/or your underlying database system, we recommend using TypeORM's naming strategy feature to change the target field names. There is a package called `typeorm-naming-strategies` which includes a `snake_case` strategy which will translate the fields from how Auth.js expects them, to snake_case in the actual database. - -For example, you can add the naming convention option to the connection object in your NextAuth config. - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" -import { SnakeNamingStrategy } from 'typeorm-naming-strategies' -import { ConnectionOptions } from "typeorm" - -const connection: ConnectionOptions = { - type: "mysql", - host: "localhost", - port: 3306, - username: "test", - password: "test", - database: "test", - namingStrategy: new SnakeNamingStrategy() -} - -export default NextAuth({ - adapter: TypeORMLegacyAdapter(connection), - ... -}) -``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 7c549057..e8afc87b 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -19,6 +19,7 @@ delete typedocConfig.$schema */ function createTypeDocAdapterConfig(name) { const slug = name.toLowerCase().replace(" ", "-") + return { id: slug, plugin: [require.resolve("./typedoc-mdn-links")], @@ -268,6 +269,21 @@ const docusaurusConfig = { ...createTypeDocAdapterConfig("Prisma"), }, ], + [ + "docusaurus-plugin-typedoc", + { + ...typedocConfig, + id: "typeorm", + plugin: [require.resolve("./typedoc-mdn-links")], + watch: process.env.TYPEDOC_WATCH, + entryPoints: [`../packages/adapter-typeorm-legacy/src/index.ts`], + tsconfig: `../packages/adapter-typeorm-legacy/tsconfig.json`, + out: `reference/adapter/typeorm`, + sidebar: { + indexLabel: "TypeORM", + }, + }, + ], ], } diff --git a/docs/sidebars.js b/docs/sidebars.js index 929f0de9..94956ae2 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -53,6 +53,7 @@ module.exports = { { type: "doc", id: "reference/adapter/dgraph/index" }, { type: "doc", id: "reference/adapter/firebase/index" }, { type: "doc", id: "reference/adapter/prisma/index" }, + { type: "doc", id: "reference/adapter/typeorm/index" }, { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, diff --git a/packages/adapter-typeorm-legacy/logo.png b/packages/adapter-typeorm-legacy/logo.png index 84171053d8b4db44558042745402e2d9da76e623..8f945ef557f368aea2bcf54d0ae9996b29062f5c 100644 GIT binary patch literal 6516 zcmZ8lbyQT{*QObel19>|8$^%>5$O~dazM%wdM1328(HX$M5-#|PV8~(q2YHBLbC&!5}#Kpw{a0vjoN&$cP z-!g>|g=z@-H~h86>EJGW`Dqm;EgOx4Cr1 z0EP!Z8QxV2>@597uA#x!8cvY-Z?O6nsF%9p!C~gF-2d>v!C)5{3&E{_{|i9!j*X4s zezk+|6X19YM@9hB-hq}{urctLS&J4 zzz!_PL6b6WsR4W)0dl0^0R(rS3OwP*wP=EFYtZWe20X!3DrkHMDhohuIqoJou7VCY z(gH&{5GatJpI=l|1o~YoD=R^W7YO$U#jdz-abWrbm@UBZ&;V(2oF4t($}O&gS`qN{ zLGphLbeMn$S>XH(ch#}a4j?83EL4E0642WU=G$?M5THp0)F9v~1T@G3194!X^mi6U zPp%X}ygsNf13l5;TM=%h1uV6J#ReP=5w46Jn3DmSdq9RCc-;domLSmvd`Jc(F#w$n zzNB1@5szP_XC5uAcYth(&NN#0R=ALc^x>*0C%N= zf&!2xSzKHUdY^*|RgkU+Ub}&GckoXXsCNa8ugAy7!DKpkMFw2SfD!}95CkP0;1w%q zRtF9OX=!QTwF29Yc@!uLEAUJUzV0<6M+y?OsAcghs5dS-C9ugcQ z5ss1ocO4(xA_DA$;1eOZK>)1D|F-1;3HVF^pkz1!VsMuT_>uu5GT=@Iit&IlDM%p! z⪼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 literal 27489 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 E1)Y4Z&j0`b diff --git a/packages/adapter-typeorm-legacy/src/index.ts b/packages/adapter-typeorm-legacy/src/index.ts index d2f1cd81..ea33db83 100644 --- a/packages/adapter-typeorm-legacy/src/index.ts +++ b/packages/adapter-typeorm-legacy/src/index.ts @@ -1,3 +1,19 @@ +/** + *

+ *

Official TypeORM adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/typeorm-legacy-adapter typeorm + * ``` + * + * @module @next-auth/typeorm-legacy-adapter + */ import type { Adapter, AdapterUser, @@ -12,7 +28,11 @@ export const entities = defaultEntities export type Entities = typeof entities +/** This is the interface for the TypeORM adapter options. */ export interface TypeORMLegacyAdapterOptions { + /** + * The {@link https://orkhan.gitbook.io/typeorm/docs/entities TypeORM entities} to create the database tables from. + */ entities?: Entities } @@ -43,6 +63,221 @@ export async function getManager(options: { return manager } +/** + * ## Usage + * + * Configure Auth.js to use the TypeORM Adapter: + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" + * + * + * export default NextAuth({ + * adapter: TypeORMLegacyAdapter("yourconnectionstring"), + * ... + * }) + * ``` + * + * `TypeORMLegacyAdapter` takes either a connection string, or a [`ConnectionOptions`](https://github.com/typeorm/typeorm/blob/master/docs/connection-options.md) object as its first parameter. + * + * ## Custom models + * + * The TypeORM adapter uses [`Entity` classes](https://github.com/typeorm/typeorm/blob/master/docs/entities.md) to define the shape of your data. + * + * If you want to override the default entities (for example to add a `role` field to your `UserEntity`), you will have to do the following: + * + * > This schema is adapted for use in TypeORM and based upon our main [schema](/reference/adapters/models) + * + * 1. Create a file containing your modified entities: + * + * (The file below is based on the [default entities](https://github.com/nextauthjs/next-auth/blob/main/packages/adapter-typeorm-legacy/src/entities.ts)) + * + * ```diff title="lib/entities.ts" + * import { + * Entity, + * PrimaryGeneratedColumn, + * Column, + * ManyToOne, + * OneToMany, + * ValueTransformer, + * } from "typeorm" + * + * const transformer: Record<"date" | "bigint", ValueTransformer> = { + * date: { + * from: (date: string | null) => date && new Date(parseInt(date, 10)), + * to: (date?: Date) => date?.valueOf().toString(), + * }, + * bigint: { + * from: (bigInt: string | null) => bigInt && parseInt(bigInt, 10), + * to: (bigInt?: number) => bigInt?.toString(), + * }, + * } + * + * @Entity({ name: "users" }) + * export class UserEntity { + * @PrimaryGeneratedColumn("uuid") + * id!: string + * + * @Column({ type: "varchar", nullable: true }) + * name!: string | null + * + * @Column({ type: "varchar", nullable: true, unique: true }) + * email!: string | null + * + * @Column({ type: "varchar", nullable: true, transformer: transformer.date }) + * emailVerified!: string | null + * + * @Column({ type: "varchar", nullable: true }) + * image!: string | null + * + * + @Column({ type: "varchar", nullable: true }) + * + role!: string | null + * + * @OneToMany(() => SessionEntity, (session) => session.userId) + * sessions!: SessionEntity[] + * + * @OneToMany(() => AccountEntity, (account) => account.userId) + * accounts!: AccountEntity[] + * } + * + * @Entity({ name: "accounts" }) + * export class AccountEntity { + * @PrimaryGeneratedColumn("uuid") + * id!: string + * + * @Column({ type: "uuid" }) + * userId!: string + * + * @Column() + * type!: string + * + * @Column() + * provider!: string + * + * @Column() + * providerAccountId!: string + * + * @Column({ type: "varchar", nullable: true }) + * refresh_token!: string | null + * + * @Column({ type: "varchar", nullable: true }) + * access_token!: string | null + * + * @Column({ + * nullable: true, + * type: "bigint", + * transformer: transformer.bigint, + * }) + * expires_at!: number | null + * + * @Column({ type: "varchar", nullable: true }) + * token_type!: string | null + * + * @Column({ type: "varchar", nullable: true }) + * scope!: string | null + * + * @Column({ type: "varchar", nullable: true }) + * id_token!: string | null + * + * @Column({ type: "varchar", nullable: true }) + * session_state!: string | null + * + * @Column({ type: "varchar", nullable: true }) + * oauth_token_secret!: string | null + * + * @Column({ type: "varchar", nullable: true }) + * oauth_token!: string | null + * + * @ManyToOne(() => UserEntity, (user) => user.accounts, { + * createForeignKeyConstraints: true, + * }) + * user!: UserEntity + * } + * + * @Entity({ name: "sessions" }) + * export class SessionEntity { + * @PrimaryGeneratedColumn("uuid") + * id!: string + * + * @Column({ unique: true }) + * sessionToken!: string + * + * @Column({ type: "uuid" }) + * userId!: string + * + * @Column({ transformer: transformer.date }) + * expires!: string + * + * @ManyToOne(() => UserEntity, (user) => user.sessions) + * user!: UserEntity + * } + * + * @Entity({ name: "verification_tokens" }) + * export class VerificationTokenEntity { + * @PrimaryGeneratedColumn("uuid") + * id!: string + * + * @Column() + * token!: string + * + * @Column() + * identifier!: string + * + * @Column({ transformer: transformer.date }) + * expires!: string + * } + * ``` + * + * 2. Pass them to `TypeORMLegacyAdapter` + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" + * import * as entities from "lib/entities" + * + * export default NextAuth({ + * adapter: TypeORMLegacyAdapter("yourconnectionstring", { entities }), + * ... + * }) + * ``` + * + * :::tip Synchronize your database ♻ + * The `synchronize: true` option in TypeORM will generate SQL that exactly matches the entities. This will automatically apply any changes it finds in the entity model. This is a useful option in development. + * ::: + * + * :::warning Using synchronize in production + * `synchronize: true` should not be enabled against production databases as it may cause data loss if the configured schema does not match the expected schema! We recommend that you synchronize/migrate your production database at build-time. + * ::: + * + * ## Naming Conventions + * + * If mixed snake_case and camelCase column names are an issue for you and/or your underlying database system, we recommend using TypeORM's naming strategy feature to change the target field names. There is a package called `typeorm-naming-strategies` which includes a `snake_case` strategy which will translate the fields from how Auth.js expects them, to snake_case in the actual database. + * + * For example, you can add the naming convention option to the connection object in your NextAuth config. + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" + * import { SnakeNamingStrategy } from 'typeorm-naming-strategies' + * import { ConnectionOptions } from "typeorm" + * + * const connection: ConnectionOptions = { + * type: "mysql", + * host: "localhost", + * port: 3306, + * username: "test", + * password: "test", + * database: "test", + * namingStrategy: new SnakeNamingStrategy() + * } + * + * export default NextAuth({ + * adapter: TypeORMLegacyAdapter(connection), + * ... + * }) + * ``` + */ export function TypeORMLegacyAdapter( dataSource: string | DataSourceOptions, options?: TypeORMLegacyAdapterOptions From b24b02fe71195ef4a61dc6e57620e5bf07d8ae0c Mon Sep 17 00:00:00 2001 From: Lluis Agusti Date: Thu, 9 Mar 2023 12:22:54 +0100 Subject: [PATCH 12/80] docs(mongodb): move content to source (#6901) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(mongodb): move content to source * chore: document options --------- Co-authored-by: Balázs Orbán --- docs/docs/reference/06-adapters/mongodb.md | 64 ---------------- docs/docusaurus.config.js | 7 ++ docs/sidebars.js | 5 +- packages/adapter-mongodb/src/index.ts | 85 +++++++++++++++++++++- 4 files changed, 94 insertions(+), 67 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/mongodb.md diff --git a/docs/docs/reference/06-adapters/mongodb.md b/docs/docs/reference/06-adapters/mongodb.md deleted file mode 100644 index 98afb5ec..00000000 --- a/docs/docs/reference/06-adapters/mongodb.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: mongodb -title: MongoDB ---- - -The MongoDB adapter does not handle connections automatically, so you will have to make sure that you pass the Adapter a `MongoClient` that is connected already. Below you can see an example how to do this. - -## Usage - -1. Install the necessary packages - -```bash npm2yarn2pnpm -npm install next-auth @next-auth/mongodb-adapter mongodb -``` - -2. Add `lib/mongodb.ts` - -```ts -// This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb -import { MongoClient } from "mongodb" - -if (!process.env.MONGODB_URI) { - throw new Error('Invalid/Missing environment variable: "MONGODB_URI"') -} - -const uri = process.env.MONGODB_URI -const options = {} - -let client -let clientPromise: Promise - -if (process.env.NODE_ENV === "development") { - // In development mode, use a global variable so that the value - // is preserved across module reloads caused by HMR (Hot Module Replacement). - if (!global._mongoClientPromise) { - client = new MongoClient(uri, options) - global._mongoClientPromise = client.connect() - } - clientPromise = global._mongoClientPromise -} else { - // In production mode, it's best to not use a global variable. - client = new MongoClient(uri, options) - clientPromise = client.connect() -} - -// Export a module-scoped MongoClient promise. By doing this in a -// separate module, the client can be shared across functions. -export default clientPromise -``` - -3. Add this adapter to your `pages/api/auth/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { MongoDBAdapter } from "@next-auth/mongodb-adapter" -import clientPromise from "../../../lib/mongodb" - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/providers/oauth -export default NextAuth({ - adapter: MongoDBAdapter(clientPromise), - ... -}) -``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index e8afc87b..73329f64 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -284,6 +284,13 @@ const docusaurusConfig = { }, }, ], + [ + "docusaurus-plugin-typedoc", + { + ...typedocConfig, + ...createTypeDocAdapterConfig("MongoDB"), + }, + ], ], } diff --git a/docs/sidebars.js b/docs/sidebars.js index 94956ae2..4dea8fbc 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -50,10 +50,11 @@ module.exports = { label: "Database Adapters", link: { type: "doc", id: "reference/adapters/overview" }, items: [ - { type: "doc", id: "reference/adapter/dgraph/index" }, - { type: "doc", id: "reference/adapter/firebase/index" }, { type: "doc", id: "reference/adapter/prisma/index" }, { type: "doc", id: "reference/adapter/typeorm/index" }, + { type: "doc", id: "reference/adapter/mongodb/index" }, + { type: "doc", id: "reference/adapter/firebase/index" }, + { type: "doc", id: "reference/adapter/dgraph/index" }, { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index a8f8af00..2168e525 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -1,4 +1,19 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/** + *
+ *

Official MongoDB adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/mongodb-adapter mongodb + * ``` + * + * @module @next-auth/mongodb-adapter + */ import { ObjectId } from "mongodb" import type { @@ -10,13 +25,20 @@ import type { } from "next-auth/adapters" import type { MongoClient } from "mongodb" +/** This is the interface of the MongoDB adapter options. */ export interface MongoDBAdapterOptions { + /** + * The name of the {@link https://www.mongodb.com/docs/manual/core/databases-and-collections/#collections MongoDB collections}. + */ collections?: { Users?: string Accounts?: string Sessions?: string VerificationTokens?: string } + /** + * The name you want to give to the MongoDB database + */ databaseName?: string } @@ -66,6 +88,67 @@ export function _id(hex?: string) { return new ObjectId(hex) } +/** + * ## Basic Usage + * + * The MongoDB adapter does not handle connections automatically, so you will have to make sure that you pass the Adapter a `MongoClient` that is connected already. Below you can see an example how to do this. + * + * ### Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/mongodb-adapter mongodb + * ``` + * + * ### Add `lib/mongodb.ts` + * + * ```ts + * // This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb + * import { MongoClient } from "mongodb" + * + * if (!process.env.MONGODB_URI) { + * throw new Error('Invalid/Missing environment variable: "MONGODB_URI"') + * } + * + * const uri = process.env.MONGODB_URI + * const options = {} + * + * let client + * let clientPromise: Promise + * + * if (process.env.NODE_ENV === "development") { + * // In development mode, use a global variable so that the value + * // is preserved across module reloads caused by HMR (Hot Module Replacement). + * if (!global._mongoClientPromise) { + * client = new MongoClient(uri, options) + * global._mongoClientPromise = client.connect() + * } + * clientPromise = global._mongoClientPromise + * } else { + * // In production mode, it's best to not use a global variable. + * client = new MongoClient(uri, options) + * clientPromise = client.connect() + * } + * + * // Export a module-scoped MongoClient promise. By doing this in a + * // separate module, the client can be shared across functions. + * export default clientPromise + * ``` + * + * ### Configure `pages/api/auth/[...nextauth].js` + * + * ```js + * import NextAuth from "next-auth" + * import { MongoDBAdapter } from "@next-auth/mongodb-adapter" + * import clientPromise from "../../../lib/mongodb" + * + * // For more information on each option (and a full list of options) go to + * // https://authjs.dev/reference/providers/oauth + * export default NextAuth({ + * adapter: MongoDBAdapter(clientPromise), + * ... + * }) + * ``` + **/ export function MongoDBAdapter( client: Promise, options: MongoDBAdapterOptions = {} From 1bbd5d51d1260f6a4548c71903e6abb065ae3085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 9 Mar 2023 12:23:53 +0100 Subject: [PATCH 13/80] chore: add adapters as docs dependencies --- docs/package.json | 2 ++ pnpm-lock.yaml | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/docs/package.json b/docs/package.json index dbc6c6a7..94c78824 100644 --- a/docs/package.json +++ b/docs/package.json @@ -21,6 +21,8 @@ "@next-auth/firebase-adapter": "workspace:*", "@next-auth/dgraph-adapter": "workspace:*", "@next-auth/prisma-adapter": "workspace:*", + "@next-auth/mongodb-adapter": "workspace:*", + "@next-auth/typeorm-legacy-adapter": "workspace:*", "@sapphire/docusaurus-plugin-npm2yarn2pnpm": "1.1.4", "classnames": "^2.3.2", "mdx-mermaid": "1.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4171d5c..0aa2b4bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -226,7 +226,9 @@ importers: '@mdx-js/react': 1.6.22 '@next-auth/dgraph-adapter': workspace:* '@next-auth/firebase-adapter': workspace:* + '@next-auth/mongodb-adapter': workspace:* '@next-auth/prisma-adapter': workspace:* + '@next-auth/typeorm-legacy-adapter': workspace:* '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 classnames: ^2.3.2 docusaurus-plugin-typedoc: 1.0.0-next.2 @@ -246,7 +248,9 @@ importers: '@mdx-js/react': 1.6.22_react@18.2.0 '@next-auth/dgraph-adapter': link:../packages/adapter-dgraph '@next-auth/firebase-adapter': link:../packages/adapter-firebase + '@next-auth/mongodb-adapter': link:../packages/adapter-mongodb '@next-auth/prisma-adapter': link:../packages/adapter-prisma + '@next-auth/typeorm-legacy-adapter': link:../packages/adapter-typeorm-legacy '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 classnames: 2.3.2 mdx-mermaid: 1.2.2_mermaid@9.0.1+react@18.2.0 From bce6b00c433b194dde5280135360e009d0d93239 Mon Sep 17 00:00:00 2001 From: Lluis Agusti Date: Thu, 9 Mar 2023 12:33:53 +0100 Subject: [PATCH 14/80] docs(dynamodb): move content to source (#6903) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: wip * chore: done * chore: fix * update lock file --------- Co-authored-by: Balázs Orbán --- docs/docs/reference/06-adapters/dynamodb.md | 145 ------------------- docs/docusaurus.config.js | 7 + docs/package.json | 1 + packages/adapter-dgraph/src/index.ts | 10 +- packages/adapter-dynamodb/src/index.ts | 149 ++++++++++++++++++++ pnpm-lock.yaml | 2 + 6 files changed, 164 insertions(+), 150 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/dynamodb.md diff --git a/docs/docs/reference/06-adapters/dynamodb.md b/docs/docs/reference/06-adapters/dynamodb.md deleted file mode 100644 index 617f3036..00000000 --- a/docs/docs/reference/06-adapters/dynamodb.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -id: dynamodb -title: DynamoDB ---- - -This is the AWS DynamoDB Adapter for `next-auth`. This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. - -By default, the adapter expects a table with a partition key `pk` and a sort key `sk`, as well as a global secondary index named `GSI1` with `GSI1PK` as partition key and `GSI1SK` as sorting key. To automatically delete sessions and verification requests after they expire using [dynamodb TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html) you should [enable the TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html) with attribute name 'expires'. You can set whatever you want as the table name and the billing method. - -You can find the full schema in the table structure section below. - -## Getting Started - -1. Install `next-auth`, `@next-auth/dynamodb-adapter`, `@aws-sdk/client-dynamodb` and `@aws-sdk/lib-dynamodb` - -```bash npm2yarn2pnpm -npm install next-auth @next-auth/dynamodb-adapter @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb -``` - -2. Add this adapter to your `pages/api/auth/[...nextauth].js` next-auth configuration object. - -You need to pass `DynamoDBDocument` client from the modular [`aws-sdk`](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-example-dynamodb-utilities.html) v3 to the adapter. -The default table name is `next-auth`, but you can customise that by passing `{ tableName: 'your-table-name' }` as the second parameter in the adapter. - -```javascript title="pages/api/auth/[...nextauth].js" -import { DynamoDB, DynamoDBClientConfig } from "@aws-sdk/client-dynamodb" -import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb" -import NextAuth from "next-auth"; -import Providers from "next-auth/providers"; -import { DynamoDBAdapter } from "@next-auth/dynamodb-adapter" - -const config: DynamoDBClientConfig = { - credentials: { - accessKeyId: process.env.NEXT_AUTH_AWS_ACCESS_KEY as string, - secretAccessKey: process.env.NEXT_AUTH_AWS_SECRET_KEY as string, - }, - region: process.env.NEXT_AUTH_AWS_REGION, -}; - -const client = DynamoDBDocument.from(new DynamoDB(config), { - marshallOptions: { - convertEmptyValues: true, - removeUndefinedValues: true, - convertClassInstanceToMap: true, - }, -}) - -export default NextAuth({ - // Configure one or more authentication providers - providers: [ - Providers.GitHub({ - clientId: process.env.GITHUB_ID, - clientSecret: process.env.GITHUB_SECRET, - }), - Providers.Email({ - server: process.env.EMAIL_SERVER, - from: process.env.EMAIL_FROM, - }), - // ...add more providers here - ], - adapter: DynamoDBAdapter( - client - ), - ... -}); -``` - -(AWS secrets start with `NEXT_AUTH_` in order to not conflict with [Vercel's reserved environment variables](https://vercel.com/docs/environment-variables#reserved-environment-variables).) - -## Schema - -The table respects the single table design pattern. This has many advantages: - -- Only one table to manage, monitor and provision. -- Querying relations is faster than with multi-table schemas (for eg. retrieving all sessions for a user). -- Only one table needs to be replicated if you want to go multi-region. - -> This schema is adapted for use in DynamoDB and based upon our main [schema](/reference/adapters/models) - -![DynamoDB Table](https://i.imgur.com/hGZtWDq.png) - -You can create this table with infrastructure as code using [`aws-cdk`](https://github.com/aws/aws-cdk) with the following table definition: - -```javascript title=stack.ts -new dynamodb.Table(this, `NextAuthTable`, { - tableName: "next-auth", - partitionKey: { name: "pk", type: dynamodb.AttributeType.STRING }, - sortKey: { name: "sk", type: dynamodb.AttributeType.STRING }, - timeToLiveAttribute: "expires", -}).addGlobalSecondaryIndex({ - indexName: "GSI1", - partitionKey: { name: "GSI1PK", type: dynamodb.AttributeType.STRING }, - sortKey: { name: "GSI1SK", type: dynamodb.AttributeType.STRING }, -}) -``` - -Alternatively, you can use this cloudformation template: - -```yaml title=cloudformation.yaml -NextAuthTable: - Type: "AWS::DynamoDB::Table" - Properties: - TableName: next-auth - AttributeDefinitions: - - AttributeName: pk - AttributeType: S - - AttributeName: sk - AttributeType: S - - AttributeName: GSI1PK - AttributeType: S - - AttributeName: GSI1SK - AttributeType: S - KeySchema: - - AttributeName: pk - KeyType: HASH - - AttributeName: sk - KeyType: RANGE - GlobalSecondaryIndexes: - - IndexName: GSI1 - Projection: - ProjectionType: ALL - KeySchema: - - AttributeName: GSI1PK - KeyType: HASH - - AttributeName: GSI1SK - KeyType: RANGE - TimeToLiveSpecification: - AttributeName: expires - Enabled: true -``` - -## Custom Schema - -You can configure your custom table schema by passing the `options` key to the adapter constructor: - -``` -const adapter = DynamoDBAdapter(client, { - tableName: "custom-table-name", - partitionKey: "custom-pk", - sortKey: "custom-sk", - indexName: "custom-index-name", - indexPartitionKey: "custom-index-pk", - indexSortKey: "custom-index-sk", -}) -``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 73329f64..322e8aef 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -284,6 +284,13 @@ const docusaurusConfig = { }, }, ], + [ + "docusaurus-plugin-typedoc", + { + ...typedocConfig, + ...createTypeDocAdapterConfig("DynamoDB"), + }, + ], [ "docusaurus-plugin-typedoc", { diff --git a/docs/package.json b/docs/package.json index 94c78824..22ee3e6f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -23,6 +23,7 @@ "@next-auth/prisma-adapter": "workspace:*", "@next-auth/mongodb-adapter": "workspace:*", "@next-auth/typeorm-legacy-adapter": "workspace:*", + "@next-auth/dynamodb-adapter": "workspace:*", "@sapphire/docusaurus-plugin-npm2yarn2pnpm": "1.1.4", "classnames": "^2.3.2", "mdx-mermaid": "1.2.2", diff --git a/packages/adapter-dgraph/src/index.ts b/packages/adapter-dgraph/src/index.ts index 62b2c1fb..16f9d6af 100644 --- a/packages/adapter-dgraph/src/index.ts +++ b/packages/adapter-dgraph/src/index.ts @@ -1,18 +1,18 @@ /** *
- *

Official Dgraph adapter for Auth.js / NextAuth.js.

- * - * + *

Official DynamoDB adapter for Auth.js / NextAuth.js.

+ * + * * *
* * ## Installation * * ```bash npm2yarn2pnpm - * npm install next-auth @next-auth/dgraph-adapter + * npm install next-auth @next-auth/dynamodb-adapter @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb * ``` * - * @module @next-auth/dgraph-adapter + * @module @next-auth/dynamodb-adapter */ import { client as dgraphClient } from "./client" import { format } from "./utils" diff --git a/packages/adapter-dynamodb/src/index.ts b/packages/adapter-dynamodb/src/index.ts index b1f64b4d..fd147e57 100644 --- a/packages/adapter-dynamodb/src/index.ts +++ b/packages/adapter-dynamodb/src/index.ts @@ -1,3 +1,19 @@ +/** + *
+ *

Official Dgraph adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/dgraph-adapter + * ``` + * + * @module @next-auth/dgraph-adapter + */ import { v4 as uuid } from "uuid" import type { @@ -21,6 +37,139 @@ export interface DynamoDBAdapterOptions { indexSortKey?: string } +/** + * ## Basic usage + * + * This is the AWS DynamoDB Adapter for `next-auth`. This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. + * By default, the adapter expects a table with a partition key `pk` and a sort key `sk`, as well as a global secondary index named `GSI1` with `GSI1PK` as partition key and `GSI1SK` as sorting key. To automatically delete sessions and verification requests after they expire using [dynamodb TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html) you should [enable the TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html) with attribute name 'expires'. You can set whatever you want as the table name and the billing method. + * You can find the full schema in the table structure section below. + * + * ## Configuring `pages/api/auth/[...nextauth].js` + * + * You need to pass `DynamoDBDocument` client from the modular [`aws-sdk`](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-example-dynamodb-utilities.html) v3 to the adapter. + * The default table name is `next-auth`, but you can customise that by passing `{ tableName: 'your-table-name' }` as the second parameter in the adapter. + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import { DynamoDB, DynamoDBClientConfig } from "@aws-sdk/client-dynamodb" + * import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb" + * import NextAuth from "next-auth"; + * import Providers from "next-auth/providers"; + * import { DynamoDBAdapter } from "@next-auth/dynamodb-adapter" + * + * const config: DynamoDBClientConfig = { + * credentials: { + * accessKeyId: process.env.NEXT_AUTH_AWS_ACCESS_KEY as string, + * secretAccessKey: process.env.NEXT_AUTH_AWS_SECRET_KEY as string, + * }, + * region: process.env.NEXT_AUTH_AWS_REGION, + * }; + * + * const client = DynamoDBDocument.from(new DynamoDB(config), { + * marshallOptions: { + * convertEmptyValues: true, + * removeUndefinedValues: true, + * convertClassInstanceToMap: true, + * }, + * }) + * + * export default NextAuth({ + * // Configure one or more authentication providers + * providers: [ + * Providers.GitHub({ + * clientId: process.env.GITHUB_ID, + * clientSecret: process.env.GITHUB_SECRET, + * }), + * Providers.Email({ + * server: process.env.EMAIL_SERVER, + * from: process.env.EMAIL_FROM, + * }), + * // ...add more providers here + * ], + * adapter: DynamoDBAdapter( + * client + * ), + * ... + * }); + * ``` + * + * (AWS secrets start with `NEXT_AUTH_` in order to not conflict with [Vercel's reserved environment variables](https://vercel.com/docs/environment-variables#reserved-environment-variables).) + * + * ## Schema + * + * The table respects the single table design pattern. This has many advantages: + * + * - Only one table to manage, monitor and provision. + * - Querying relations is faster than with multi-table schemas (for eg. retrieving all sessions for a user). + * - Only one table needs to be replicated if you want to go multi-region. + * + * > This schema is adapted for use in DynamoDB and based upon our main [schema](/reference/adapters/models) + * + * ![DynamoDB Table](https://i.imgur.com/hGZtWDq.png) + * + * You can create this table with infrastructure as code using [`aws-cdk`](https://github.com/aws/aws-cdk) with the following table definition: + * + * ```javascript title=stack.ts + * new dynamodb.Table(this, `NextAuthTable`, { + * tableName: "next-auth", + * partitionKey: { name: "pk", type: dynamodb.AttributeType.STRING }, + * sortKey: { name: "sk", type: dynamodb.AttributeType.STRING }, + * timeToLiveAttribute: "expires", + * }).addGlobalSecondaryIndex({ + * indexName: "GSI1", + * partitionKey: { name: "GSI1PK", type: dynamodb.AttributeType.STRING }, + * sortKey: { name: "GSI1SK", type: dynamodb.AttributeType.STRING }, + * }) + * ``` + * + * Alternatively, you can use this cloudformation template: + * + * ```yaml title=cloudformation.yaml + * NextAuthTable: + * Type: "AWS::DynamoDB::Table" + * Properties: + * TableName: next-auth + * AttributeDefinitions: + * - AttributeName: pk + * AttributeType: S + * - AttributeName: sk + * AttributeType: S + * - AttributeName: GSI1PK + * AttributeType: S + * - AttributeName: GSI1SK + * AttributeType: S + * KeySchema: + * - AttributeName: pk + * KeyType: HASH + * - AttributeName: sk + * KeyType: RANGE + * GlobalSecondaryIndexes: + * - IndexName: GSI1 + * Projection: + * ProjectionType: ALL + * KeySchema: + * - AttributeName: GSI1PK + * KeyType: HASH + * - AttributeName: GSI1SK + * KeyType: RANGE + * TimeToLiveSpecification: + * AttributeName: expires + * Enabled: true + * ``` + * + * ## Configuring your custom schema + * + * You can configure your custom table schema by passing the `options` key to the adapter constructor: + * + * ``` + * const adapter = DynamoDBAdapter(client, { + * tableName: "custom-table-name", + * partitionKey: "custom-pk", + * sortKey: "custom-sk", + * indexName: "custom-index-name", + * indexPartitionKey: "custom-index-pk", + * indexSortKey: "custom-index-sk", + * }) + **/ export function DynamoDBAdapter( client: DynamoDBDocument, options?: DynamoDBAdapterOptions diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0aa2b4bd..9c2419d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,6 +225,7 @@ importers: '@docusaurus/types': 2.2.0 '@mdx-js/react': 1.6.22 '@next-auth/dgraph-adapter': workspace:* + '@next-auth/dynamodb-adapter': workspace:* '@next-auth/firebase-adapter': workspace:* '@next-auth/mongodb-adapter': workspace:* '@next-auth/prisma-adapter': workspace:* @@ -247,6 +248,7 @@ importers: '@auth/sveltekit': link:../packages/frameworks-sveltekit '@mdx-js/react': 1.6.22_react@18.2.0 '@next-auth/dgraph-adapter': link:../packages/adapter-dgraph + '@next-auth/dynamodb-adapter': link:../packages/adapter-dynamodb '@next-auth/firebase-adapter': link:../packages/adapter-firebase '@next-auth/mongodb-adapter': link:../packages/adapter-mongodb '@next-auth/prisma-adapter': link:../packages/adapter-prisma From 7f3b35593f4d58f68eab9073d4d77e2fc36a67c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 10 Mar 2023 10:34:38 +0100 Subject: [PATCH 15/80] chore: tweak turbo config --- docs/package.json | 9 --------- pnpm-lock.yaml | 18 ------------------ turbo.json | 12 +++++++++++- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/docs/package.json b/docs/package.json index 22ee3e6f..53f471a9 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,20 +15,11 @@ "snippets": "node scripts/generate-snippets.mjs" }, "dependencies": { - "@auth/core": "workspace:*", - "@auth/sveltekit": "workspace:*", "@mdx-js/react": "1.6.22", - "@next-auth/firebase-adapter": "workspace:*", - "@next-auth/dgraph-adapter": "workspace:*", - "@next-auth/prisma-adapter": "workspace:*", - "@next-auth/mongodb-adapter": "workspace:*", - "@next-auth/typeorm-legacy-adapter": "workspace:*", - "@next-auth/dynamodb-adapter": "workspace:*", "@sapphire/docusaurus-plugin-npm2yarn2pnpm": "1.1.4", "classnames": "^2.3.2", "mdx-mermaid": "1.2.2", "mermaid": "9.0.1", - "next-auth": "workspace:*", "prism-react-renderer": "1.3.5", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9c2419d9..41a65526 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -215,8 +215,6 @@ importers: docs: specifiers: - '@auth/core': workspace:* - '@auth/sveltekit': workspace:* '@docusaurus/core': 2.2.0 '@docusaurus/eslint-plugin': 2.2.0 '@docusaurus/module-type-aliases': 2.2.0 @@ -224,18 +222,11 @@ importers: '@docusaurus/theme-common': 2.2.0 '@docusaurus/types': 2.2.0 '@mdx-js/react': 1.6.22 - '@next-auth/dgraph-adapter': workspace:* - '@next-auth/dynamodb-adapter': workspace:* - '@next-auth/firebase-adapter': workspace:* - '@next-auth/mongodb-adapter': workspace:* - '@next-auth/prisma-adapter': workspace:* - '@next-auth/typeorm-legacy-adapter': workspace:* '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 classnames: ^2.3.2 docusaurus-plugin-typedoc: 1.0.0-next.2 mdx-mermaid: 1.2.2 mermaid: 9.0.1 - next-auth: workspace:* prism-react-renderer: 1.3.5 react: ^18.2.0 react-dom: ^18.2.0 @@ -244,20 +235,11 @@ importers: typedoc: ^0.23.24 typedoc-plugin-markdown: 4.0.0-next.2 dependencies: - '@auth/core': link:../packages/core - '@auth/sveltekit': link:../packages/frameworks-sveltekit '@mdx-js/react': 1.6.22_react@18.2.0 - '@next-auth/dgraph-adapter': link:../packages/adapter-dgraph - '@next-auth/dynamodb-adapter': link:../packages/adapter-dynamodb - '@next-auth/firebase-adapter': link:../packages/adapter-firebase - '@next-auth/mongodb-adapter': link:../packages/adapter-mongodb - '@next-auth/prisma-adapter': link:../packages/adapter-prisma - '@next-auth/typeorm-legacy-adapter': link:../packages/adapter-typeorm-legacy '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 classnames: 2.3.2 mdx-mermaid: 1.2.2_mermaid@9.0.1+react@18.2.0 mermaid: 9.0.1 - next-auth: link:../packages/next-auth prism-react-renderer: 1.3.5_react@18.2.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 diff --git a/turbo.json b/turbo.json index 67d547f2..898c01a5 100644 --- a/turbo.json +++ b/turbo.json @@ -54,7 +54,17 @@ "cache": false }, "docs#build": { - "dependsOn": ["^build"], + "dependsOn": [ + "@auth/core#build", + "@auth/sveltekit#build", + "@next-auth/firebase-adapter#build", + "@next-auth/dgraph-adapter#build", + "@next-auth/prisma-adapter#build", + "@next-auth/mongodb-adapter#build", + "@next-auth/typeorm-legacy-adapter#build", + "@next-auth/dynamodb-adapter#build", + "next-auth#build" + ], "outputs": [ ".docusaurus/**/*", "build/**/*", From 0e2bbda537c834361693f29d35030ac0c05816bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 10 Mar 2023 10:50:12 +0100 Subject: [PATCH 16/80] docs: remove duplicate API reference --- docs/docs/reference/02-utilities/index.md | 271 ---------------------- docs/docusaurus.config.js | 1 + docs/sidebars.js | 1 - 3 files changed, 1 insertion(+), 272 deletions(-) delete mode 100644 docs/docs/reference/02-utilities/index.md diff --git a/docs/docs/reference/02-utilities/index.md b/docs/docs/reference/02-utilities/index.md deleted file mode 100644 index de69b881..00000000 --- a/docs/docs/reference/02-utilities/index.md +++ /dev/null @@ -1,271 +0,0 @@ ---- -id: client -title: Utilities ---- - -The Auth.js client library makes it easy to interact with sessions from React applications. - -#### Example Session Object - -```ts -{ - user: { - name: string - email: string - image: string - }, - expires: Date // This is the expiry of the session, not any of the tokens within the session -} -``` - -:::tip -The session data returned to the client does not contain sensitive information such as the Session Token or OAuth tokens. It contains a minimal payload that includes enough data needed to display information on a page about the user who is signed in for presentation purposes (e.g name, email, image). - -You can use the [session callback](/reference/configuration/auth-config#callbacks) to customize the session object returned to the client if you need to return additional data in the session object. -::: - -:::note -The `expires` value is rotated, meaning whenever the session is retrieved from the [REST API](/reference/rest-api), this value will be updated as well, to avoid session expiry. -::: - -## getSession() - -- Client Side: **Yes** -- Server Side: **No** (See: [`unstable_getServerSession()`](/reference/nextjs/#unstable_getserversession) - -Auth.js provides a `getSession()` helper which should be called **client side only** to return the current active session. - -On the server side, **this is still available to use**, however, we recommend using `unstable_getServerSession` going forward. The idea behind this is to avoid an additional unnecessary `fetch` call on the server side. For more information, please check out [this issue](https://github.com/nextauthjs/next-auth/issues/1535). - -:::note -The `unstable_getServerSession` only has the prefix `unstable_` at the moment, because the API may change in the future. There are no known bugs at the moment and it is safe to use. If you discover any issues, please do report them as a [GitHub Issue](https://github.com/nextauthjs/next-auth/issues) and we will patch them as soon as possible. -::: - -This helper is helpful in case you want to read the session outside of the context of React. - -When called, `getSession()` will send a request to `/api/auth/session` and returns a promise with a [session object](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/core/types.ts#L407-L425), or `null` if no session exists. - -```js -async function myFunction() { - const session = await getSession() - /* ... */ -} -``` - -Read the tutorial [securing pages and API routes](/guides/basics/securing-pages-and-api-routes) to know how to fetch the session in server side calls using `unstable_getServerSession()`. - ---- - -## getCsrfToken() - -- Client Side: **Yes** -- Server Side: **Yes** - -The `getCsrfToken()` method returns the current Cross Site Request Forgery Token (CSRF Token) required to make POST requests (e.g. for signing in and signing out). - -You likely only need to use this if you are not using the built-in `signIn()` and `signOut()` methods. - -#### Client Side Example - -```js -async function myFunction() { - const csrfToken = await getCsrfToken() - /* ... */ -} -``` - -#### Server Side Example - -```js -import { getCsrfToken } from "next-auth/react" - -export default async (req, res) => { - const csrfToken = await getCsrfToken({ req }) - /* ... */ - res.end() -} -``` - ---- - -## getProviders() - -- Client Side: **Yes** -- Server Side: **Yes** - -The `getProviders()` method returns the list of providers currently configured for sign in. - -It calls `/api/auth/providers` and returns a list of the currently configured authentication providers. - -It can be useful if you are creating a dynamic custom sign in page. - ---- - -#### API Route - -```jsx title="pages/api/example.js" -import { getProviders } from "next-auth/react" - -export default async (req, res) => { - const providers = await getProviders() - console.log("Providers", providers) - res.end() -} -``` - -:::note -Unlike and `getCsrfToken()`, when calling `getProviders()` server side, you don't need to pass anything, just as calling it client side. -::: - ---- - -## signIn() - -- Client Side: **Yes** -- Server Side: No - -Using the `signIn()` method ensures the user ends back on the page they started on after completing a sign in flow. It will also handle CSRF Tokens for you automatically when signing in with email. - -The `signIn()` method can be called from the client in different ways, as shown below. - -### Redirects to sign in page when clicked - -```js -import { signIn } from "next-auth/react" - -export default () => -``` - -### Starts OAuth sign-in flow when clicked - -By default, when calling the `signIn()` method with no arguments, you will be redirected to the Auth.js sign-in page. If you want to skip that and get redirected to your provider's page immediately, call the `signIn()` method with the provider's `id`. - -For example to sign in with Google: - -```js -import { signIn } from "next-auth/react" - -export default () => ( - -) -``` - -### Starts Email sign-in flow when clicked - -When using it with the email flow, pass the target `email` as an option. - -```js -import { signIn } from "next-auth/react" - -export default ({ email }) => ( - -) -``` - -### Specifying a `callbackUrl` - -The `callbackUrl` specifies to which URL the user will be redirected after signing in. Defaults to the page URL the sign-in is initiated from. - -You can specify a different `callbackUrl` by specifying it as the second argument of `signIn()`. This works for all providers. - -e.g. - -- `signIn(undefined, { callbackUrl: '/foo' })` -- `signIn('google', { callbackUrl: 'http://localhost:3000/bar' })` -- `signIn('email', { email, callbackUrl: 'http://localhost:3000/foo' })` - -The URL must be considered valid by the [redirect callback handler](/reference/configuration/auth-config#callbacks). By default it requires the URL to be an absolute URL at the same host name, or a relative url starting with a slash. If it does not match it will redirect to the homepage. You can define your own [redirect callback](/guides/basics/callbacks#redirect-callback) to allow other URLs. - -### Using the `redirect: false` option - -:::note -The redirect option is only available for `credentials` and `email` providers. -::: - -In some cases, you might want to deal with the sign in response on the same page and disable the default redirection. For example, if an error occurs (like wrong credentials given by the user), you might want to handle the error on the same page. For that, you can pass `redirect: false` in the second parameter object. - -e.g. - -- `signIn('credentials', { redirect: false, password: 'password' })` -- `signIn('email', { redirect: false, email: 'bill@fillmurray.com' })` - -`signIn` will then return a Promise, that resolves to the following: - -```ts -{ - /** - * Will be different error codes, - * depending on the type of error. - */ - error: string | undefined - /** - * HTTP status code, - * hints the kind of error that happened. - */ - status: number - /** - * `true` if the signin was successful - */ - ok: boolean - /** - * `null` if there was an error, - * otherwise the url the user - * should have been redirected to. - */ - url: string | null -} -``` - -### Additional parameters - -It is also possible to pass additional parameters to the `/authorize` endpoint through the third argument of `signIn()`. - -See the [Authorization Request OIDC spec](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest) for some ideas. (These are not the only possible ones, all parameters will be forwarded) - -e.g. - -- `signIn("identity-server4", null, { prompt: "login" })` _always ask the user to re-authenticate_ -- `signIn("auth0", null, { login_hint: "info@example.com" })` _hints the e-mail address to the provider_ - -:::note -You can also set these parameters through [`provider.authorizationParams`](/reference/providers/oauth). -::: - -:::note -The following parameters are always overridden server-side: `redirect_uri`, `state` -::: - ---- - -## signOut() - -- Client Side: **Yes** -- Server Side: No - -In order to logout, use the `signOut()` method to ensure the user ends back on the page they started on after completing the sign out flow. It also handles CSRF tokens for you automatically. - -It reloads the page in the browser when complete. - -```js -import { signOut } from "next-auth/react" - -export default () => -``` - -### Specifying a `callbackUrl` - -As with the `signIn()` function, you can specify a `callbackUrl` parameter by passing it as an option. - -e.g. `signOut({ callbackUrl: 'http://localhost:3000/foo' })` - -The URL must be considered valid by the [redirect callback handler](/guides/basics/callbacks#redirect-callback). By default, it requires the URL to be an absolute URL at the same host name, or you can also supply a relative URL starting with a slash. If it does not match it will redirect to the homepage. You can define your own [redirect callback](/guides/basics/callbacks#redirect-callback) to allow other URLs. - -### Using the `redirect: false` option - -If you pass `redirect: false` to `signOut`, the page will not reload. The session will be deleted, and the `useSession` hook is notified, so any indication about the user will be shown as logged out automatically. It can give a very nice experience for the user. - -:::tip -If you need to redirect to another page but you want to avoid a page reload, you can try: -`const data = await signOut({redirect: false, callbackUrl: "/foo"})` -where `data.url` is the validated URL you can redirect the user to without any flicker by using Next.js's `useRouter().push(data.url)` -::: diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 322e8aef..06f24c1f 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -11,6 +11,7 @@ const providers = fs .map((p) => `${coreSrc}/providers/${p}`) const typedocConfig = require("./typedoc.json") +// @ts-expect-error delete typedocConfig.$schema /** diff --git a/docs/sidebars.js b/docs/sidebars.js index 4dea8fbc..68fc57ba 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -58,7 +58,6 @@ module.exports = { { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, - "reference/utilities/client", "reference/warnings", ], conceptsSidebar: [ From 527c25b128d11de54f79f35f72a3b69f6a4976c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 10 Mar 2023 10:56:09 +0100 Subject: [PATCH 17/80] chore: add clean script to dynamodb adapter --- packages/adapter-dynamodb/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/adapter-dynamodb/package.json b/packages/adapter-dynamodb/package.json index 8bc076a4..02f0bf1f 100644 --- a/packages/adapter-dynamodb/package.json +++ b/packages/adapter-dynamodb/package.json @@ -29,7 +29,8 @@ "test:default": "jest", "test:custom": "CUSTOM_MODEL=1 jest", "test": "pnpm test:default && pnpm test:custom", - "build": "tsc" + "clean": "rm index.*", + "build": "pnpm clean && tsc" }, "files": [ "README.md", @@ -58,4 +59,4 @@ "dependencies": { "uuid": "^9.0.0" } -} \ No newline at end of file +} From 997e595b5b2e4036148b5153047af71730f09897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81bris=20Simon?= Date: Fri, 10 Mar 2023 17:41:00 +0100 Subject: [PATCH 18/80] fix(docs:) simplify authorization example (#6910) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * simplify authorization example for sveltekit * Apply suggestions from code review --------- Co-authored-by: Balázs Orbán --- packages/frameworks-sveltekit/src/lib/index.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/frameworks-sveltekit/src/lib/index.ts b/packages/frameworks-sveltekit/src/lib/index.ts index 9f088286..45e4d973 100644 --- a/packages/frameworks-sveltekit/src/lib/index.ts +++ b/packages/frameworks-sveltekit/src/lib/index.ts @@ -165,10 +165,7 @@ * } * * // If the request is still here, just proceed as normally - * const result = await resolve(event, { - * transformPageChunk: ({ html }) => html - * }); - * return result; + * return resolve(event); * } * * // First handle authentication, then authorization From b278975c3fd71810c42d3fe024922c122b91aa1e Mon Sep 17 00:00:00 2001 From: Jonas Strassel Date: Tue, 14 Mar 2023 13:29:18 +0100 Subject: [PATCH 19/80] chore(ci): disable node cache to speed up ci (#6939) --- .github/workflows/issue-validator.yml | 2 +- .github/workflows/release.yml | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/issue-validator.yml b/.github/workflows/issue-validator.yml index d6d05c75..25272a35 100644 --- a/.github/workflows/issue-validator.yml +++ b/.github/workflows/issue-validator.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: "Run issue validator" + - name: Run issue validator run: node /home/runner/work/next-auth/next-auth/.github/actions/issue-validator/index.mjs env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 919e9390..ea43448a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,10 +3,10 @@ name: Release on: push: branches: - - "main" - - "beta" - - "next" - - "3.x" + - main + - beta + - next + - 3.x pull_request: jobs: @@ -24,7 +24,6 @@ jobs: uses: actions/setup-node@v3 with: node-version: 18 - cache: "pnpm" - name: Install dependencies run: pnpm install - name: Run tests @@ -74,7 +73,6 @@ jobs: uses: actions/setup-node@v3 with: node-version: 18 - cache: "pnpm" - name: Install dependencies run: pnpm install - name: Publish to npm and GitHub @@ -99,7 +97,6 @@ jobs: uses: actions/setup-node@v3 with: node-version: 18 - cache: "pnpm" - name: Install dependencies run: pnpm install - name: Determine version From 42d5899efdb9c32f9a85d16ba6c6bc8a36366ab5 Mon Sep 17 00:00:00 2001 From: Jonas Strassel Date: Tue, 14 Mar 2023 13:31:01 +0100 Subject: [PATCH 20/80] fix(adapters): allow `mongodb@5` as peer dependency (#6938) --- packages/adapter-mongodb/package.json | 4 +- pnpm-lock.yaml | 1425 ++++++++++++------------- 2 files changed, 658 insertions(+), 771 deletions(-) diff --git a/packages/adapter-mongodb/package.json b/packages/adapter-mongodb/package.json index ba8ea7f3..84b8f93a 100644 --- a/packages/adapter-mongodb/package.json +++ b/packages/adapter-mongodb/package.json @@ -31,14 +31,14 @@ "dist" ], "peerDependencies": { - "mongodb": "^4.1.1", + "mongodb": "^5 | ^4", "next-auth": "^4" }, "devDependencies": { "@next-auth/adapter-test": "workspace:*", "@next-auth/tsconfig": "workspace:*", "jest": "^27.4.3", - "mongodb": "^4.4.0", + "mongodb": "^5.1.0", "next-auth": "workspace:*" }, "jest": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41a65526..17f94f95 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,57 +105,6 @@ importers: sqlite3: 5.0.8 typeorm: 0.3.7_pg@8.7.3+sqlite3@5.0.8 - apps/dev/nextjs-2: - specifiers: - '@auth/core': workspace:* - '@next-auth/fauna-adapter': workspace:* - '@next-auth/prisma-adapter': workspace:* - '@next-auth/supabase-adapter': workspace:* - '@next-auth/typeorm-legacy-adapter': workspace:* - '@playwright/test': 1.29.2 - '@prisma/client': ^3 - '@supabase/supabase-js': ^2.0.5 - '@types/jsonwebtoken': ^8.5.5 - '@types/react': ^18.0.15 - '@types/react-dom': ^18.0.6 - dotenv: ^16.0.3 - fake-smtp-server: ^0.8.0 - faunadb: ^4 - next: 13.1.1 - next-auth: workspace:* - nodemailer: ^6 - pg: ^8.7.3 - prisma: ^3 - react: ^18 - react-dom: ^18 - sqlite3: ^5.0.8 - typeorm: 0.3.7 - dependencies: - '@auth/core': link:../../../packages/core - '@next-auth/fauna-adapter': link:../../../packages/adapter-fauna - '@next-auth/prisma-adapter': link:../../../packages/adapter-prisma - '@next-auth/supabase-adapter': link:../../../packages/adapter-supabase - '@next-auth/typeorm-legacy-adapter': link:../../../packages/adapter-typeorm-legacy - '@prisma/client': 3.15.2_prisma@3.15.2 - '@supabase/supabase-js': 2.0.5 - faunadb: 4.6.0 - next: 13.1.1_biqbaboplfbrettd7655fr4n2y - next-auth: link:../../../packages/next-auth - nodemailer: 6.8.0 - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - devDependencies: - '@playwright/test': 1.29.2 - '@types/jsonwebtoken': 8.5.9 - '@types/react': 18.0.26 - '@types/react-dom': 18.0.6 - dotenv: 16.0.3 - fake-smtp-server: 0.8.0 - pg: 8.7.3 - prisma: 3.15.2 - sqlite3: 5.0.8 - typeorm: 0.3.7_pg@8.7.3+sqlite3@5.0.8 - apps/dev/sveltekit: specifiers: '@auth/core': workspace:* @@ -362,13 +311,13 @@ importers: '@next-auth/adapter-test': workspace:* '@next-auth/tsconfig': workspace:* jest: ^27.4.3 - mongodb: ^4.4.0 + mongodb: ^5.1.0 next-auth: workspace:* devDependencies: '@next-auth/adapter-test': link:../adapter-test '@next-auth/tsconfig': link:../tsconfig jest: 27.5.1 - mongodb: 4.7.0 + mongodb: 5.1.0 next-auth: link:../next-auth packages/adapter-neo4j: @@ -1987,29 +1936,12 @@ packages: jsesc: 2.5.2 dev: true - /@babel/generator/7.20.7: - resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: false - /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 - /@babel/helper-builder-binary-assignment-operator-visitor/7.16.7: - resolution: {integrity: sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-explode-assignable-expression': 7.16.7 - '@babel/types': 7.20.7 - dev: true - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} @@ -2166,46 +2098,25 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.17.12: - resolution: {integrity: sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==} + /@babel/helper-create-regexp-features-plugin/7.19.0: + resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.0.1 + regexpu-core: 5.2.1 dev: true - /@babel/helper-create-regexp-features-plugin/7.17.12_@babel+core@7.18.5: - resolution: {integrity: sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==} + /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.18.5: + resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.18.5 '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.0.1 - dev: true - - /@babel/helper-create-regexp-features-plugin/7.17.12_@babel+core@7.20.12: - resolution: {integrity: sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.12 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.0.1 - - /@babel/helper-create-regexp-features-plugin/7.17.12_@babel+core@7.20.2: - resolution: {integrity: sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.0.1 + regexpu-core: 5.2.1 dev: true /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.20.12: @@ -2229,15 +2140,13 @@ packages: regexpu-core: 5.2.1 dev: true - /@babel/helper-define-polyfill-provider/0.3.1: - resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} + /@babel/helper-define-polyfill-provider/0.3.3: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/helper-compilation-targets': 7.20.7 - '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/traverse': 7.20.13 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.1 @@ -2246,16 +2155,14 @@ packages: - supports-color dev: true - /@babel/helper-define-polyfill-provider/0.3.1_@babel+core@7.18.5: - resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.18.5: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.18.5 '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.18.5 - '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/traverse': 7.20.13 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.1 @@ -2299,13 +2206,6 @@ packages: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} - /@babel/helper-explode-assignable-expression/7.16.7: - resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - dev: true - /@babel/helper-explode-assignable-expression/7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} @@ -2401,12 +2301,30 @@ packages: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator/7.16.8: - resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} + /@babel/helper-remap-async-to-generator/7.18.9: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-wrap-function': 7.16.8 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.19.0 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.18.5: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.18.5 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.19.0 '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -2489,18 +2407,6 @@ packages: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function/7.16.8: - resolution: {integrity: sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.19.0 - '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-wrap-function/7.19.0: resolution: {integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==} engines: {node: '>=6.9.0'} @@ -2556,14 +2462,6 @@ packages: dependencies: '@babel/types': 7.20.7 - /@babel/parser/7.20.7: - resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.20.7 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.17.12: resolution: {integrity: sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==} engines: {node: '>=6.9.0'} @@ -2655,7 +2553,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.16.8 + '@babel/helper-remap-async-to-generator': 7.18.9 '@babel/plugin-syntax-async-generators': 7.8.4 transitivePeerDependencies: - supports-color @@ -2669,7 +2567,7 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.16.8 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.5 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.5 transitivePeerDependencies: - supports-color @@ -3081,7 +2979,7 @@ packages: '@babel/helper-compilation-targets': 7.20.7 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-object-rest-spread': 7.8.3 - '@babel/plugin-transform-parameters': 7.17.12 + '@babel/plugin-transform-parameters': 7.20.3 dev: true /@babel/plugin-proposal-object-rest-spread/7.18.0_@babel+core@7.18.5: @@ -3095,7 +2993,7 @@ packages: '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.5 - '@babel/plugin-transform-parameters': 7.17.12_@babel+core@7.18.5 + '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.18.5 dev: true /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.20.12: @@ -3350,7 +3248,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.17.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -3361,28 +3259,28 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.5 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.18.5 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-proposal-unicode-property-regex/7.17.12_@babel+core@7.20.12: - resolution: {integrity: sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==} + /@babel/plugin-proposal-unicode-property-regex/7.18.6: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 + dev: true - /@babel/plugin-proposal-unicode-property-regex/7.17.12_@babel+core@7.20.2: - resolution: {integrity: sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==} + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.18.5: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.20.2 + '@babel/core': 7.18.5 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -4008,8 +3906,8 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.17.12_@babel+core@7.18.5: - resolution: {integrity: sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==} + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.18.5: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4083,7 +3981,7 @@ packages: dependencies: '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.16.8 + '@babel/helper-remap-async-to-generator': 7.18.9 transitivePeerDependencies: - supports-color dev: true @@ -4097,7 +3995,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.16.8 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.5 transitivePeerDependencies: - supports-color dev: true @@ -4363,7 +4261,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.17.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -4374,28 +4272,28 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.5 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.18.5 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.20.12: - resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + /@babel/plugin-transform-dotall-regex/7.18.6: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.12 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 + dev: true - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.20.2: - resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.18.5: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.20.2 + '@babel/core': 7.18.5 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -4464,7 +4362,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -4475,7 +4373,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.5 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -4895,7 +4793,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.17.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -4906,7 +4804,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.18.5 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.18.5 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -5038,6 +4936,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-parameters/7.20.3: + resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.12.9: resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} @@ -5048,6 +4955,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.18.5: + resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.5 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.20.12: resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} @@ -5610,7 +5527,7 @@ packages: '@babel/core': 7.18.5 '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-typescript': 7.17.12_@babel+core@7.18.5 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.18.5 transitivePeerDependencies: - supports-color dev: true @@ -5686,7 +5603,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.17.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -5697,7 +5614,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.5 - '@babel/helper-create-regexp-features-plugin': 7.17.12_@babel+core@7.18.5 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.5 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -6070,8 +5987,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.17.12 - '@babel/plugin-transform-dotall-regex': 7.16.7 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6 + '@babel/plugin-transform-dotall-regex': 7.18.6 '@babel/types': 7.20.7 esutils: 2.0.3 dev: true @@ -6083,8 +6000,8 @@ packages: dependencies: '@babel/core': 7.18.5 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.17.12_@babel+core@7.18.5 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.18.5 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.5 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.5 '@babel/types': 7.20.7 esutils: 2.0.3 dev: true @@ -6096,8 +6013,8 @@ packages: dependencies: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.17.12_@babel+core@7.20.12 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.20.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 '@babel/types': 7.20.7 esutils: 2.0.3 @@ -6108,8 +6025,8 @@ packages: dependencies: '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.17.12_@babel+core@7.20.2 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2 '@babel/types': 7.20.7 esutils: 2.0.3 dev: true @@ -6306,12 +6223,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.7 + '@babel/generator': 7.20.14 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.7 + '@babel/parser': 7.20.15 '@babel/types': 7.20.7 debug: 4.3.4_supports-color@5.5.0 globals: 11.12.0 @@ -6526,9 +6443,9 @@ packages: resolution: {integrity: sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg==} engines: {node: '>=16.14'} dependencies: - cssnano-preset-advanced: 5.3.8_postcss@8.4.21 - postcss: 8.4.21 - postcss-sort-media-queries: 4.2.1_postcss@8.4.21 + cssnano-preset-advanced: 5.3.8_postcss@8.4.19 + postcss: 8.4.19 + postcss-sort-media-queries: 4.2.1_postcss@8.4.19 tslib: 2.4.1 dev: true @@ -6635,7 +6552,7 @@ packages: tslib: 2.4.1 unist-util-visit: 2.0.3 utility-types: 3.10.0 - webpack: 5.73.0 + webpack: 5.75.0 transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -6676,7 +6593,7 @@ packages: react-dom: 18.2.0_react@18.2.0 tslib: 2.4.1 utility-types: 3.10.0 - webpack: 5.73.0 + webpack: 5.75.0 transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -6709,7 +6626,7 @@ packages: react: 18.2.0 react-dom: 18.2.0_react@18.2.0 tslib: 2.4.1 - webpack: 5.73.0 + webpack: 5.75.0 transitivePeerDependencies: - '@parcel/css' - '@swc/core' @@ -6926,7 +6843,7 @@ packages: infima: 0.2.0-alpha.42 lodash: 4.17.21 nprogress: 0.2.0 - postcss: 8.4.21 + postcss: 8.4.19 prism-react-renderer: 1.3.5_react@18.2.0 prismjs: 1.28.0 react: 18.2.0 @@ -7931,7 +7848,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@grpc/proto-loader/0.7.3: @@ -8027,7 +7944,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -8039,7 +7956,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 jest-message-util: 28.1.1 jest-util: 28.1.3 @@ -8051,7 +7968,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.2.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 jest-message-util: 29.2.1 jest-util: 29.2.1 @@ -8063,7 +7980,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 jest-message-util: 29.3.1 jest-util: 29.3.1 @@ -8084,7 +8001,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -8129,14 +8046,14 @@ packages: '@jest/test-result': 28.1.1 '@jest/transform': 28.1.1 '@jest/types': 28.1.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 28.0.2 - jest-config: 28.1.1_@types+node@18.11.10 + jest-config: 28.1.1_@types+node@17.0.45 jest-haste-map: 28.1.1 jest-message-util: 28.1.1 jest-regex-util: 28.0.2 @@ -8172,14 +8089,14 @@ packages: '@jest/test-result': 29.2.1 '@jest/transform': 29.3.0 '@jest/types': 29.2.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.2.0 - jest-config: 29.3.0_@types+node@18.11.10 + jest-config: 29.3.0_@types+node@17.0.45 jest-haste-map: 29.3.0 jest-message-util: 29.2.1 jest-regex-util: 29.2.0 @@ -8214,14 +8131,14 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.7.0 exit: 0.1.2 graceful-fs: 4.2.10 jest-changed-files: 29.2.0 - jest-config: 29.3.1_@types+node@18.11.10 + jest-config: 29.3.1_@types+node@17.0.45 jest-haste-map: 29.3.1 jest-message-util: 29.3.1 jest-regex-util: 29.2.0 @@ -8255,7 +8172,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 27.5.1 dev: true @@ -8265,7 +8182,7 @@ packages: dependencies: '@jest/fake-timers': 28.1.1 '@jest/types': 28.1.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 28.1.1 dev: true @@ -8275,7 +8192,7 @@ packages: dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 28.1.3 dev: true @@ -8285,7 +8202,7 @@ packages: dependencies: '@jest/fake-timers': 29.3.0 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 29.3.0 dev: true @@ -8295,7 +8212,7 @@ packages: dependencies: '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 29.3.1 dev: true @@ -8356,7 +8273,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -8368,7 +8285,7 @@ packages: dependencies: '@jest/types': 28.1.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-message-util: 28.1.1 jest-mock: 28.1.1 jest-util: 28.1.1 @@ -8380,7 +8297,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -8392,7 +8309,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-message-util: 29.3.1 jest-mock: 29.3.0 jest-util: 29.3.1 @@ -8404,7 +8321,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-message-util: 29.3.1 jest-mock: 29.3.1 jest-util: 29.3.1 @@ -8468,7 +8385,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -8507,7 +8424,7 @@ packages: '@jest/transform': 28.1.1 '@jest/types': 28.1.3 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -8545,7 +8462,7 @@ packages: '@jest/transform': 29.3.0 '@jest/types': 29.2.1 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -8582,7 +8499,7 @@ packages: '@jest/transform': 29.3.1 '@jest/types': 29.3.1 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -8832,7 +8749,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/yargs': 15.0.14 chalk: 4.1.2 dev: true @@ -8843,7 +8760,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -8855,7 +8772,7 @@ packages: '@jest/schemas': 28.0.2 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -8867,7 +8784,7 @@ packages: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -8879,7 +8796,7 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -8891,7 +8808,7 @@ packages: '@jest/schemas': 29.0.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/yargs': 17.0.10 chalk: 4.1.2 dev: true @@ -9650,9 +9567,9 @@ packages: '@rollup/plugin-replace': 5.0.2_rollup@2.79.1 '@vitejs/plugin-vue': 3.2.0_vite@3.2.5+vue@3.2.45 '@vitejs/plugin-vue-jsx': 2.1.1_vite@3.2.5+vue@3.2.45 - autoprefixer: 10.4.13_postcss@8.4.21 + autoprefixer: 10.4.13_postcss@8.4.19 chokidar: 3.5.3 - cssnano: 5.1.14_postcss@8.4.21 + cssnano: 5.1.14_postcss@8.4.19 defu: 6.1.1 esbuild: 0.15.16 escape-string-regexp: 5.0.0 @@ -9668,9 +9585,9 @@ packages: pathe: 1.0.0 perfect-debounce: 0.1.3 pkg-types: 1.0.1 - postcss: 8.4.21 - postcss-import: 15.1.0_postcss@8.4.21 - postcss-url: 10.1.3_postcss@8.4.21 + postcss: 8.4.19 + postcss-import: 15.1.0_postcss@8.4.19 + postcss-url: 10.1.3_postcss@8.4.19 rollup: 2.79.1 rollup-plugin-visualizer: 5.9.0_rollup@2.79.1 ufo: 1.0.1 @@ -11120,13 +11037,13 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/cacheable-request/6.0.3: @@ -11134,7 +11051,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/responselike': 1.0.0 dev: false @@ -11160,13 +11077,13 @@ packages: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.29 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/cookie/0.4.1: @@ -11179,7 +11096,7 @@ packages: /@types/cors/2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: false /@types/debug/0.0.30: @@ -11199,7 +11116,7 @@ packages: /@types/duplexify/3.6.1: resolution: {integrity: sha512-n0zoEj/fMdMOvqbHxmqnza/kXyoGgJmEpsXjpP+gEqE1Ye4yNqc7xWipKnUoMpWhMuzJQSfK2gMrwlElly7OGQ==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/eslint-scope/3.7.3: @@ -11230,7 +11147,7 @@ packages: /@types/express-serve-static-core/4.17.29: resolution: {integrity: sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -11238,7 +11155,7 @@ packages: /@types/express-serve-static-core/4.17.31: resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -11264,7 +11181,7 @@ packages: /@types/fs-extra/8.1.2: resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/get-port/3.2.0: @@ -11275,19 +11192,19 @@ packages: resolution: {integrity: sha512-ATA/xrS7CZ3A2WCPVY4eKdNpybq56zqlTirnHhhyOztZM/lPxJzusOBI3BsaXbu6FrUluqzvMlI4sZ6BDYMlMg==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: false /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 18.11.10 + '@types/node': 17.0.45 /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/hast/2.3.4: @@ -11311,7 +11228,7 @@ packages: /@types/http-proxy/1.17.9: resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 /@types/istanbul-lib-coverage/2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} @@ -11354,7 +11271,7 @@ packages: /@types/jsdom/16.2.14: resolution: {integrity: sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/parse5': 6.0.3 '@types/tough-cookie': 4.0.2 dev: true @@ -11374,13 +11291,13 @@ packages: /@types/jsonwebtoken/8.5.9: resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 /@types/linkify-it/3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -11430,7 +11347,7 @@ packages: /@types/mkdirp/0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: false /@types/ms/0.7.31: @@ -11449,7 +11366,6 @@ packages: /@types/node/17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - dev: true /@types/node/18.11.10: resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} @@ -11699,7 +11615,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 /@types/retry/0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -11709,19 +11625,19 @@ packages: resolution: {integrity: sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==} dependencies: '@types/glob': 7.2.0 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: false /@types/sass/1.43.1: resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/sax/1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/scheduler/0.16.2: @@ -11741,33 +11657,33 @@ packages: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/set-cookie-parser/2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/sharp/0.31.1: resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==} requiresBuild: true dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: false /@types/shelljs/0.8.11: resolution: {integrity: sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw==} dependencies: '@types/glob': 7.2.0 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/stack-utils/2.0.1: @@ -11777,7 +11693,7 @@ packages: /@types/stoppable/1.1.1: resolution: {integrity: sha512-b8N+fCADRIYYrGZOcmOR8ZNBOqhktWTB/bMUl5LvGtT201QKJZOOH5UsFyI3qtteM6ZAJbJqZoBcLqqxKIwjhw==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/testing-library__jest-dom/5.14.5: @@ -11797,7 +11713,7 @@ packages: /@types/tunnel/0.0.3: resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/unist/2.0.6: @@ -11822,14 +11738,14 @@ packages: /@types/whatwg-url/8.2.2: resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 '@types/webidl-conversions': 6.1.1 dev: true /@types/ws/8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /@types/yargs-parser/21.0.0: @@ -12317,7 +12233,7 @@ packages: /@vercel/node/1.12.1: resolution: {integrity: sha512-NcawIY05BvVkWlsowaxF2hl/hJg475U8JvT2FnGykFPMx31q1/FtqyTw/awSrKfOSRXR0InrbEIDIelmS9NzPA==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 ts-node: 8.9.1_typescript@4.3.4 typescript: 4.3.4 dev: true @@ -12411,7 +12327,7 @@ packages: '@vue/shared': 3.2.45 estree-walker: 2.0.2 magic-string: 0.25.9 - postcss: 8.4.21 + postcss: 8.4.19 source-map: 0.6.1 dev: true @@ -13266,6 +13182,7 @@ packages: picocolors: 1.0.0 postcss: 8.4.21 postcss-value-parser: 4.2.0 + dev: false /autoprefixer/10.4.7_postcss@8.4.14: resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} @@ -13303,7 +13220,7 @@ packages: /axios/0.21.4_debug@4.3.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 transitivePeerDependencies: - debug @@ -13547,7 +13464,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.10 - '@babel/helper-define-polyfill-provider': 0.3.1 + '@babel/helper-define-polyfill-provider': 0.3.3 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -13560,7 +13477,7 @@ packages: dependencies: '@babel/compat-data': 7.20.10 '@babel/core': 7.18.5 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.5 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.5 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -13596,7 +13513,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-define-polyfill-provider': 0.3.1 + '@babel/helper-define-polyfill-provider': 0.3.3 core-js-compat: 3.26.0 transitivePeerDependencies: - supports-color @@ -13608,7 +13525,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.5 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.5 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.5 core-js-compat: 3.26.0 transitivePeerDependencies: - supports-color @@ -13642,7 +13559,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-define-polyfill-provider': 0.3.1 + '@babel/helper-define-polyfill-provider': 0.3.3 transitivePeerDependencies: - supports-color dev: true @@ -13653,7 +13570,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.18.5 - '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.18.5 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.5 transitivePeerDependencies: - supports-color dev: true @@ -14112,6 +14029,11 @@ packages: buffer: 5.7.1 dev: true + /bson/5.0.1: + resolution: {integrity: sha512-y09gBGusgHtinMon/GVbv1J6FrXhnr/+6hqLlSmEFzkz6PodqF6TxjyvfvY3AfO+oG1mgUtbC86xSbOlwvM62Q==} + engines: {node: '>=14.20.1'} + dev: true + /btoa-lite/1.0.0: resolution: {integrity: sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==} @@ -14602,10 +14524,6 @@ packages: /ci-info/2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - /ci-info/3.3.2: - resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==} - dev: true - /ci-info/3.7.0: resolution: {integrity: sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==} engines: {node: '>=8'} @@ -15287,6 +15205,14 @@ packages: postcss: 8.4.14 dev: true + /css-declaration-sorter/6.3.1_postcss@8.4.19: + resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.19 + /css-declaration-sorter/6.3.1_postcss@8.4.20: resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} engines: {node: ^10 || ^12 || >=14} @@ -15296,27 +15222,19 @@ packages: postcss: 8.4.20 dev: true - /css-declaration-sorter/6.3.1_postcss@8.4.21: - resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 - dependencies: - postcss: 8.4.21 - /css-loader/5.2.7_webpack@5.75.0: resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} engines: {node: '>= 10.13.0'} peerDependencies: webpack: ^4.27.0 || ^5.0.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.21 + icss-utils: 5.1.0_postcss@8.4.19 loader-utils: 2.0.4 - postcss: 8.4.21 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.21 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.21 - postcss-modules-scope: 3.0.0_postcss@8.4.21 - postcss-modules-values: 4.0.0_postcss@8.4.21 + postcss: 8.4.19 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.19 + postcss-modules-local-by-default: 4.0.0_postcss@8.4.19 + postcss-modules-scope: 3.0.0_postcss@8.4.19 + postcss-modules-values: 4.0.0_postcss@8.4.19 postcss-value-parser: 4.2.0 schema-utils: 3.1.1 semver: 7.3.8 @@ -15329,12 +15247,12 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.21 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.21 - postcss-modules-scope: 3.0.0_postcss@8.4.21 - postcss-modules-values: 4.0.0_postcss@8.4.21 + icss-utils: 5.1.0_postcss@8.4.19 + postcss: 8.4.19 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.19 + postcss-modules-local-by-default: 4.0.0_postcss@8.4.19 + postcss-modules-scope: 3.0.0_postcss@8.4.19 + postcss-modules-values: 4.0.0_postcss@8.4.19 postcss-value-parser: 4.2.0 semver: 7.3.8 webpack: 5.73.0 @@ -15353,10 +15271,10 @@ packages: csso: optional: true dependencies: - cssnano: 5.1.14_postcss@8.4.21 + cssnano: 5.1.14_postcss@8.4.19 jest-worker: 26.6.2 p-limit: 3.1.0 - postcss: 8.4.21 + postcss: 8.4.19 schema-utils: 3.1.1 serialize-javascript: 5.0.1 source-map: 0.6.1 @@ -15383,9 +15301,9 @@ packages: optional: true dependencies: clean-css: 5.3.0 - cssnano: 5.1.14_postcss@8.4.21 + cssnano: 5.1.14_postcss@8.4.19 jest-worker: 27.5.1 - postcss: 8.4.21 + postcss: 8.4.19 schema-utils: 4.0.0 serialize-javascript: 6.0.0 source-map: 0.6.1 @@ -15446,19 +15364,19 @@ packages: engines: {node: '>=4'} hasBin: true - /cssnano-preset-advanced/5.3.8_postcss@8.4.21: + /cssnano-preset-advanced/5.3.8_postcss@8.4.19: resolution: {integrity: sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - autoprefixer: 10.4.13_postcss@8.4.21 - cssnano-preset-default: 5.2.13_postcss@8.4.21 - postcss: 8.4.21 - postcss-discard-unused: 5.1.0_postcss@8.4.21 - postcss-merge-idents: 5.1.1_postcss@8.4.21 - postcss-reduce-idents: 5.2.0_postcss@8.4.21 - postcss-zindex: 5.1.0_postcss@8.4.21 + autoprefixer: 10.4.13_postcss@8.4.19 + cssnano-preset-default: 5.2.13_postcss@8.4.19 + postcss: 8.4.19 + postcss-discard-unused: 5.1.0_postcss@8.4.19 + postcss-merge-idents: 5.1.1_postcss@8.4.19 + postcss-reduce-idents: 5.2.0_postcss@8.4.19 + postcss-zindex: 5.1.0_postcss@8.4.19 dev: true /cssnano-preset-default/5.2.12_postcss@8.4.14: @@ -15537,42 +15455,42 @@ packages: postcss-unique-selectors: 5.1.1_postcss@8.4.20 dev: true - /cssnano-preset-default/5.2.13_postcss@8.4.21: + /cssnano-preset-default/5.2.13_postcss@8.4.19: resolution: {integrity: sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.3.1_postcss@8.4.21 - cssnano-utils: 3.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-calc: 8.2.4_postcss@8.4.21 - postcss-colormin: 5.3.0_postcss@8.4.21 - postcss-convert-values: 5.1.3_postcss@8.4.21 - postcss-discard-comments: 5.1.2_postcss@8.4.21 - postcss-discard-duplicates: 5.1.0_postcss@8.4.21 - postcss-discard-empty: 5.1.1_postcss@8.4.21 - postcss-discard-overridden: 5.1.0_postcss@8.4.21 - postcss-merge-longhand: 5.1.7_postcss@8.4.21 - postcss-merge-rules: 5.1.3_postcss@8.4.21 - postcss-minify-font-values: 5.1.0_postcss@8.4.21 - postcss-minify-gradients: 5.1.1_postcss@8.4.21 - postcss-minify-params: 5.1.4_postcss@8.4.21 - postcss-minify-selectors: 5.2.1_postcss@8.4.21 - postcss-normalize-charset: 5.1.0_postcss@8.4.21 - postcss-normalize-display-values: 5.1.0_postcss@8.4.21 - postcss-normalize-positions: 5.1.1_postcss@8.4.21 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.21 - postcss-normalize-string: 5.1.0_postcss@8.4.21 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.21 - postcss-normalize-unicode: 5.1.1_postcss@8.4.21 - postcss-normalize-url: 5.1.0_postcss@8.4.21 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.21 - postcss-ordered-values: 5.1.3_postcss@8.4.21 - postcss-reduce-initial: 5.1.1_postcss@8.4.21 - postcss-reduce-transforms: 5.1.0_postcss@8.4.21 - postcss-svgo: 5.1.0_postcss@8.4.21 - postcss-unique-selectors: 5.1.1_postcss@8.4.21 + css-declaration-sorter: 6.3.1_postcss@8.4.19 + cssnano-utils: 3.1.0_postcss@8.4.19 + postcss: 8.4.19 + postcss-calc: 8.2.4_postcss@8.4.19 + postcss-colormin: 5.3.0_postcss@8.4.19 + postcss-convert-values: 5.1.3_postcss@8.4.19 + postcss-discard-comments: 5.1.2_postcss@8.4.19 + postcss-discard-duplicates: 5.1.0_postcss@8.4.19 + postcss-discard-empty: 5.1.1_postcss@8.4.19 + postcss-discard-overridden: 5.1.0_postcss@8.4.19 + postcss-merge-longhand: 5.1.7_postcss@8.4.19 + postcss-merge-rules: 5.1.3_postcss@8.4.19 + postcss-minify-font-values: 5.1.0_postcss@8.4.19 + postcss-minify-gradients: 5.1.1_postcss@8.4.19 + postcss-minify-params: 5.1.4_postcss@8.4.19 + postcss-minify-selectors: 5.2.1_postcss@8.4.19 + postcss-normalize-charset: 5.1.0_postcss@8.4.19 + postcss-normalize-display-values: 5.1.0_postcss@8.4.19 + postcss-normalize-positions: 5.1.1_postcss@8.4.19 + postcss-normalize-repeat-style: 5.1.1_postcss@8.4.19 + postcss-normalize-string: 5.1.0_postcss@8.4.19 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.19 + postcss-normalize-unicode: 5.1.1_postcss@8.4.19 + postcss-normalize-url: 5.1.0_postcss@8.4.19 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.19 + postcss-ordered-values: 5.1.3_postcss@8.4.19 + postcss-reduce-initial: 5.1.1_postcss@8.4.19 + postcss-reduce-transforms: 5.1.0_postcss@8.4.19 + postcss-svgo: 5.1.0_postcss@8.4.19 + postcss-unique-selectors: 5.1.1_postcss@8.4.19 /cssnano-utils/3.1.0_postcss@8.4.14: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} @@ -15583,6 +15501,14 @@ packages: postcss: 8.4.14 dev: true + /cssnano-utils/3.1.0_postcss@8.4.19: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + /cssnano-utils/3.1.0_postcss@8.4.20: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -15592,14 +15518,6 @@ packages: postcss: 8.4.20 dev: true - /cssnano-utils/3.1.0_postcss@8.4.21: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - /cssnano/5.1.12_postcss@8.4.14: resolution: {integrity: sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -15624,15 +15542,15 @@ packages: yaml: 1.10.2 dev: true - /cssnano/5.1.14_postcss@8.4.21: + /cssnano/5.1.14_postcss@8.4.19: resolution: {integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.13_postcss@8.4.21 + cssnano-preset-default: 5.2.13_postcss@8.4.19 lilconfig: 2.0.6 - postcss: 8.4.21 + postcss: 8.4.19 yaml: 1.10.2 /csso/4.2.0: @@ -16992,7 +16910,7 @@ packages: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.13 - '@types/node': 18.11.10 + '@types/node': 17.0.45 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -18394,7 +18312,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 require-like: 0.1.2 dev: true @@ -18469,7 +18387,7 @@ packages: '@apidevtools/json-schema-ref-parser': 9.0.9 ajv: 8.11.0 ajv-formats: 2.1.1_ajv@8.11.0 - body-parser: 1.20.0 + body-parser: 1.20.1 content-type: 1.0.4 deep-freeze: 0.0.1 events-listener: 1.1.0 @@ -18480,7 +18398,7 @@ packages: openapi3-ts: 2.0.2 promise-breaker: 5.0.0 pump: 3.0.0 - qs: 6.10.5 + qs: 6.11.0 raw-body: 2.5.1 semver: 7.3.8 transitivePeerDependencies: @@ -19123,6 +19041,7 @@ packages: peerDependenciesMeta: debug: optional: true + dev: true /follow-redirects/1.15.1_debug@4.3.4: resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} @@ -19134,7 +19053,6 @@ packages: optional: true dependencies: debug: 4.3.4 - dev: true /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -21003,13 +20921,13 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils/5.1.0_postcss@8.4.21: + /icss-utils/5.1.0_postcss@8.4.19: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -21159,7 +21077,7 @@ packages: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.5.5 + rxjs: 7.6.0 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 @@ -21257,6 +21175,10 @@ packages: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} dev: true + /ip/2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: true + /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -21357,6 +21279,7 @@ packages: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 + dev: true /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -21870,7 +21793,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -21898,7 +21821,7 @@ packages: '@jest/expect': 28.1.1 '@jest/test-result': 28.1.1 '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -21925,7 +21848,7 @@ packages: '@jest/expect': 29.3.0 '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -21952,7 +21875,7 @@ packages: '@jest/expect': 29.3.1 '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -22164,45 +22087,6 @@ packages: - supports-color dev: true - /jest-config/28.1.1_@types+node@18.11.10: - resolution: {integrity: sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.20.12 - '@jest/test-sequencer': 28.1.1 - '@jest/types': 28.1.3 - '@types/node': 18.11.10 - babel-jest: 28.1.1_@babel+core@7.20.12 - chalk: 4.1.2 - ci-info: 3.7.0 - deepmerge: 4.3.0 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 28.1.1 - jest-environment-node: 28.1.1 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.1 - jest-runner: 28.1.1 - jest-util: 28.1.3 - jest-validate: 28.1.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 28.1.3 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /jest-config/29.3.0: resolution: {integrity: sha512-sTSDs/M+//njznsytxiBxwfDnSWRb6OqiNSlO/B2iw1HUaa1YLsdWmV4AWLXss1XKzv1F0yVK+kA4XOhZ0I1qQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -22241,7 +22125,7 @@ packages: - supports-color dev: true - /jest-config/29.3.0_@types+node@18.11.10: + /jest-config/29.3.0_@types+node@17.0.45: resolution: {integrity: sha512-sTSDs/M+//njznsytxiBxwfDnSWRb6OqiNSlO/B2iw1HUaa1YLsdWmV4AWLXss1XKzv1F0yVK+kA4XOhZ0I1qQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -22256,7 +22140,7 @@ packages: '@babel/core': 7.20.12 '@jest/test-sequencer': 29.3.0 '@jest/types': 29.2.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 babel-jest: 29.3.0_@babel+core@7.20.12 chalk: 4.1.2 ci-info: 3.7.0 @@ -22318,7 +22202,7 @@ packages: - supports-color dev: true - /jest-config/29.3.1_@types+node@18.11.10: + /jest-config/29.3.1_@types+node@17.0.45: resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -22333,7 +22217,7 @@ packages: '@babel/core': 7.20.12 '@jest/test-sequencer': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 babel-jest: 29.3.1_@babel+core@7.20.12 chalk: 4.1.2 ci-info: 3.7.0 @@ -22479,7 +22363,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -22516,7 +22400,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true @@ -22528,7 +22412,7 @@ packages: '@jest/environment': 28.1.1 '@jest/fake-timers': 28.1.1 '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 28.1.1 jest-util: 28.1.3 dev: true @@ -22540,7 +22424,7 @@ packages: '@jest/environment': 29.3.0 '@jest/fake-timers': 29.3.0 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 29.3.0 jest-util: 29.3.1 dev: true @@ -22552,7 +22436,7 @@ packages: '@jest/environment': 29.3.1 '@jest/fake-timers': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-mock: 29.3.1 jest-util: 29.3.1 dev: true @@ -22583,7 +22467,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.10 + '@types/node': 17.0.45 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -22603,7 +22487,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.10 + '@types/node': 17.0.45 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -22622,7 +22506,7 @@ packages: dependencies: '@jest/types': 29.2.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.10 + '@types/node': 17.0.45 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -22641,7 +22525,7 @@ packages: dependencies: '@jest/types': 29.3.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.11.10 + '@types/node': 17.0.45 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.10 @@ -22679,7 +22563,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -22848,7 +22732,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /jest-mock/28.1.1: @@ -22856,7 +22740,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /jest-mock/28.1.3: @@ -22864,7 +22748,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /jest-mock/29.3.0: @@ -22872,7 +22756,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-util: 29.3.1 dev: true @@ -22881,7 +22765,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-util: 29.3.1 dev: true @@ -23059,7 +22943,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.10 @@ -23091,7 +22975,7 @@ packages: '@jest/test-result': 28.1.1 '@jest/transform': 28.1.1 '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.10 @@ -23120,7 +23004,7 @@ packages: '@jest/test-result': 29.2.1 '@jest/transform': 29.3.0 '@jest/types': 29.2.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -23149,7 +23033,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.10 @@ -23240,7 +23124,7 @@ packages: '@jest/test-result': 29.2.1 '@jest/transform': 29.3.0 '@jest/types': 29.2.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -23270,7 +23154,7 @@ packages: '@jest/test-result': 29.3.1 '@jest/transform': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -23293,7 +23177,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 graceful-fs: 4.2.10 dev: true @@ -23427,9 +23311,9 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 - ci-info: 3.3.2 + ci-info: 3.7.0 graceful-fs: 4.2.10 picomatch: 2.3.1 dev: true @@ -23439,7 +23323,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 ci-info: 3.7.0 graceful-fs: 4.2.10 @@ -23451,7 +23335,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 ci-info: 3.7.0 graceful-fs: 4.2.10 @@ -23463,7 +23347,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.2.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 ci-info: 3.7.0 graceful-fs: 4.2.10 @@ -23475,7 +23359,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 chalk: 4.1.2 ci-info: 3.7.0 graceful-fs: 4.2.10 @@ -23552,7 +23436,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -23565,7 +23449,7 @@ packages: dependencies: '@jest/test-result': 28.1.1 '@jest/types': 28.1.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -23579,7 +23463,7 @@ packages: dependencies: '@jest/test-result': 28.1.1 '@jest/types': 28.1.3 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -23593,7 +23477,7 @@ packages: dependencies: '@jest/test-result': 29.2.1 '@jest/types': 29.2.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -23607,7 +23491,7 @@ packages: dependencies: '@jest/test-result': 29.3.1 '@jest/types': 29.3.1 - '@types/node': 18.11.10 + '@types/node': 17.0.45 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -23619,7 +23503,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -23627,7 +23511,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -23635,7 +23519,7 @@ packages: resolution: {integrity: sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -23644,7 +23528,7 @@ packages: resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 jest-util: 29.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -25470,6 +25354,13 @@ packages: whatwg-url: 11.0.0 dev: true + /mongodb-connection-string-url/2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + dev: true + /mongodb/4.7.0: resolution: {integrity: sha512-HhVar6hsUeMAVlIbwQwWtV36iyjKd9qdhY+s4wcU8K6TOj4Q331iiMy+FoPuxEntDIijTYWivwFJkLv8q/ZgvA==} engines: {node: '>=12.9.0'} @@ -25482,6 +25373,28 @@ packages: saslprep: 1.0.3 dev: true + /mongodb/5.1.0: + resolution: {integrity: sha512-qgKb7y+EI90y4weY3z5+lIgm8wmexbonz0GalHkSElQXVKtRuwqXuhXKccyvIjXCJVy9qPV82zsinY0W1FBnJw==} + engines: {node: '>=14.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.201.0 + mongodb-client-encryption: ^2.3.0 + snappy: ^7.2.2 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + dependencies: + bson: 5.0.1 + mongodb-connection-string-url: 2.6.0 + socks: 2.7.1 + optionalDependencies: + saslprep: 1.0.3 + dev: true + /morgan/1.10.0: resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} engines: {node: '>= 0.8.0'} @@ -27008,6 +26921,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-calc/8.2.4_postcss@8.4.19: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.19 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + /postcss-calc/8.2.4_postcss@8.4.20: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: @@ -27018,15 +26940,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-calc/8.2.4_postcss@8.4.21: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 - dependencies: - postcss: 8.4.21 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - /postcss-cli/9.1.0_postcss@8.4.14: resolution: {integrity: sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==} engines: {node: '>=12'} @@ -27064,6 +26977,18 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-colormin/5.3.0_postcss@8.4.19: + resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + caniuse-api: 3.0.0 + colord: 2.9.2 + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-colormin/5.3.0_postcss@8.4.20: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27077,18 +27002,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-colormin/5.3.0_postcss@8.4.21: - resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - colord: 2.9.2 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-convert-values/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27100,6 +27013,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-convert-values/5.1.3_postcss@8.4.19: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-convert-values/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27111,16 +27034,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values/5.1.3_postcss@8.4.21: - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-discard-comments/5.1.2_postcss@8.4.14: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27130,6 +27043,14 @@ packages: postcss: 8.4.14 dev: true + /postcss-discard-comments/5.1.2_postcss@8.4.19: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + /postcss-discard-comments/5.1.2_postcss@8.4.20: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27139,14 +27060,6 @@ packages: postcss: 8.4.20 dev: true - /postcss-discard-comments/5.1.2_postcss@8.4.21: - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - /postcss-discard-duplicates/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27156,6 +27069,14 @@ packages: postcss: 8.4.14 dev: true + /postcss-discard-duplicates/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + /postcss-discard-duplicates/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27165,14 +27086,6 @@ packages: postcss: 8.4.20 dev: true - /postcss-discard-duplicates/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - /postcss-discard-empty/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} @@ -27182,6 +27095,14 @@ packages: postcss: 8.4.14 dev: true + /postcss-discard-empty/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + /postcss-discard-empty/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} @@ -27191,14 +27112,6 @@ packages: postcss: 8.4.20 dev: true - /postcss-discard-empty/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - /postcss-discard-overridden/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27208,6 +27121,14 @@ packages: postcss: 8.4.14 dev: true + /postcss-discard-overridden/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + /postcss-discard-overridden/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27217,21 +27138,13 @@ packages: postcss: 8.4.20 dev: true - /postcss-discard-overridden/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - - /postcss-discard-unused/5.1.0_postcss@8.4.21: + /postcss-discard-unused/5.1.0_postcss@8.4.19: resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 postcss-selector-parser: 6.0.10 dev: true @@ -27249,13 +27162,13 @@ packages: enhanced-resolve: 4.5.0 dev: true - /postcss-import/15.1.0_postcss@8.4.21: + /postcss-import/15.1.0_postcss@8.4.19: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 @@ -27322,14 +27235,14 @@ packages: webpack: 5.73.0 dev: true - /postcss-merge-idents/5.1.1_postcss@8.4.21: + /postcss-merge-idents/5.1.1_postcss@8.4.19: resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.21 - postcss: 8.4.21 + cssnano-utils: 3.1.0_postcss@8.4.19 + postcss: 8.4.19 postcss-value-parser: 4.2.0 dev: true @@ -27344,6 +27257,16 @@ packages: stylehacks: 5.1.1_postcss@8.4.14 dev: true + /postcss-merge-longhand/5.1.7_postcss@8.4.19: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1_postcss@8.4.19 + /postcss-merge-longhand/5.1.7_postcss@8.4.20: resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27355,16 +27278,6 @@ packages: stylehacks: 5.1.1_postcss@8.4.20 dev: true - /postcss-merge-longhand/5.1.7_postcss@8.4.21: - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - stylehacks: 5.1.1_postcss@8.4.21 - /postcss-merge-rules/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27378,6 +27291,18 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /postcss-merge-rules/5.1.3_postcss@8.4.19: + resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0_postcss@8.4.19 + postcss: 8.4.19 + postcss-selector-parser: 6.0.10 + /postcss-merge-rules/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27391,18 +27316,6 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-merge-rules/5.1.3_postcss@8.4.21: - resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-selector-parser: 6.0.10 - /postcss-minify-font-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27413,6 +27326,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-minify-font-values/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-minify-font-values/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27423,15 +27345,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-font-values/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-minify-gradients/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27444,6 +27357,17 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-minify-gradients/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.2 + cssnano-utils: 3.1.0_postcss@8.4.19 + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-minify-gradients/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27456,17 +27380,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - colord: 2.9.2 - cssnano-utils: 3.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-minify-params/5.1.4_postcss@8.4.14: resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27479,6 +27392,17 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-minify-params/5.1.4_postcss@8.4.19: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + cssnano-utils: 3.1.0_postcss@8.4.19 + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-minify-params/5.1.4_postcss@8.4.20: resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27491,17 +27415,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params/5.1.4_postcss@8.4.21: - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - cssnano-utils: 3.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-minify-selectors/5.2.1_postcss@8.4.14: resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27512,6 +27425,15 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /postcss-minify-selectors/5.2.1_postcss@8.4.19: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-selector-parser: 6.0.10 + /postcss-minify-selectors/5.2.1_postcss@8.4.20: resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27522,51 +27444,42 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-minify-selectors/5.2.1_postcss@8.4.21: - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-selector-parser: 6.0.10 - - /postcss-modules-extract-imports/3.0.0_postcss@8.4.21: + /postcss-modules-extract-imports/3.0.0_postcss@8.4.19: resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 - /postcss-modules-local-by-default/4.0.0_postcss@8.4.21: + /postcss-modules-local-by-default/4.0.0_postcss@8.4.19: resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.21 - postcss: 8.4.21 + icss-utils: 5.1.0_postcss@8.4.19 + postcss: 8.4.19 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 - /postcss-modules-scope/3.0.0_postcss@8.4.21: + /postcss-modules-scope/3.0.0_postcss@8.4.19: resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 postcss-selector-parser: 6.0.10 - /postcss-modules-values/4.0.0_postcss@8.4.21: + /postcss-modules-values/4.0.0_postcss@8.4.19: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.21 - postcss: 8.4.21 + icss-utils: 5.1.0_postcss@8.4.19 + postcss: 8.4.19 /postcss-nested/5.0.6_postcss@8.4.14: resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.com/postcss-nested/-/postcss-nested-5.0.6.tgz} @@ -27597,6 +27510,14 @@ packages: postcss: 8.4.14 dev: true + /postcss-normalize-charset/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + /postcss-normalize-charset/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27606,14 +27527,6 @@ packages: postcss: 8.4.20 dev: true - /postcss-normalize-charset/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - /postcss-normalize-display-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27624,6 +27537,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-display-values/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-display-values/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27634,15 +27556,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-display-values/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-normalize-positions/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27653,6 +27566,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-positions/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-positions/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27663,15 +27585,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} @@ -27682,6 +27595,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} @@ -27692,15 +27614,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-normalize-string/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} @@ -27711,6 +27624,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-string/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-string/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} @@ -27721,15 +27643,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27740,6 +27653,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27750,15 +27672,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-normalize-unicode/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27770,6 +27683,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-unicode/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-unicode/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27781,16 +27704,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-normalize-url/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} @@ -27802,6 +27715,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-url/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-url/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} @@ -27813,16 +27736,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - normalize-url: 6.1.0 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-normalize-whitespace/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27833,6 +27746,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-whitespace/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-normalize-whitespace/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27843,15 +27765,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-ordered-values/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27863,6 +27776,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-ordered-values/5.1.3_postcss@8.4.19: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0_postcss@8.4.19 + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-ordered-values/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27874,23 +27797,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-ordered-values/5.1.3_postcss@8.4.21: - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-utils: 3.1.0_postcss@8.4.21 - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - - /postcss-reduce-idents/5.2.0_postcss@8.4.21: + /postcss-reduce-idents/5.2.0_postcss@8.4.19: resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 postcss-value-parser: 4.2.0 dev: true @@ -27905,6 +27818,16 @@ packages: postcss: 8.4.14 dev: true + /postcss-reduce-initial/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + caniuse-api: 3.0.0 + postcss: 8.4.19 + /postcss-reduce-initial/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} engines: {node: ^10 || ^12 || >=14.0} @@ -27916,16 +27839,6 @@ packages: postcss: 8.4.20 dev: true - /postcss-reduce-initial/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - postcss: 8.4.21 - /postcss-reduce-transforms/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27936,6 +27849,15 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-reduce-transforms/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + /postcss-reduce-transforms/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27946,15 +27868,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-reduce-transforms/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - /postcss-reporter/7.0.5_postcss@8.4.14: resolution: {integrity: sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==} engines: {node: '>=10'} @@ -27973,13 +27886,13 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-sort-media-queries/4.2.1_postcss@8.4.21: + /postcss-sort-media-queries/4.2.1_postcss@8.4.19: resolution: {integrity: sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.4.4 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 sort-css-media-queries: 2.0.4 dev: true @@ -27994,6 +27907,16 @@ packages: svgo: 2.8.0 dev: true + /postcss-svgo/5.1.0_postcss@8.4.19: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + /postcss-svgo/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} @@ -28005,16 +27928,6 @@ packages: svgo: 2.8.0 dev: true - /postcss-svgo/5.1.0_postcss@8.4.21: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-value-parser: 4.2.0 - svgo: 2.8.0 - /postcss-unique-selectors/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} @@ -28025,6 +27938,15 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /postcss-unique-selectors/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.19 + postcss-selector-parser: 6.0.10 + /postcss-unique-selectors/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} @@ -28035,16 +27957,7 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-unique-selectors/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.21 - postcss-selector-parser: 6.0.10 - - /postcss-url/10.1.3_postcss@8.4.21: + /postcss-url/10.1.3_postcss@8.4.19: resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} engines: {node: '>=10'} peerDependencies: @@ -28053,20 +27966,20 @@ packages: make-dir: 3.1.0 mime: 2.5.2 minimatch: 3.0.4 - postcss: 8.4.21 + postcss: 8.4.19 xxhashjs: 0.2.2 dev: true /postcss-value-parser/4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss-zindex/5.1.0_postcss@8.4.21: + /postcss-zindex/5.1.0_postcss@8.4.19: resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.21 + postcss: 8.4.19 dev: true /postcss/8.4.14: @@ -28084,7 +27997,6 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /postcss/8.4.20: resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} @@ -28102,6 +28014,7 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: false /postgres-array/2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} @@ -28591,7 +28504,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.11.10 + '@types/node': 17.0.45 long: 5.2.1 dev: true @@ -28678,14 +28591,6 @@ packages: side-channel: 1.0.4 dev: true - /qs/6.10.5: - resolution: {integrity: sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==} - engines: {node: '>=0.6'} - deprecated: when using stringify with arrayFormat comma, `[]` is appended on single-item arrays. Upgrade to v6.11.0 or downgrade to v6.10.4 to fix. - dependencies: - side-channel: 1.0.4 - dev: true - /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -29212,12 +29117,6 @@ packages: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: true - /regenerate-unicode-properties/10.0.1: - resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - /regenerate-unicode-properties/10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} @@ -29250,17 +29149,6 @@ packages: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} - /regexpu-core/5.0.1: - resolution: {integrity: sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.0.1 - regjsgen: 0.6.0 - regjsparser: 0.8.4 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.0.0 - /regexpu-core/5.2.1: resolution: {integrity: sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==} engines: {node: '>=4'} @@ -29300,18 +29188,9 @@ packages: rc: 1.2.8 dev: false - /regjsgen/0.6.0: - resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==} - /regjsgen/0.7.1: resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==} - /regjsparser/0.8.4: - resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==} - hasBin: true - dependencies: - jsesc: 0.5.0 - /regjsparser/0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true @@ -29516,7 +29395,7 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -29524,7 +29403,7 @@ packages: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -29720,7 +29599,7 @@ packages: dependencies: find-up: 5.0.0 picocolors: 1.0.0 - postcss: 8.4.21 + postcss: 8.4.19 strip-json-comments: 3.1.1 dev: true @@ -30322,7 +30201,7 @@ packages: dependencies: agent-base: 6.0.2 debug: 4.3.4 - socks: 2.6.2 + socks: 2.7.1 transitivePeerDependencies: - supports-color dev: true @@ -30333,7 +30212,7 @@ packages: dependencies: agent-base: 6.0.2 debug: 4.3.4 - socks: 2.6.2 + socks: 2.7.1 transitivePeerDependencies: - supports-color dev: true @@ -30345,7 +30224,7 @@ packages: dependencies: agent-base: 6.0.2 debug: 4.3.4 - socks: 2.6.2 + socks: 2.7.1 transitivePeerDependencies: - supports-color dev: true @@ -30359,6 +30238,14 @@ packages: smart-buffer: 4.2.0 dev: true + /socks/2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: true + /solid-js/1.6.6: resolution: {integrity: sha512-5x33mEbPI8QLuywvFjQP4krjWDr8xiYFgZx9KCBH7b0ZzypQCHaUubob7bK6i+1u6nhaAqhWtvXS587Kb8DShA==} dependencies: @@ -31070,6 +30957,16 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /stylehacks/5.1.1_postcss@8.4.19: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + postcss: 8.4.19 + postcss-selector-parser: 6.0.10 + /stylehacks/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} @@ -31081,16 +30978,6 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /stylehacks/5.1.1_postcss@8.4.21: - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.21 - postcss-selector-parser: 6.0.10 - /stylis/4.1.3: resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} dev: false @@ -33192,7 +33079,7 @@ packages: optional: true dependencies: esbuild: 0.15.16 - postcss: 8.4.21 + postcss: 8.4.19 resolve: 1.22.1 rollup: 2.79.1 optionalDependencies: @@ -33947,7 +33834,7 @@ packages: /wkx/0.5.0: resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} dependencies: - '@types/node': 18.11.10 + '@types/node': 17.0.45 dev: true /word-wrap/1.2.3: From ff5b8ba8e2421a7f22886c884219e841f6e62b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20Waage?= Date: Thu, 16 Mar 2023 01:02:27 +0100 Subject: [PATCH 21/80] fix(docs): Update documentation (#6956) * Adding correct sveltekit client doc links. * Updating urls for sveltekit index. --- packages/frameworks-sveltekit/src/lib/client.ts | 4 ++-- packages/frameworks-sveltekit/src/lib/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/frameworks-sveltekit/src/lib/client.ts b/packages/frameworks-sveltekit/src/lib/client.ts index d865dcf5..f8d4dbd6 100644 --- a/packages/frameworks-sveltekit/src/lib/client.ts +++ b/packages/frameworks-sveltekit/src/lib/client.ts @@ -14,7 +14,7 @@ import type { * or send the user to the signin page listing all possible providers. * Automatically adds the CSRF token to the request. * - * [Documentation](https://authjs.dev/reference/utilities/#signin) + * [Documentation](https://authjs.dev/reference/sveltekit/client#signin) */ export async function signIn< P extends RedirectableProviderType | undefined = undefined @@ -78,7 +78,7 @@ export async function signIn< * Signs the user out, by removing the session cookie. * Automatically adds the CSRF token to the request. * - * [Documentation](https://authjs.dev/reference/utilities/#signout) + * [Documentation](https://authjs.dev/reference/sveltekit/client#signout) */ export async function signOut(options?: SignOutParams) { const { callbackUrl = window.location.href } = options ?? {} diff --git a/packages/frameworks-sveltekit/src/lib/index.ts b/packages/frameworks-sveltekit/src/lib/index.ts index 45e4d973..b81405c8 100644 --- a/packages/frameworks-sveltekit/src/lib/index.ts +++ b/packages/frameworks-sveltekit/src/lib/index.ts @@ -233,7 +233,7 @@ export interface SvelteKitAuthConfig extends AuthConfig { /** * Defines the base path for the auth routes. * If you change the default value, - * you must also update the callback URL used by the [providers](https://authjs.dev/reference/core/modules/providers). + * you must also update the callback URL used by the [providers](https://authjs.dev/reference/core/providers). * * @default "/auth" */ From 1c104afef9c008ffe1193adb6c18182f9ed0447e Mon Sep 17 00:00:00 2001 From: Lluis Agusti Date: Thu, 16 Mar 2023 02:50:21 +0100 Subject: [PATCH 22/80] docs(fauna): move content to source (#6919) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(fauna): move content to source * chore: fix spelling * Apply suggestions from code review --------- Co-authored-by: Balázs Orbán --- docs/docs/reference/06-adapters/fauna.md | 83 --------------------- docs/docusaurus.config.js | 7 ++ docs/sidebars.js | 3 +- packages/adapter-dynamodb/src/index.ts | 8 +-- packages/adapter-fauna/src/index.ts | 91 ++++++++++++++++++++++++ packages/adapter-firebase/src/index.ts | 8 +-- packages/adapter-mongodb/src/index.ts | 7 +- 7 files changed, 111 insertions(+), 96 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/fauna.md diff --git a/docs/docs/reference/06-adapters/fauna.md b/docs/docs/reference/06-adapters/fauna.md deleted file mode 100644 index 17ea625c..00000000 --- a/docs/docs/reference/06-adapters/fauna.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -id: fauna -title: FaunaDB ---- - -This is the Fauna Adapter for [`next-auth`](https://authjs.dev). This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. - -You can find the Fauna schema and seed information in the docs at [authjs.dev/reference/adapters/fauna](https://authjs.dev/reference/adapters/fauna). - -## Getting Started - -1. Install the necessary packages - -```bash npm2yarn -npm install next-auth @next-auth/fauna-adapter faunadb -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import { Client as FaunaClient } from "faunadb" -import { FaunaAdapter } from "@next-auth/fauna-adapter" - -const client = new FaunaClient({ - secret: "secret", - scheme: "http", - domain: "localhost", - port: 8443, -}) - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/ - providers: [], - adapter: FaunaAdapter(client) - ... -}) -``` - -## Schema - -Run the following commands inside of the `Shell` tab in the Fauna dashboard to setup the appropriate collections and indexes. - -```javascript -CreateCollection({ name: "accounts" }) -CreateCollection({ name: "sessions" }) -CreateCollection({ name: "users" }) -CreateCollection({ name: "verification_tokens" }) -``` - -```javascript -CreateIndex({ - name: "account_by_provider_and_provider_account_id", - source: Collection("accounts"), - unique: true, - terms: [ - { field: ["data", "provider"] }, - { field: ["data", "providerAccountId"] }, - ], -}) -CreateIndex({ - name: "session_by_session_token", - source: Collection("sessions"), - unique: true, - terms: [{ field: ["data", "sessionToken"] }], -}) -CreateIndex({ - name: "user_by_email", - source: Collection("users"), - unique: true, - terms: [{ field: ["data", "email"] }], -}) -CreateIndex({ - name: "verification_token_by_identifier_and_token", - source: Collection("verification_tokens"), - unique: true, - terms: [{ field: ["data", "identifier"] }, { field: ["data", "token"] }], -}) -``` - -> This schema is adapted for use in Fauna and based upon our main [schema](/reference/adapters/models) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 06f24c1f..65a8199f 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -270,6 +270,13 @@ const docusaurusConfig = { ...createTypeDocAdapterConfig("Prisma"), }, ], + [ + "docusaurus-plugin-typedoc", + { + ...typedocConfig, + ...createTypeDocAdapterConfig("Fauna"), + }, + ], [ "docusaurus-plugin-typedoc", { diff --git a/docs/sidebars.js b/docs/sidebars.js index 68fc57ba..ccbd19b8 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -54,7 +54,8 @@ module.exports = { { type: "doc", id: "reference/adapter/typeorm/index" }, { type: "doc", id: "reference/adapter/mongodb/index" }, { type: "doc", id: "reference/adapter/firebase/index" }, - { type: "doc", id: "reference/adapter/dgraph/index" }, + { type: "doc", id: "reference/adapter/dynamodb/index" }, + { type: "doc", id: "reference/adapter/fauna/index" }, { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, diff --git a/packages/adapter-dynamodb/src/index.ts b/packages/adapter-dynamodb/src/index.ts index fd147e57..92de5835 100644 --- a/packages/adapter-dynamodb/src/index.ts +++ b/packages/adapter-dynamodb/src/index.ts @@ -1,8 +1,8 @@ /** *
- *

Official Dgraph adapter for Auth.js / NextAuth.js.

- * - * + *

Official DynamoDB adapter for Auth.js / NextAuth.js.

+ * + * * *
* @@ -44,7 +44,7 @@ export interface DynamoDBAdapterOptions { * By default, the adapter expects a table with a partition key `pk` and a sort key `sk`, as well as a global secondary index named `GSI1` with `GSI1PK` as partition key and `GSI1SK` as sorting key. To automatically delete sessions and verification requests after they expire using [dynamodb TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html) you should [enable the TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html) with attribute name 'expires'. You can set whatever you want as the table name and the billing method. * You can find the full schema in the table structure section below. * - * ## Configuring `pages/api/auth/[...nextauth].js` + * ## Configuring Auth.js * * You need to pass `DynamoDBDocument` client from the modular [`aws-sdk`](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-example-dynamodb-utilities.html) v3 to the adapter. * The default table name is `next-auth`, but you can customise that by passing `{ tableName: 'your-table-name' }` as the second parameter in the adapter. diff --git a/packages/adapter-fauna/src/index.ts b/packages/adapter-fauna/src/index.ts index 0e613b57..29cd0b1e 100644 --- a/packages/adapter-fauna/src/index.ts +++ b/packages/adapter-fauna/src/index.ts @@ -1,4 +1,20 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ +/** + *
+ *

Official Fauna adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/fauna-adapter faunadb + * ``` + * + * @module @next-auth/fauna-adapter + */ import { Client as FaunaClient, ExprArg, @@ -108,6 +124,81 @@ export function query(f: FaunaClient, format: (...args: any) => any) { } } +/** + * + * ## Basic usage + * + * This is the Fauna Adapter for [`next-auth`](https://authjs.dev). This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. + * + * You can find the Fauna schema and seed information in the docs at [authjs.dev/reference/adapters/fauna](https://authjs.dev/reference/adapters/fauna). + * + * ### Configure Auth.js + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import { Client as FaunaClient } from "faunadb" + * import { FaunaAdapter } from "@next-auth/fauna-adapter" + * + * const client = new FaunaClient({ + * secret: "secret", + * scheme: "http", + * domain: "localhost", + * port: 8443, + * }) + * + * // For more information on each option (and a full list of options) go to + * // https://authjs.dev/reference/configuration/auth-options + * export default NextAuth({ + * // https://authjs.dev/reference/providers/ + * providers: [], + * adapter: FaunaAdapter(client) + * ... + * }) + * ``` + * + * ### Schema + * + * Run the following commands inside of the `Shell` tab in the Fauna dashboard to setup the appropriate collections and indexes. + * + * ```javascript + * CreateCollection({ name: "accounts" }) + * CreateCollection({ name: "sessions" }) + * CreateCollection({ name: "users" }) + * CreateCollection({ name: "verification_tokens" }) + * ``` + * + * ```javascript + * CreateIndex({ + * name: "account_by_provider_and_provider_account_id", + * source: Collection("accounts"), + * unique: true, + * terms: [ + * { field: ["data", "provider"] }, + * { field: ["data", "providerAccountId"] }, + * ], + * }) + * CreateIndex({ + * name: "session_by_session_token", + * source: Collection("sessions"), + * unique: true, + * terms: [{ field: ["data", "sessionToken"] }], + * }) + * CreateIndex({ + * name: "user_by_email", + * source: Collection("users"), + * unique: true, + * terms: [{ field: ["data", "email"] }], + * }) + * CreateIndex({ + * name: "verification_token_by_identifier_and_token", + * source: Collection("verification_tokens"), + * unique: true, + * terms: [{ field: ["data", "identifier"] }, { field: ["data", "token"] }], + * }) + * ``` + * + * > This schema is adapted for use in Fauna and based upon our main [schema](/reference/adapters/models) + **/ export function FaunaAdapter(f: FaunaClient): Adapter { const { Users, Accounts, Sessions, VerificationTokens } = collections const { diff --git a/packages/adapter-firebase/src/index.ts b/packages/adapter-firebase/src/index.ts index a1ad1c79..60c0c7f1 100644 --- a/packages/adapter-firebase/src/index.ts +++ b/packages/adapter-firebase/src/index.ts @@ -68,14 +68,14 @@ export interface FirebaseAdapterConfig extends AppOptions { } /** - * #### Usage + * ### Basic usage * * First, create a Firebase project and generate a service account key. * Visit: `https://console.firebase.google.com/u/0/project/{project-id}/settings/serviceaccounts/adminsdk` (replace `{project-id}` with your project's id) * * Now you have a few options to authenticate with the Firebase Admin SDK in your app: * - * ##### 1. `GOOGLE_APPLICATION_CREDENTIALS` environment variable: + * #### Environment variables * - Download the service account key and save it in your project. (Make sure to add the file to your `.gitignore`!) * - Add [`GOOGLE_APPLICATION_CREDENTIALS`](https://cloud.google.com/docs/authentication/application-default-credentials#GAC) to your environment variables and point it to the service account key file. * - The adapter will automatically pick up the environment variable and use it to authenticate with the Firebase Admin SDK. @@ -91,7 +91,7 @@ export interface FirebaseAdapterConfig extends AppOptions { * }) * ``` * - * ##### 2. Service account values as environment variables + * #### Service account values * * - Download the service account key to a temporary location. (Make sure to not commit this file to your repository!) * - Add the following environment variables to your project: `FIREBASE_PROJECT_ID`, `FIREBASE_CLIENT_EMAIL`, `FIREBASE_PRIVATE_KEY`. @@ -115,7 +115,7 @@ export interface FirebaseAdapterConfig extends AppOptions { * }) * ``` * - * ##### 3. Use an existing Firestore instance + * #### Using an existing Firestore instance * * If you already have a Firestore instance, you can pass that to the adapter directly instead. * diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index 2168e525..2bf3ff19 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -82,8 +82,7 @@ export const format = { }, } -/** Converts from string to ObjectId */ -export function _id(hex?: string) { +function _id(hex?: string) { if (hex?.length !== 24) return new ObjectId() return new ObjectId(hex) } @@ -99,7 +98,7 @@ export function _id(hex?: string) { * npm install next-auth @next-auth/mongodb-adapter mongodb * ``` * - * ### Add `lib/mongodb.ts` + * ### Add the MongoDB client * * ```ts * // This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb @@ -134,7 +133,7 @@ export function _id(hex?: string) { * export default clientPromise * ``` * - * ### Configure `pages/api/auth/[...nextauth].js` + * ### Configure Auth.js * * ```js * import NextAuth from "next-auth" From 4b5cd088000b1483d5f2ac6ab72918ca1165387e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 16 Mar 2023 02:53:30 +0100 Subject: [PATCH 23/80] chore: add fauna adapter as docs dep --- turbo.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/turbo.json b/turbo.json index 898c01a5..e51e2432 100644 --- a/turbo.json +++ b/turbo.json @@ -57,12 +57,13 @@ "dependsOn": [ "@auth/core#build", "@auth/sveltekit#build", - "@next-auth/firebase-adapter#build", "@next-auth/dgraph-adapter#build", - "@next-auth/prisma-adapter#build", - "@next-auth/mongodb-adapter#build", - "@next-auth/typeorm-legacy-adapter#build", "@next-auth/dynamodb-adapter#build", + "@next-auth/fauna-adapter#build", + "@next-auth/firebase-adapter#build", + "@next-auth/mongodb-adapter#build", + "@next-auth/prisma-adapter#build", + "@next-auth/typeorm-legacy-adapter#build", "next-auth#build" ], "outputs": [ From 874624dfbe0e92544e0a59969973f6592cebef41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 16 Mar 2023 02:58:17 +0100 Subject: [PATCH 24/80] fix(ts): fix type --- packages/adapter-mongodb/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index 2bf3ff19..bba61210 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -204,7 +204,7 @@ export function MongoDBAdapter( const userId = _id(id) const m = await db await Promise.all([ - m.A.deleteMany({ userId }), + m.A.deleteMany({ userId: userId as any }), m.S.deleteMany({ userId: userId as any }), m.U.deleteOne({ _id: userId }), ]) From d0d7b90ba1fcca57f587b9feaa399af27ad672b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 16 Mar 2023 02:59:16 +0100 Subject: [PATCH 25/80] chore: fix `rm` command --- packages/adapter-dynamodb/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-dynamodb/package.json b/packages/adapter-dynamodb/package.json index 02f0bf1f..45fad243 100644 --- a/packages/adapter-dynamodb/package.json +++ b/packages/adapter-dynamodb/package.json @@ -29,7 +29,7 @@ "test:default": "jest", "test:custom": "CUSTOM_MODEL=1 jest", "test": "pnpm test:default && pnpm test:custom", - "clean": "rm index.*", + "clean": "rm -rf index.*", "build": "pnpm clean && tsc" }, "files": [ From 26201e6271022608669dc98ec9d6d1a30b3aa698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 16 Mar 2023 02:23:46 +0000 Subject: [PATCH 26/80] chore: fix indentation --- packages/adapter-firebase/src/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/adapter-firebase/src/index.ts b/packages/adapter-firebase/src/index.ts index 60c0c7f1..64dade7f 100644 --- a/packages/adapter-firebase/src/index.ts +++ b/packages/adapter-firebase/src/index.ts @@ -68,14 +68,14 @@ export interface FirebaseAdapterConfig extends AppOptions { } /** - * ### Basic usage + * #### Basic usage * * First, create a Firebase project and generate a service account key. * Visit: `https://console.firebase.google.com/u/0/project/{project-id}/settings/serviceaccounts/adminsdk` (replace `{project-id}` with your project's id) * * Now you have a few options to authenticate with the Firebase Admin SDK in your app: * - * #### Environment variables + * ##### Environment variables * - Download the service account key and save it in your project. (Make sure to add the file to your `.gitignore`!) * - Add [`GOOGLE_APPLICATION_CREDENTIALS`](https://cloud.google.com/docs/authentication/application-default-credentials#GAC) to your environment variables and point it to the service account key file. * - The adapter will automatically pick up the environment variable and use it to authenticate with the Firebase Admin SDK. @@ -91,7 +91,7 @@ export interface FirebaseAdapterConfig extends AppOptions { * }) * ``` * - * #### Service account values + * ##### Service account values * * - Download the service account key to a temporary location. (Make sure to not commit this file to your repository!) * - Add the following environment variables to your project: `FIREBASE_PROJECT_ID`, `FIREBASE_CLIENT_EMAIL`, `FIREBASE_PRIVATE_KEY`. @@ -115,7 +115,7 @@ export interface FirebaseAdapterConfig extends AppOptions { * }) * ``` * - * #### Using an existing Firestore instance + * ##### Using an existing Firestore instance * * If you already have a Firestore instance, you can pass that to the adapter directly instead. * From 5a13288d4796e6d0b3a876dfcd7f88dfa16d4180 Mon Sep 17 00:00:00 2001 From: Abdulaziz Date: Thu, 16 Mar 2023 03:52:13 -0700 Subject: [PATCH 27/80] docs: fix text overflow in li tags (#6973) --- docs/src/pages/index.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index de8a4cfa..c1b1c8ad 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -92,7 +92,7 @@ margin-top: 0.5rem; margin-bottom: 0.5rem; font-size: 1rem; - white-space: nowrap; + white-space: pre-line; text-align: center; } From 80c1f375b86d40d3650e4d3120a9aaddd869f230 Mon Sep 17 00:00:00 2001 From: Abdulaziz Date: Thu, 16 Mar 2023 03:53:01 -0700 Subject: [PATCH 28/80] docs: fix announcementBar fixed height cutting content inside itself (#6934) (#6975) --- docs/src/css/index.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/css/index.css b/docs/src/css/index.css index bb8f5aac..c2ee21ee 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -31,6 +31,7 @@ --ifm-navbar-background-color: rgba(255, 255, 255, 0.95); --ifm-h1-font-size: 3rem; --ifm-h1-font-size: 2rem; + --docusaurus-announcement-bar-height: auto !important; } html[data-theme="dark"]:root { From 6695ff8503fdf59ae391a6d839e8305bb621f953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 12:51:18 +0100 Subject: [PATCH 29/80] chore: add missing outputs to Turbo cache --- turbo.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/turbo.json b/turbo.json index e51e2432..8d92dcfb 100644 --- a/turbo.json +++ b/turbo.json @@ -22,17 +22,18 @@ "@auth/core#build": { "dependsOn": ["^build"], "outputs": [ - "lib/**/*", - "providers/**/*", + "lib/**", + "providers/**", "*.js", "*.d.ts", "*.d.ts.map", - "src/lib/pages/styles.ts" + "src/lib/pages/styles.ts", + "src/providers/oauth-types.ts" ] }, "@auth/sveltekit#build": { "dependsOn": ["^build"], - "outputs": ["client.*", "index.*"] + "outputs": [".svelte-kit/**", "client.*", "index.*"] }, "clean": { "cache": false From 2e09bc0d19466f928b841c5927b7e4d3a884e847 Mon Sep 17 00:00:00 2001 From: Abdulaziz Askaraliev Date: Mon, 20 Mar 2023 04:55:57 -0700 Subject: [PATCH 30/80] docs: show close button (#7007) --- docs/src/css/index.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/src/css/index.css b/docs/src/css/index.css index c2ee21ee..a2fd92cd 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -101,6 +101,11 @@ html[data-theme="dark"] hr { border-color: #242526; } +/* Docusaurus announcementBar close button */ +.close { + color: inherit; +} + .home-main .code { padding: 0; height: 100%; From d1479125cb0a8ca662b6dfbcc858011f083e6261 Mon Sep 17 00:00:00 2001 From: Anti Revoluzzer Date: Mon, 20 Mar 2023 05:07:11 -0700 Subject: [PATCH 31/80] fix: make nonce work correctly (#6998) Co-authored-by: Anti Revoluzzer --- packages/core/src/lib/oauth/callback.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/src/lib/oauth/callback.ts b/packages/core/src/lib/oauth/callback.ts index 717fabaa..0552b52c 100644 --- a/packages/core/src/lib/oauth/callback.ts +++ b/packages/core/src/lib/oauth/callback.ts @@ -134,7 +134,8 @@ export async function handleOAuth( const result = await o.processAuthorizationCodeOpenIDResponse( as, client, - codeGrantResponse + codeGrantResponse, + nonce?.value ?? o.expectNoNonce ) if (o.isOAuth2Error(result)) { From 605d15c3ccc0198996ce7de6bfa8145c554041bf Mon Sep 17 00:00:00 2001 From: Gabriel Manor Date: Mon, 20 Mar 2023 18:42:11 +0200 Subject: [PATCH 32/80] docs: Add Permit.io Bronze Sponsor (#7008) --- packages/next-auth/README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/next-auth/README.md b/packages/next-auth/README.md index 719b6215..b1a61824 100644 --- a/packages/next-auth/README.md +++ b/packages/next-auth/README.md @@ -261,7 +261,16 @@ We're happy to announce we've recently created an [OpenCollective](https://openc
superblog

☁️ Infrastructure Support - + + + + + permit.io Logo +
+
Permit.io

+ 🥉 Bronze Financial Sponsor + +
From b5712448a1965741e3853e0b5100a446be5709df Mon Sep 17 00:00:00 2001 From: David Prothero Date: Mon, 20 Mar 2023 09:47:01 -0700 Subject: [PATCH 33/80] fix(docs): correct module name (#6996) --- packages/adapter-dynamodb/src/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/adapter-dynamodb/src/index.ts b/packages/adapter-dynamodb/src/index.ts index 92de5835..d1f64d59 100644 --- a/packages/adapter-dynamodb/src/index.ts +++ b/packages/adapter-dynamodb/src/index.ts @@ -9,10 +9,10 @@ * ## Installation * * ```bash npm2yarn2pnpm - * npm install next-auth @next-auth/dgraph-adapter + * npm install next-auth @next-auth/dyanamodb-adapter * ``` * - * @module @next-auth/dgraph-adapter + * @module @next-auth/dyanamodb-adapter */ import { v4 as uuid } from "uuid" @@ -160,7 +160,7 @@ export interface DynamoDBAdapterOptions { * * You can configure your custom table schema by passing the `options` key to the adapter constructor: * - * ``` + * ```javascript * const adapter = DynamoDBAdapter(client, { * tableName: "custom-table-name", * partitionKey: "custom-pk", @@ -169,6 +169,7 @@ export interface DynamoDBAdapterOptions { * indexPartitionKey: "custom-index-pk", * indexSortKey: "custom-index-sk", * }) + * ``` **/ export function DynamoDBAdapter( client: DynamoDBDocument, From 04e0637fd8314f7d23b05e8f077ab709b765677b Mon Sep 17 00:00:00 2001 From: James Billot Date: Mon, 20 Mar 2023 16:47:38 +0000 Subject: [PATCH 34/80] chore: fix typo in 'collectionsFactory' (#6985) --- packages/adapter-firebase/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/adapter-firebase/src/index.ts b/packages/adapter-firebase/src/index.ts index 64dade7f..577853e7 100644 --- a/packages/adapter-firebase/src/index.ts +++ b/packages/adapter-firebase/src/index.ts @@ -148,7 +148,7 @@ export function FirestoreAdapter( : { ...config, db: config?.firestore ?? initFirestore(config) } const preferSnakeCase = namingStrategy === "snake_case" - const C = collestionsFactory(db, preferSnakeCase) + const C = collectionsFactory(db, preferSnakeCase) const mapper = mapFieldsFactory(preferSnakeCase) return { @@ -403,7 +403,7 @@ export async function getDoc( } /** @internal */ -export function collestionsFactory( +export function collectionsFactory( db: FirebaseFirestore.Firestore, preferSnakeCase = false ) { From 6bdb8af78d7d587fefbb83eaea9bd018cbcb6c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 21:39:44 +0100 Subject: [PATCH 35/80] fix(test): export `_id` function for tests --- packages/adapter-mongodb/src/index.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index bba61210..90da4010 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -82,23 +82,24 @@ export const format = { }, } -function _id(hex?: string) { +/** @internal */ +export function _id(hex?: string) { if (hex?.length !== 24) return new ObjectId() return new ObjectId(hex) } /** - * ## Basic Usage + * #### Basic Usage * * The MongoDB adapter does not handle connections automatically, so you will have to make sure that you pass the Adapter a `MongoClient` that is connected already. Below you can see an example how to do this. * - * ### Installation + * ##### Installation * * ```bash npm2yarn2pnpm * npm install next-auth @next-auth/mongodb-adapter mongodb * ``` * - * ### Add the MongoDB client + * ##### Add the MongoDB client * * ```ts * // This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb @@ -133,7 +134,7 @@ function _id(hex?: string) { * export default clientPromise * ``` * - * ### Configure Auth.js + * ##### Configure Auth.js * * ```js * import NextAuth from "next-auth" From 46f285f6f094fe15e9f59f8b7367f33e5d914f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 21:45:25 +0100 Subject: [PATCH 36/80] chore: fix test --- packages/adapter-firebase/tests/index.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/adapter-firebase/tests/index.test.ts b/packages/adapter-firebase/tests/index.test.ts index 3420edb9..9418b0e2 100644 --- a/packages/adapter-firebase/tests/index.test.ts +++ b/packages/adapter-firebase/tests/index.test.ts @@ -2,7 +2,7 @@ import { runBasicTests } from "@next-auth/adapter-test" import { FirestoreAdapter, type FirebaseAdapterConfig } from "../src" import { - collestionsFactory, + collectionsFactory, initFirestore, getDoc, getOneDoc, @@ -22,7 +22,7 @@ describe.each([ const db = initFirestore(config) const preferSnakeCase = config.namingStrategy === "snake_case" const mapper = mapFieldsFactory(preferSnakeCase) - const C = collestionsFactory(db, preferSnakeCase) + const C = collectionsFactory(db, preferSnakeCase) for (const [name, collection] of Object.entries(C)) { test(`collection "${name}" should be empty`, async () => { From 6f2cb460c93db0fc80cb2ed49a8794617dbedc92 Mon Sep 17 00:00:00 2001 From: Thang Vu Date: Tue, 21 Mar 2023 03:50:25 +0700 Subject: [PATCH 37/80] feat: rewrite PouchDB Adapter (#6745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING CHANGE: Complete rewrite of the package. It is now published as ESM-only and written for `next-auth@4`. `next-auth@3` support is removed. --------- Co-authored-by: Balázs Orbán --- docs/docs/reference/06-adapters/pouchdb.md | 63 -- docs/docusaurus.config.js | 7 + docs/sidebars.js | 1 + .../static/img/adapters/pouchdb.svg | 0 package.json | 5 +- packages/adapter-pouchdb/CHANGELOG.md | 16 - packages/adapter-pouchdb/README.md | 98 +-- packages/adapter-pouchdb/package.json | 37 +- packages/adapter-pouchdb/src/index.ts | 773 +++++++++-------- packages/adapter-pouchdb/tests/index.test.ts | 256 ++---- packages/adapter-pouchdb/tsconfig.json | 14 +- packages/adapter-test/index.ts | 21 +- pnpm-lock.yaml | 808 ++++++++++++++---- turbo.json | 1 + 14 files changed, 1196 insertions(+), 904 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/pouchdb.md rename packages/adapter-pouchdb/logo.svg => docs/static/img/adapters/pouchdb.svg (100%) delete mode 100644 packages/adapter-pouchdb/CHANGELOG.md diff --git a/docs/docs/reference/06-adapters/pouchdb.md b/docs/docs/reference/06-adapters/pouchdb.md deleted file mode 100644 index ba49f2cb..00000000 --- a/docs/docs/reference/06-adapters/pouchdb.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -id: pouchdb -title: PouchDB ---- - -:::warning -This adapter is still experimental and does not work with Auth.js 4 or newer. If you would like to help out upgrading it, please [open a PR](https://github.com/nextauthjs/next-auth/tree/main/packages) -::: - -This is the PouchDB Adapter for [`next-auth`](https://authjs.dev). This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. - -Depending on your architecture you can use PouchDB's http adapter to reach any database compliant with the CouchDB protocol (CouchDB, Cloudant, ...) or use any other PouchDB compatible adapter (leveldb, in-memory, ...) - -## Getting Started - -> **Prerequisites**: Your PouchDB instance MUST provide the `pouchdb-find` plugin since it is used internally by the adapter to build and manage indexes - -1. Install `next-auth` and `@next-auth/pouchdb-adapter` - -```bash npm2yarn -npm install next-auth @next-auth/pouchdb-adapter -``` - -2. Add this adapter to your `pages/api/auth/[...nextauth].js` next-auth configuration object - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import GoogleProvider from "next-auth/providers/google" -import { PouchDBAdapter } from "@next-auth/pouchdb-adapter" -import PouchDB from "pouchdb" - -// Setup your PouchDB instance and database -PouchDB.plugin(require("pouchdb-adapter-leveldb")) // Any other adapter - .plugin(require("pouchdb-find")) // Don't forget the `pouchdb-find` plugin - -const pouchdb = new PouchDB("auth_db", { adapter: "leveldb" }) - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/ - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_ID, - clientSecret: process.env.GOOGLE_SECRET, - }), - ], - adapter: PouchDBAdapter(pouchdb), - // ... -}) -``` - -## Advanced - -### Memory-First Caching Strategy - -If you need to boost your authentication layer performance, you may use PouchDB's powerful sync features and various adapters, to build a memory-first caching strategy. - -Use an in-memory PouchDB as your main authentication database, and synchronize it with any other persisted PouchDB. You may do a one way, one-off replication at startup from the persisted PouchDB into the in-memory PouchDB, then two-way, continuous sync. - -This will most likely not increase performance much in a serverless environment due to various reasons such as concurrency, function startup time increases, etc. - -For more details, please see https://pouchdb.com/api.html#sync diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 65a8199f..a2b0b0ce 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -306,6 +306,13 @@ const docusaurusConfig = { ...createTypeDocAdapterConfig("MongoDB"), }, ], + [ + "docusaurus-plugin-typedoc", + { + ...typedocConfig, + ...createTypeDocAdapterConfig("PouchDB"), + }, + ], ], } diff --git a/docs/sidebars.js b/docs/sidebars.js index ccbd19b8..a791ccef 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -56,6 +56,7 @@ module.exports = { { type: "doc", id: "reference/adapter/firebase/index" }, { type: "doc", id: "reference/adapter/dynamodb/index" }, { type: "doc", id: "reference/adapter/fauna/index" }, + { type: "doc", id: "reference/adapter/pouchdb/index" }, { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, diff --git a/packages/adapter-pouchdb/logo.svg b/docs/static/img/adapters/pouchdb.svg similarity index 100% rename from packages/adapter-pouchdb/logo.svg rename to docs/static/img/adapters/pouchdb.svg diff --git a/package.json b/package.json index 9de0fbf2..6e075dd7 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build:app": "turbo run build --filter=next-auth-app", "build:docs": "turbo run build --filter=docs", "build": "turbo run build --filter=next-auth --filter=@next-auth/* --filter=@auth/* --no-deps", - "test": "turbo run test --concurrency=1 --filter=[HEAD^1] --filter=./packages/* --filter=!*pouchdb-* --filter=!@*upstash* --filter=!*dynamodb-*", + "test": "turbo run test --concurrency=1 --filter=[HEAD^1] --filter=./packages/* --filter=!@*upstash* --filter=!*dynamodb-*", "clean": "turbo run clean --no-cache", "dev:db": "turbo run dev --parallel --continue --filter=next-auth-app...", "dev": "turbo run dev --parallel --continue --filter=next-auth-app... --filter=!./packages/adapter-*", @@ -58,9 +58,6 @@ } ], "pnpm": { - "overrides": { - "undici": "5.11.0" - }, "patchedDependencies": { "@balazsorban/monorepo-release@0.1.8": "patches/@balazsorban__monorepo-release@0.1.8.patch" } diff --git a/packages/adapter-pouchdb/CHANGELOG.md b/packages/adapter-pouchdb/CHANGELOG.md deleted file mode 100644 index 0c71fd24..00000000 --- a/packages/adapter-pouchdb/CHANGELOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [0.1.3](https://github.com/nextauthjs/adapters/compare/@next-auth/pouchdb-adapter@0.1.2...@next-auth/pouchdb-adapter@0.1.3) (2021-08-17) - -**Note:** Version bump only for package @next-auth/pouchdb-adapter - -## [0.1.2](https://github.com/nextauthjs/adapters/compare/@next-auth/pouchdb-adapter@0.1.1...@next-auth/pouchdb-adapter@0.1.2) (2021-07-02) - -**Note:** Version bump only for package @next-auth/pouchdb-adapter - -## [0.1.1](https://github.com/nextauthjs/adapters/compare/@next-auth/pouchdb-adapter@0.1.0...@next-auth/pouchdb-adapter@0.1.1) (2021-06-30) - -**Note:** Version bump only for package @next-auth/pouchdb-adapter diff --git a/packages/adapter-pouchdb/README.md b/packages/adapter-pouchdb/README.md index b21c3adf..0d605941 100644 --- a/packages/adapter-pouchdb/README.md +++ b/packages/adapter-pouchdb/README.md @@ -1,78 +1,28 @@

-
-      -

PouchDB Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- CI Test - Bundle Size - @next-auth/pouchdb-adapter Version -

+
+ + + + + + +

PouchDB Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the PouchDB Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -Depending on your architecture you can use PouchDB's http adapter to reach any database compliant with the CouchDB protocol (CouchDB, Cloudant, ...) or use any other PouchDB compatible adapter (leveldb, in-memory, ...) - -## Getting Started - -1. Install `next-auth` and `@next-auth/pouchdb-adapter`, as well as `pouchdb`. - -> **Prerequisite**: Your PouchDB instance MUST provide the `pouchdb-find` plugin since it is used internally by the adapter to build and manage indexes - -```js -npm install next-auth @next-auth/pouchdb-adapter pouchdb -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import Providers from "next-auth/providers" -import { PouchDBAdapter } from "@next-auth/pouchdb-adapter" -import PouchDB from "pouchdb" - -// Setup your PouchDB instance and database -PouchDB.plugin(require("pouchdb-adapter-leveldb")) // Or any other PouchDB-compliant adapter - .plugin(require("pouchdb-find")) // Don't forget the `pouchdb-find` plugin - -const pouchdb = new PouchDB("auth_db", { adapter: "leveldb" }) - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [ - Providers.Google({ - clientId: process.env.GOOGLE_ID, - clientSecret: process.env.GOOGLE_SECRET, - }), - ], - adapter: PouchDBAdapter(pouchdb), - // ... -}) -``` - -## Advanced - -### Memory-First Caching Strategy - -If you need to boost your authentication layer performance, you may use PouchDB's powerful sync features and various adapters, to build a memory-first caching strategy. - -Use an in-memory PouchDB as your main authentication database, and synchronize it with any other persisted PouchDB. You may do a one way, one-off replication at startup from the persisted PouchDB into the in-memory PouchDB, then two-way, continuous, retriable sync. - -This will probably not improve performance much in a serverless environment for various reasons such as concurrency, function startup time increases, etc. - -For more details, please see https://pouchdb.com/api.html#sync - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/pouchdb). \ No newline at end of file diff --git a/packages/adapter-pouchdb/package.json b/packages/adapter-pouchdb/package.json index ebc03b5f..a180e335 100644 --- a/packages/adapter-pouchdb/package.json +++ b/packages/adapter-pouchdb/package.json @@ -8,7 +8,6 @@ "url": "https://github.com/nextauthjs/next-auth/issues" }, "author": "jpbourgeon (https://github.com/jpbourgeon)", - "main": "dist/index.js", "license": "ISC", "keywords": [ "next-auth", @@ -16,27 +15,35 @@ "oauth", "pouchdb" ], + "type": "module", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.js" + } + }, "private": false, "publishConfig": { "access": "public" }, "scripts": { - "build:wip": "tsc", - "tdd": "jest --watch", - "test:wip": "jest" + "build": "pnpm clean && tsc", + "clean": "rm -rf index.*", + "test": "jest", + "test:dev": "jest --watch" }, "files": [ - "README.md", - "dist" + "*.js", + "*.d.ts*", + "src" ], "peerDependencies": { - "next-auth": "^3", - "pouchdb": "^7.2.2", - "pouchdb-find": "^7.2.2" + "next-auth": "^4", + "pouchdb": "^8.0.1", + "pouchdb-find": "^8.0.1" }, "dependencies": { - "crypto": "^1.0.1", - "ulid": "^2.3.0" + "ulid": "2.3.0" }, "devDependencies": { "@next-auth/adapter-test": "workspace:*", @@ -44,11 +51,11 @@ "@types/pouchdb": "^6.4.0", "jest": "^27.4.3", "next-auth": "workspace:*", - "pouchdb": "^7.2.2", - "pouchdb-adapter-memory": "^7.2.2", - "pouchdb-find": "^7.2.2" + "pouchdb": "^8.0.1", + "pouchdb-adapter-memory": "^8.0.1", + "pouchdb-find": "^8.0.1" }, "jest": { "preset": "@next-auth/adapter-test/jest" } -} \ No newline at end of file +} diff --git a/packages/adapter-pouchdb/src/index.ts b/packages/adapter-pouchdb/src/index.ts index c3e6f208..aca57e22 100644 --- a/packages/adapter-pouchdb/src/index.ts +++ b/packages/adapter-pouchdb/src/index.ts @@ -1,359 +1,444 @@ -import type { Adapter } from "next-auth/adapters" -import { createHash, randomBytes } from "crypto" -import { Profile } from "next-auth" +/** + *
+ *

Official PouchDB adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth pouchdb pouchdb-find @next-auth/pouchdb-adapter + * npm install prisma --save-dev + * ``` + * + * @module @next-auth/pouchdb-adapter + */ + +import type { + Adapter, + AdapterAccount, + AdapterSession, + AdapterUser, + VerificationToken, +} from "next-auth/adapters" import { ulid } from "ulid" -type PouchdbDocument = PouchDB.Core.ExistingDocument<{ data: T }> -type PouchdbFindResponse = PouchDB.Find.FindResponse +type PrefixConfig = Record< + "user" | "account" | "session" | "verificationToken", + string +> +type IndexConfig = Record< + | "userByEmail" + | "accountByProviderId" + | "sessionByToken" + | "verificationTokenByToken", + string +> -interface PouchdbUser { - id: string - name?: string - email?: string - emailVerified?: Date | string - image?: string +/** + * Configure the adapter + */ +export interface PouchDBAdapterOptions { + /** + * Your PouchDB instance, with the `pouchdb-find` plugin installed. + * @example + * ```javascript + * import PouchDB from "pouchdb" + * + * PouchDB + * .plugin(require("pouchdb-adapter-leveldb")) // Or any other adapter + * .plugin(require("pouchdb-find")) // Don't forget the `pouchdb-find` plugin + * + * const pouchdb = new PouchDB("auth_db", { adapter: "leveldb" }) + */ + pouchdb: PouchDB.Database + /** + * Override the default prefix names. + * + * @default + * ```js + * { + * user: "USER", + * account: "ACCOUNT", + * session: "SESSION", + * verificationToken: "VERIFICATION-TOKEN" + * } + * ``` + */ + prefixes?: PrefixConfig + /** + * Override the default index names. + * + * @default + * ```js + * { + * userByEmail: "nextAuthUserByEmail", + * accountByProviderId: "nextAuthAccountByProviderId", + * sessionByToken: "nextAuthSessionByToken", + * verificationTokenByToken: "nextAuthVerificationRequestByToken" + * } + * ``` + */ + indexes?: IndexConfig } -interface PouchdbSession { - userId: string - expires: Date | string - sessionToken: string - accessToken: string -} +/** + * :::info + * Depending on your architecture you can use PouchDB's http adapter to reach any database compliant with the CouchDB protocol (CouchDB, Cloudant, ...) or use any other PouchDB compatible adapter (leveldb, in-memory, ...) + * ::: + * + * #### Basic usage + * + * :::note + * Your PouchDB instance MUST provide the `pouchdb-find` plugin since it is used internally by the adapter to build and manage indexes + * ::: + * + * Add this adapter to your `pages/api/auth/[...nextauth].js` next-auth configuration object: + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import GoogleProvider from "next-auth/providers/google" + * import { PouchDBAdapter } from "@next-auth/pouchdb-adapter" + * import PouchDB from "pouchdb" + * + * // Setup your PouchDB instance and database + * PouchDB + * .plugin(require("pouchdb-adapter-leveldb")) // Or any other adapter + * .plugin(require("pouchdb-find")) // Don't forget the `pouchdb-find` plugin + * + * const pouchdb = new PouchDB("auth_db", { adapter: "leveldb" }) + * + * // For more information on each option (and a full list of options) go to + * // https://authjs.dev/reference/configuration/auth-options + * export default NextAuth({ + * // https://authjs.dev/reference/providers/ + * providers: [ + * GoogleProvider({ + * clientId: process.env.GOOGLE_ID, + * clientSecret: process.env.GOOGLE_SECRET, + * }), + * ], + * adapter: PouchDBAdapter(pouchdb), + * // ... + * }) + * ``` + * + * #### Advanced usage + * + * ##### Memory-First Caching Strategy + * + * If you need to boost your authentication layer performance, you may use PouchDB's powerful sync features and various adapters, to build a memory-first caching strategy. + * + * Use an in-memory PouchDB as your main authentication database, and synchronize it with any other persisted PouchDB. You may do a one way, one-off replication at startup from the persisted PouchDB into the in-memory PouchDB, then two-way, continuous sync. + * + * This will most likely not increase performance much in a serverless environment due to various reasons such as concurrency, function startup time increases, etc. + * + * For more details, please see https://pouchdb.com/api.html#sync + * + */ +export function PouchDBAdapter(options: PouchDBAdapterOptions): Adapter { + const { pouchdb } = options + const { + userByEmail = "nextAuthUserByEmail", + accountByProviderId = "nextAuthAccountByProviderId", + sessionByToken = "nextAuthSessionByToken", + verificationTokenByToken = "nextAuthVerificationRequestByToken", + } = options?.indexes ?? {} + const { + user: userPrefix = "USER", + account: accountPrefix = "ACCOUNT", + session: sessionPrefix = "SESSION", + verificationToken: verificationTokenPrefix = "VERIFICATION-TOKEN", + } = options?.prefixes ?? {} -interface PouchdbAccount { - id: string - userId: string - providerType: string - providerId: string - providerAccountId: string - refreshToken: string | null - accessToken: string | null - accessTokenExpires: Date | null -} - -export const PouchDBAdapter: Adapter< - PouchDB.Database, - never, - PouchdbUser, - Profile & { emailVerified?: Date }, - PouchdbSession -> = (pouchdb) => { return { - async getAdapter({ session, secret, ...appOptions }) { - // create PouchDB indexes if they don't exist - const res = await pouchdb.getIndexes() - const indexes = res.indexes.map((index) => index.name, []) - if (!indexes.includes("nextAuthUserByEmail")) { - await pouchdb.createIndex({ - index: { - name: "nextAuthUserByEmail", - ddoc: "nextAuthUserByEmail", - fields: ["data.email"], + async createUser(user) { + const doc = { ...user, _id: [userPrefix, ulid()].join("_") } + await pouchdb.put(doc) + return { ...user, id: doc._id } + }, + + async getUser(id) { + try { + const res = await pouchdb.get(id) + return toAdapterUser(res) + } catch { + return null + } + }, + + async getUserByEmail(email) { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ + use_index: userByEmail, + selector: { email: { $eq: email } }, + limit: 1, + }) + const userDoc = res.docs[0] + if (userDoc) { + return toAdapterUser(userDoc) + } + return null + }, + + async getUserByAccount({ provider, providerAccountId }) { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ + use_index: accountByProviderId, + selector: { + provider: { $eq: provider }, + providerAccountId: { $eq: providerAccountId }, + }, + limit: 1, + }) + const account = res.docs[0] + if (account) { + const user = await ( + pouchdb as unknown as PouchDB.Database + ).get(account.userId) + return toAdapterUser(user) ?? null + } + return null + }, + + async updateUser(user) { + const doc = await ( + pouchdb as unknown as PouchDB.Database + ).get(user.id!) + const newUser = { + ...doc, + ...user, + } + await pouchdb.put(newUser) + return toAdapterUser(newUser) + }, + + /** @todo Implement */ + async deleteUser(id) {}, + + async linkAccount(account) { + const doc = { ...account, _id: [accountPrefix, ulid()].join("_") } + await (pouchdb as unknown as PouchDB.Database).put(doc) + + return { ...account, id: doc._id } + }, + + async unlinkAccount({ provider, providerAccountId }) { + const _account = await ( + pouchdb as unknown as PouchDB.Database + ).find({ + use_index: accountByProviderId, + selector: { + provider: { $eq: provider }, + providerAccountId: { $eq: providerAccountId }, + }, + limit: 1, + }) + await pouchdb.put({ + ..._account.docs[0], + _deleted: true, + }) + }, + + async createSession(data) { + const doc = { + _id: [sessionPrefix, ulid()].join("_"), + ...data, + } + await (pouchdb as unknown as PouchDB.Database).put(doc) + return { ...data, id: doc._id } + }, + + async getSessionAndUser(sessionToken) { + const session = ( + await ( + pouchdb as unknown as PouchDB.Database< + AdapterSession & { user: AdapterUser } + > + ).find({ + use_index: sessionByToken, + selector: { + sessionToken: { $eq: sessionToken }, }, + limit: 1, }) + ).docs[0] + + if (session) { + const user = await ( + pouchdb as unknown as PouchDB.Database + ).get(session.userId) + return { session: toAdapterSession(session), user: toAdapterUser(user) } } - if (!indexes.includes("nextAuthAccountByProviderId")) { - await pouchdb.createIndex({ - index: { - name: "nextAuthAccountByProviderId", - ddoc: "nextAuthAccountByProviderId", - fields: ["data.providerId", "data.providerAccountId"], - }, + return null + }, + + async updateSession(data) { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ + use_index: sessionByToken, + selector: { + sessionToken: { $eq: data.sessionToken }, + }, + limit: 1, + }) + const previousSessionDoc = res.docs[0] + if (previousSessionDoc) { + const currentSessionDoc = { + ...previousSessionDoc, + ...data, + } + await pouchdb.put(currentSessionDoc) + return toAdapterSession(currentSessionDoc) + } + return null + }, + + async deleteSession(sessionToken) { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ + use_index: sessionByToken, + selector: { + sessionToken: { $eq: sessionToken }, + }, + limit: 1, + }) + const sessionDoc = res.docs[0] + await pouchdb.put({ + ...sessionDoc, + _deleted: true, + }) + }, + + async createVerificationToken(data) { + await (pouchdb as unknown as PouchDB.Database).put({ + _id: [verificationTokenPrefix, ulid()].join("_"), + ...data, + }) + + return data + }, + + async useVerificationToken({ identifier, token }) { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ + use_index: verificationTokenByToken, + selector: { + identifier: { $eq: identifier }, + token: { $eq: token }, + }, + limit: 1, + }) + const verificationRequestDoc = res.docs[0] + if (verificationRequestDoc) { + await pouchdb.put({ + ...verificationRequestDoc, + _deleted: true, }) + return toVerificationToken(verificationRequestDoc) } - if (!indexes.includes("nextAuthSessionByToken")) { - await pouchdb.createIndex({ - index: { - name: "nextAuthSessionByToken", - ddoc: "nextAuthSessionByToken", - fields: ["data.sessionToken"], - }, - }) - } - if (!indexes.includes("nextAuthVerificationRequestByToken")) { - await pouchdb.createIndex({ - index: { - name: "nextAuthVerificationRequestByToken", - ddoc: "nextAuthVerificationRequestByToken", - fields: ["data.identifier", "data.token"], - }, - }) - } - - const sessionMaxAge = session.maxAge * 1000 // default is 30 days - const sessionUpdateAge = session.updateAge * 1000 // default is 1 day - - const hashToken = (token: string) => - createHash("sha256").update(`${token}${secret}`).digest("hex") - - return { - displayName: "POUCHDB", - - async createUser(profile) { - const data = { - ...profile, - id: ["USER", ulid()].join("_"), - } - - await pouchdb.put({ - _id: data.id, - data, - }) - return data - }, - - async getUser(id) { - const res: PouchdbDocument = await pouchdb.get(id) - if (typeof res.data?.emailVerified === "string") { - res.data.emailVerified = new Date(res.data.emailVerified) - } - - return res?.data ?? null - }, - - async getUserByEmail(email) { - const res: PouchdbFindResponse = await pouchdb.find({ - use_index: "nextAuthUserByEmail", - selector: { "data.email": { $eq: email } }, - limit: 1, - }) - const userDoc: PouchdbDocument = res.docs[0] - if (userDoc?.data) { - const user = userDoc.data - if (typeof user.emailVerified === "string") - user.emailVerified = new Date(user.emailVerified) - return user - } - return null - }, - - async getUserByProviderAccountId(providerId, providerAccountId) { - const res: PouchdbFindResponse = await pouchdb.find({ - use_index: "nextAuthAccountByProviderId", - selector: { - "data.providerId": { $eq: providerId }, - "data.providerAccountId": { $eq: providerAccountId }, - }, - limit: 1, - }) - const accountDoc: PouchdbDocument = res.docs[0] - if (accountDoc?.data) { - const userDoc: PouchdbDocument = await pouchdb.get( - accountDoc.data.userId - ) - return userDoc?.data ?? null - } - return null - }, - - async updateUser(user: PouchdbUser & { id: string }) { - const update = { ...user } - const doc: PouchdbDocument = await pouchdb.get(user.id) - doc.data = { - ...doc.data, - ...update, - } - await pouchdb.put(doc) - return doc.data - }, - - async deleteUser(id) { - const doc: PouchdbDocument = await pouchdb.get(id) - await pouchdb.put({ - ...doc, - _deleted: true, - }) - }, - - async linkAccount( - userId, - providerId, - providerType, - providerAccountId, - refreshToken, - accessToken, - accessTokenExpires - ) { - await pouchdb.put({ - _id: ["ACCOUNT", ulid()].join("_"), - data: { - userId, - providerId, - providerType, - providerAccountId, - refreshToken, - accessToken, - accessTokenExpires: - accessTokenExpires != null - ? new Date(accessTokenExpires) - : null, - }, - }) - }, - - async unlinkAccount(_, providerId, providerAccountId) { - const account = await pouchdb.find({ - use_index: "nextAuthAccountByProviderId", - selector: { - "data.providerId": { $eq: providerId }, - "data.providerAccountId": { $eq: providerAccountId }, - }, - limit: 1, - }) - await pouchdb.put({ - ...account.docs[0], - _deleted: true, - }) - }, - - async createSession(user: PouchdbUser & { id: string }) { - const data = { - userId: user.id, - sessionToken: randomBytes(32).toString("hex"), - accessToken: randomBytes(32).toString("hex"), - expires: new Date(Date.now() + sessionMaxAge), - } - await pouchdb.put({ - _id: ["SESSION", ulid()].join("_"), - data, - }) - return data - }, - - async getSession(sessionToken) { - const res: PouchdbFindResponse = await pouchdb.find({ - use_index: "nextAuthSessionByToken", - selector: { - "data.sessionToken": { $eq: sessionToken }, - }, - limit: 1, - }) - const sessionDoc: PouchdbDocument = res.docs[0] - if (sessionDoc.data) { - const session = sessionDoc.data - if (new Date(session?.expires ?? Infinity) < new Date()) { - await pouchdb.put({ ...sessionDoc, _deleted: true }) - return null - } - return { ...session, expires: new Date(session?.expires ?? "") } - } - return null - }, - - async updateSession(session, force) { - if ( - !force && - Number(session.expires) - sessionMaxAge + sessionUpdateAge > - Date.now() - ) { - return null - } - const res: PouchdbFindResponse = await pouchdb.find({ - use_index: "nextAuthSessionByToken", - selector: { - "data.sessionToken": { $eq: session.sessionToken }, - }, - limit: 1, - }) - const previousSessionDoc: PouchdbDocument = - res.docs[0] - if (previousSessionDoc?.data) { - const currentSessionDoc: PouchdbDocument = { - ...previousSessionDoc, - data: { - ...previousSessionDoc.data, - expires: new Date(Date.now() + sessionMaxAge), - }, - } - await pouchdb.put(currentSessionDoc) - return currentSessionDoc.data - } - return null - }, - - async deleteSession(sessionToken) { - const res = await pouchdb.find({ - use_index: "nextAuthSessionByToken", - selector: { - "data.sessionToken": { $eq: sessionToken }, - }, - limit: 1, - }) - const sessionDoc = res.docs[0] - await pouchdb.put({ - ...sessionDoc, - _deleted: true, - }) - }, - - async createVerificationRequest(identifier, url, token, _, provider) { - const hashedToken = hashToken(token) - const data = { - identifier, - token: hashedToken, - expires: new Date(Date.now() + provider.maxAge * 1000), - } - await pouchdb.put({ - _id: ["VERIFICATION-REQUEST", ulid()].join("_"), - data, - }) - await provider.sendVerificationRequest({ - identifier, - url, - token, - baseUrl: appOptions.baseUrl, - provider, - }) - }, - - async getVerificationRequest(identifier, token) { - const hashedToken = hashToken(token) - const res: PouchdbFindResponse = await pouchdb.find({ - use_index: "nextAuthVerificationRequestByToken", - selector: { - "data.identifier": { $eq: identifier }, - "data.token": { $eq: hashedToken }, - }, - limit: 1, - }) - const verificationRequestDoc = res.docs[0] - if (verificationRequestDoc?.data) { - const verificationRequest = verificationRequestDoc.data - if ( - new Date(verificationRequest?.expires ?? Infinity) < new Date() - ) { - await pouchdb.put({ - ...verificationRequestDoc, - _deleted: true, - }) - return null - } - return { - ...verificationRequest, - expires: new Date(verificationRequest?.expires ?? ""), - } - } - return null - }, - - async deleteVerificationRequest(identifier, token) { - const hashedToken = hashToken(token) - const res = await pouchdb.find({ - use_index: "nextAuthVerificationRequestByToken", - selector: { - "data.identifier": { $eq: identifier }, - "data.token": { $eq: hashedToken }, - }, - limit: 1, - }) - const verificationRequestDoc = res.docs[0] - await pouchdb.put({ - ...verificationRequestDoc, - _deleted: true, - }) - }, - } + return null }, } } + +export async function createIndexes( + pouchdb: PouchDB.Database, + indexes?: IndexConfig +) { + const { + userByEmail = "nextAuthUserByEmail", + accountByProviderId = "nextAuthAccountByProviderId", + sessionByToken = "nextAuthSessionByToken", + verificationTokenByToken = "nextAuthVerificationRequestByToken", + } = indexes ?? {} + await Promise.allSettled([ + await pouchdb.createIndex({ + index: { + name: userByEmail, + ddoc: userByEmail, + fields: ["email"], + }, + }), + await pouchdb.createIndex({ + index: { + name: accountByProviderId, + ddoc: accountByProviderId, + fields: ["provider", "providerAccountId"], + }, + }), + await pouchdb.createIndex({ + index: { + name: sessionByToken, + ddoc: sessionByToken, + fields: ["sessionToken"], + }, + }), + await pouchdb.createIndex({ + index: { + name: verificationTokenByToken, + ddoc: verificationTokenByToken, + fields: ["identifier", "token"], + }, + }), + ]) +} + +/** @internal */ +function toAdapter( + dbObject: T & PouchDB.Core.IdMeta & PouchDB.Core.GetMeta +) { + const { + _id, + _rev, + _conflicts, + _attachments, + _revisions, + _revs_info, + ...rest + } = dbObject + return { ...rest } +} + +/** @internal */ +export function toAdapterUser( + user: AdapterUser & PouchDB.Core.IdMeta & PouchDB.Core.GetMeta +) { + if (typeof user?.emailVerified === "string") + user.emailVerified = new Date(user.emailVerified) + return { ...toAdapter(user), id: user._id } +} + +/** @internal */ +export function toAdapterSession( + session: AdapterSession & PouchDB.Core.IdMeta & PouchDB.Core.GetMeta +) { + if (typeof session?.expires === "string") + session.expires = new Date(session.expires) + return { ...toAdapter(session), id: session._id } +} + +/** @internal */ +export function toAdapterAccount( + account: AdapterAccount & PouchDB.Core.IdMeta & PouchDB.Core.GetMeta +) { + return { ...toAdapter(account), id: account._id } +} + +/** @internal */ +export function toVerificationToken( + verificationToken: VerificationToken & + PouchDB.Core.IdMeta & + PouchDB.Core.GetMeta +) { + if (typeof verificationToken?.expires === "string") + verificationToken.expires = new Date(verificationToken.expires) + return { ...toAdapter(verificationToken) } +} diff --git a/packages/adapter-pouchdb/tests/index.test.ts b/packages/adapter-pouchdb/tests/index.test.ts index bb8f8a83..fb4ae028 100644 --- a/packages/adapter-pouchdb/tests/index.test.ts +++ b/packages/adapter-pouchdb/tests/index.test.ts @@ -1,19 +1,27 @@ -import type { AppOptions } from "next-auth/internals" -import { createHash } from "crypto" -import PouchDB from "pouchdb" -import memoryAdapter from "pouchdb-adapter-memory" -import find from "pouchdb-find" -import { ulid } from "ulid" -import Providers from "next-auth/providers" -import { PouchDBAdapter } from "../src" import { runBasicTests } from "@next-auth/adapter-test" +import { + createIndexes, + PouchDBAdapter, + toAdapterAccount, + toAdapterSession, + toAdapterUser, + toVerificationToken, +} from "../src" +import PouchDB from "pouchdb" +import find from "pouchdb-find" +import memoryAdapter from "pouchdb-adapter-memory" +import { ulid } from "ulid" +import { + AdapterAccount, + AdapterSession, + AdapterUser, + VerificationToken, +} from "next-auth/adapters" // pouchdb setup PouchDB.plugin(memoryAdapter).plugin(find) let pouchdb: PouchDB.Database let pouchdbIsDestroyed: boolean = false -let pouchdbAdapter: any -let adapter: any PouchDB.on("created", function () { pouchdbIsDestroyed = false }) @@ -23,208 +31,66 @@ PouchDB.on("destroyed", function () { const disconnect = async () => { if (!pouchdbIsDestroyed) await pouchdb.destroy() } +pouchdb = new PouchDB(ulid(), { adapter: "memory" }) // Basic tests -pouchdb = new PouchDB(ulid(), { adapter: "memory" }) -pouchdbAdapter = PouchDBAdapter(pouchdb) - runBasicTests({ - adapter: pouchdbAdapter, + adapter: PouchDBAdapter({ pouchdb }), + skipTests: ["deleteUser"], db: { + async connect() { + await createIndexes(pouchdb) + }, disconnect, - async session(sessionToken) { - const res = await pouchdb.find({ - use_index: "nextAuthSessionByToken", - selector: { - "data.sessionToken": { $eq: sessionToken }, - }, - limit: 1, - }) - const doc: any = res.docs[0] - return doc?.data ?? null + user: async (id) => { + try { + const res = await pouchdb.get(id) + + return toAdapterUser(res) + } catch { + return null + } }, - async expireSession(sessionToken, expires) { - const res = await pouchdb.find({ - use_index: "nextAuthSessionByToken", - selector: { - "data.sessionToken": { $eq: sessionToken }, - }, - limit: 1, - }) - const doc: any = res.docs[0] - doc.data.expires = expires.toISOString() - await pouchdb.put({ - ...doc, - }) - doc.data.expires = expires - return doc?.data ?? null - }, - async user(id) { - const res: any = await pouchdb.get(id) - return res.data - }, - async account(providerId, providerAccountId) { - const res = await pouchdb.find({ + account: async ({ provider, providerAccountId }) => { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ use_index: "nextAuthAccountByProviderId", selector: { - "data.providerId": { $eq: providerId }, - "data.providerAccountId": { $eq: providerAccountId }, + provider: { $eq: provider }, + providerAccountId: { $eq: providerAccountId }, }, limit: 1, }) - const doc: any = res.docs[0] - return doc?.data ?? null + const doc = res.docs[0] + return doc ? toAdapterAccount(doc) : null }, - async verificationRequest(identifier, token) { - const res = await pouchdb.find({ + session: async (sessionToken) => { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ + use_index: "nextAuthSessionByToken", + selector: { + sessionToken: { $eq: sessionToken }, + }, + limit: 1, + }) + const doc = res.docs[0] + return doc ? toAdapterSession(doc) : null + }, + async verificationToken({ identifier, token }) { + const res = await ( + pouchdb as unknown as PouchDB.Database + ).find({ use_index: "nextAuthVerificationRequestByToken", selector: { - "data.identifier": { $eq: identifier }, - "data.token": { $eq: token }, + identifier: { $eq: identifier }, + token: { $eq: token }, }, limit: 1, }) - const doc: any = res.docs[0] - const verificationRequest = doc?.data ?? null - if (verificationRequest?.expires) { - return { - ...verificationRequest, - expires: new Date(verificationRequest.expires), - } - } - return null - }, - }, - mock: { - user: { - emailVerified: new Date("2017-01-01"), + const verificationRequest = res.docs[0] + return toVerificationToken(verificationRequest) }, }, }) - -// Custom tests - -// Prevent "ReferenceError: You are trying to import a file after the Jest environment has been torn down" https://stackoverflow.com/questions/50793885/referenceerror-you-are-trying-to-import-a-file-after-the-jest-environment-has#50793993 -// jest.useFakeTimers() - -const sendVerificationRequestMock = jest.fn() - -const emailProvider = { - ...Providers.Email({ - sendVerificationRequest: sendVerificationRequestMock, - }), -} - -const appOptions: AppOptions = { - action: "signin", - basePath: "", - baseUrl: "", - callbacks: {}, - cookies: {}, - debug: false, - events: {}, - jwt: {}, - theme: "auto", - logger: { - debug: jest.fn(), - warn: jest.fn(), - error: jest.fn(), - } as const, - pages: {}, - providers: [], - secret: "", - session: { - jwt: false, - maxAge: 60 * 60 * 24 * 30, - updateAge: 60 * 60 * 24, - }, - adapter: pouchdbAdapter, -} - -const mock = { - user: { - email: "EMAIL", - name: "NAME", - image: "IMAGE", - }, - updatedUser: { - email: "UPDATED_EMAIL", - name: "UPDATED_NAME", - image: "UPDATED_IMAGE", - }, - account: { - providerId: "PROVIDER_ID", - providerType: "PROVIDER_TYPE", - providerAccountId: "PROVIDER_ACCOUNT_ID", - refreshToken: "REFRESH_TOKEN", - accessToken: "ACCESS_TOKEN", - accessTokenExpires: 0, - }, - session: { - sessionToken: "SESSION_TOKEN", - accessToken: "ACCESS_TOKEN", - expires: new Date(Date.now() + 10000).toISOString(), - }, - verificationRequest: { - identifier: "IDENTIFIER", - url: "URL", - token: createHash("sha256").update(`${"TOKEN"}${"SECRET"}`).digest("hex"), - baseUrl: appOptions.baseUrl, - provider: emailProvider, - }, - TOKEN: "TOKEN", - SECRET: "SECRET", -} -describe("Additional tests", () => { - beforeEach(async () => { - try { - pouchdb = new PouchDB(ulid(), { adapter: "memory" }) - pouchdbAdapter = PouchDBAdapter(pouchdb) - adapter = await pouchdbAdapter.getAdapter({ ...appOptions }) - } catch (error) { - console.log(error) - } - }) - - afterEach(async () => await disconnect()) - - test.skip("deleteUser", async () => { - const id = ["USER", ulid()].join("_") - await pouchdb.put({ _id: id, data: { id, ...mock.user } }) - - await adapter.deleteUser(id) - - const res = await pouchdb.get(id).catch((e) => e.status) - expect(res).toBe(404) - }) - - test.skip("unlinkAccount", async () => { - const userId = ["USER", ulid()].join("_") - const accountId = ["ACCOUNT", ulid()].join("_") - await pouchdb.put({ _id: userId, data: { id: userId, ...mock.user } }) - await pouchdb.put({ - _id: accountId, - data: { - ...mock.account, - userId, - accessTokenExpires: new Date(mock.account.accessTokenExpires), - }, - }) - - await adapter.unlinkAccount( - userId, - mock.account.providerId, - mock.account.providerAccountId - ) - - const res: any = await pouchdb.find({ - use_index: "nextAuthAccountByProviderId", - selector: { - "data.providerId": { $eq: mock.account.providerId }, - "data.providerAccountId": { $eq: mock.account.providerAccountId }, - }, - limit: 1, - }) - expect(res.docs).toHaveLength(0) - }) -}) diff --git a/packages/adapter-pouchdb/tsconfig.json b/packages/adapter-pouchdb/tsconfig.json index 81adefcd..47f6df20 100644 --- a/packages/adapter-pouchdb/tsconfig.json +++ b/packages/adapter-pouchdb/tsconfig.json @@ -2,8 +2,16 @@ "extends": "@next-auth/tsconfig/tsconfig.adapters.json", "compilerOptions": { "rootDir": "src", - "outDir": "dist", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "outDir": ".", + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "node", + "skipDefaultLibCheck": true, + "strictNullChecks": true, + "stripInternal": true, + "declarationMap": true, + "declaration": true }, - "exclude": ["tests", "dist", "jest.config.js"] + "exclude": ["tests", "jest.config.js"] } diff --git a/packages/adapter-test/index.ts b/packages/adapter-test/index.ts index 13a8bc56..2cc67dfa 100644 --- a/packages/adapter-test/index.ts +++ b/packages/adapter-test/index.ts @@ -1,6 +1,18 @@ import type { Adapter } from "next-auth/adapters" import { createHash, randomUUID } from "crypto" +const requiredMethods = [ + "createUser", + "getUser", + "getUserByEmail", + "getUserByAccount", + "updateUser", + "linkAccount", + "createSession", + "getSessionAndUser", + "updateSession", + "deleteSession", +] export interface TestOptions { adapter: Adapter db: { @@ -31,21 +43,22 @@ export interface TestOptions { */ verificationToken: (params: { identifier: string; token: string }) => any } + skipTests?: string[] } - +const testIf = (condition: boolean) => (condition ? test : test.skip) /** * A wrapper to run the most basic tests. * Run this at the top of your test file. * You can add additional tests below, if you wish. */ -export function runBasicTests(options: TestOptions) { +export async function runBasicTests(options: TestOptions) { const id = options.db.id ?? randomUUID // Init beforeAll(async () => { await options.db.connect?.() }) - const { adapter, db } = options + const { adapter, db, skipTests } = options afterAll(async () => { // @ts-expect-error This is only used for the TypeORM adapter @@ -287,7 +300,7 @@ export function runBasicTests(options: TestOptions) { expect(dbAccount).toBeNull() }) - test("deleteUser", async () => { + testIf(!skipTests?.includes("deleteUser"))("deleteUser", async () => { let dbUser = await db.user(user.id) expect(dbUser).toEqual(user) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17f94f95..46a2a655 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,8 +1,5 @@ lockfileVersion: 5.4 -overrides: - undici: 5.11.0 - patchedDependencies: '@balazsorban/monorepo-release@0.1.8': hash: 75pao37sq3m6hqdrtxyjcxjfry @@ -136,7 +133,7 @@ importers: vercel: ^23.1.2 dependencies: dotenv: 16.0.3 - gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.3_biqbaboplfbrettd7655fr4n2y next-auth: link:../../../packages/next-auth react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -344,15 +341,13 @@ importers: '@next-auth/adapter-test': workspace:* '@next-auth/tsconfig': workspace:* '@types/pouchdb': ^6.4.0 - crypto: ^1.0.1 jest: ^27.4.3 next-auth: workspace:* - pouchdb: ^7.2.2 - pouchdb-adapter-memory: ^7.2.2 - pouchdb-find: ^7.2.2 - ulid: ^2.3.0 + pouchdb: ^8.0.1 + pouchdb-adapter-memory: ^8.0.1 + pouchdb-find: ^8.0.1 + ulid: 2.3.0 dependencies: - crypto: 1.0.1 ulid: 2.3.0 devDependencies: '@next-auth/adapter-test': link:../adapter-test @@ -360,9 +355,9 @@ importers: '@types/pouchdb': 6.4.0 jest: 27.5.1 next-auth: link:../next-auth - pouchdb: 7.3.0 - pouchdb-adapter-memory: 7.3.0 - pouchdb-find: 7.3.0 + pouchdb: 8.0.1 + pouchdb-adapter-memory: 8.0.1 + pouchdb-find: 8.0.1 packages/adapter-prisma: specifiers: @@ -10478,7 +10473,7 @@ packages: sirv: 2.0.2 svelte: 3.55.0 tiny-glob: 0.2.9 - undici: 5.11.0 + undici: 5.14.0 vite: 4.0.1 transitivePeerDependencies: - supports-color @@ -10506,7 +10501,7 @@ packages: sirv: 2.0.2 svelte: 3.54.0 tiny-glob: 0.2.9 - undici: 5.11.0 + undici: 5.14.0 vite: 4.0.1 transitivePeerDependencies: - supports-color @@ -11051,7 +11046,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 17.0.45 + '@types/node': 18.11.10 '@types/responselike': 1.0.0 dev: false @@ -11096,7 +11091,7 @@ packages: /@types/cors/2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: false /@types/debug/0.0.30: @@ -11155,7 +11150,7 @@ packages: /@types/express-serve-static-core/4.17.31: resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -11192,7 +11187,7 @@ packages: resolution: {integrity: sha512-ATA/xrS7CZ3A2WCPVY4eKdNpybq56zqlTirnHhhyOztZM/lPxJzusOBI3BsaXbu6FrUluqzvMlI4sZ6BDYMlMg==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: false /@types/glob/7.2.0: @@ -11228,7 +11223,7 @@ packages: /@types/http-proxy/1.17.9: resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 /@types/istanbul-lib-coverage/2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} @@ -11291,7 +11286,7 @@ packages: /@types/jsonwebtoken/8.5.9: resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/keyv/3.1.4: @@ -11347,7 +11342,7 @@ packages: /@types/mkdirp/0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: false /@types/ms/0.7.31: @@ -11625,7 +11620,7 @@ packages: resolution: {integrity: sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==} dependencies: '@types/glob': 7.2.0 - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: false /@types/sass/1.43.1: @@ -11670,7 +11665,7 @@ packages: resolution: {integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==} requiresBuild: true dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: false /@types/shelljs/0.8.11: @@ -12686,10 +12681,8 @@ packages: indent-string: 4.0.0 dev: true - /ajv-formats/2.1.1_ajv@8.11.0: + /ajv-formats/2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -12950,10 +12943,6 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /argsarray/0.0.1: - resolution: {integrity: sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg==} - dev: true - /argv-formatter/1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} dev: true @@ -13082,13 +13071,6 @@ packages: engines: {node: '>=8'} dev: false - /async-cache/1.1.0: - resolution: {integrity: sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==} - deprecated: No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option. - dependencies: - lru-cache: 4.1.5 - dev: false - /async-lock/1.3.2: resolution: {integrity: sha512-phnXdS3RP7PPcmP6NWWzWMU0sLTeyvtZCxBPpZdkYE3seGLKSQZs9FrmVO/qwypq98FUtWWUEYxziLkdGk5nnA==} dev: true @@ -13596,7 +13578,7 @@ packages: - supports-color dev: true - /babel-plugin-remove-graphql-queries/5.8.0-next.0_u7ozffrhm6o22jdb3uxxwj2pzm: + /babel-plugin-remove-graphql-queries/5.8.0-next.0_7pg6or64vhdsz7wls4jdrjahzm: resolution: {integrity: sha512-emjOEAt/rnb1eGC1ximT3/Rs1i6U6DT2K385uteLPsGsZ8s6fCPvmzm8TLjRM3iWT4LTVc9OBGghkFPCJ8C6Vg==} engines: {node: '>=18.0.0'} peerDependencies: @@ -13606,7 +13588,7 @@ packages: '@babel/core': 7.20.12 '@babel/runtime': 7.20.13 '@babel/types': 7.20.7 - gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.3_biqbaboplfbrettd7655fr4n2y gatsby-core-utils: 4.8.0-next.0 dev: false @@ -15186,11 +15168,6 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} - /crypto/1.0.1: - resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} - deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. - dev: false - /css-color-keywords/1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} @@ -15212,6 +15189,7 @@ packages: postcss: ^8.0.9 dependencies: postcss: 8.4.19 + dev: true /css-declaration-sorter/6.3.1_postcss@8.4.20: resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} @@ -15222,19 +15200,28 @@ packages: postcss: 8.4.20 dev: true + /css-declaration-sorter/6.3.1_postcss@8.4.21: + resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.21 + dev: false + /css-loader/5.2.7_webpack@5.75.0: resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} engines: {node: '>= 10.13.0'} peerDependencies: webpack: ^4.27.0 || ^5.0.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.19 + icss-utils: 5.1.0_postcss@8.4.21 loader-utils: 2.0.4 - postcss: 8.4.19 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.19 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.19 - postcss-modules-scope: 3.0.0_postcss@8.4.19 - postcss-modules-values: 4.0.0_postcss@8.4.19 + postcss: 8.4.21 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.21 + postcss-modules-local-by-default: 4.0.0_postcss@8.4.21 + postcss-modules-scope: 3.0.0_postcss@8.4.21 + postcss-modules-values: 4.0.0_postcss@8.4.21 postcss-value-parser: 4.2.0 schema-utils: 3.1.1 semver: 7.3.8 @@ -15271,10 +15258,10 @@ packages: csso: optional: true dependencies: - cssnano: 5.1.14_postcss@8.4.19 + cssnano: 5.1.14_postcss@8.4.21 jest-worker: 26.6.2 p-limit: 3.1.0 - postcss: 8.4.19 + postcss: 8.4.21 schema-utils: 3.1.1 serialize-javascript: 5.0.1 source-map: 0.6.1 @@ -15491,6 +15478,45 @@ packages: postcss-reduce-transforms: 5.1.0_postcss@8.4.19 postcss-svgo: 5.1.0_postcss@8.4.19 postcss-unique-selectors: 5.1.1_postcss@8.4.19 + dev: true + + /cssnano-preset-default/5.2.13_postcss@8.4.21: + resolution: {integrity: sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.3.1_postcss@8.4.21 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-calc: 8.2.4_postcss@8.4.21 + postcss-colormin: 5.3.0_postcss@8.4.21 + postcss-convert-values: 5.1.3_postcss@8.4.21 + postcss-discard-comments: 5.1.2_postcss@8.4.21 + postcss-discard-duplicates: 5.1.0_postcss@8.4.21 + postcss-discard-empty: 5.1.1_postcss@8.4.21 + postcss-discard-overridden: 5.1.0_postcss@8.4.21 + postcss-merge-longhand: 5.1.7_postcss@8.4.21 + postcss-merge-rules: 5.1.3_postcss@8.4.21 + postcss-minify-font-values: 5.1.0_postcss@8.4.21 + postcss-minify-gradients: 5.1.1_postcss@8.4.21 + postcss-minify-params: 5.1.4_postcss@8.4.21 + postcss-minify-selectors: 5.2.1_postcss@8.4.21 + postcss-normalize-charset: 5.1.0_postcss@8.4.21 + postcss-normalize-display-values: 5.1.0_postcss@8.4.21 + postcss-normalize-positions: 5.1.1_postcss@8.4.21 + postcss-normalize-repeat-style: 5.1.1_postcss@8.4.21 + postcss-normalize-string: 5.1.0_postcss@8.4.21 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.21 + postcss-normalize-unicode: 5.1.1_postcss@8.4.21 + postcss-normalize-url: 5.1.0_postcss@8.4.21 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.21 + postcss-ordered-values: 5.1.3_postcss@8.4.21 + postcss-reduce-initial: 5.1.1_postcss@8.4.21 + postcss-reduce-transforms: 5.1.0_postcss@8.4.21 + postcss-svgo: 5.1.0_postcss@8.4.21 + postcss-unique-selectors: 5.1.1_postcss@8.4.21 + dev: false /cssnano-utils/3.1.0_postcss@8.4.14: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} @@ -15508,6 +15534,7 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.19 + dev: true /cssnano-utils/3.1.0_postcss@8.4.20: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} @@ -15518,6 +15545,15 @@ packages: postcss: 8.4.20 dev: true + /cssnano-utils/3.1.0_postcss@8.4.21: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: false + /cssnano/5.1.12_postcss@8.4.14: resolution: {integrity: sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -15552,6 +15588,19 @@ packages: lilconfig: 2.0.6 postcss: 8.4.19 yaml: 1.10.2 + dev: true + + /cssnano/5.1.14_postcss@8.4.21: + resolution: {integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.13_postcss@8.4.21 + lilconfig: 2.0.6 + postcss: 8.4.21 + yaml: 1.10.2 + dev: false /csso/4.2.0: resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} @@ -16746,7 +16795,7 @@ packages: dev: true /double-ended-queue/2.1.0-0: - resolution: {integrity: sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=} + resolution: {integrity: sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==} dev: true /duplexer/0.1.2: @@ -16910,7 +16959,7 @@ packages: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.13 - '@types/node': 17.0.45 + '@types/node': 18.11.10 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -18386,7 +18435,7 @@ packages: dependencies: '@apidevtools/json-schema-ref-parser': 9.0.9 ajv: 8.11.0 - ajv-formats: 2.1.1_ajv@8.11.0 + ajv-formats: 2.1.1 body-parser: 1.20.1 content-type: 1.0.4 deep-freeze: 0.0.1 @@ -18721,10 +18770,6 @@ packages: transitivePeerDependencies: - encoding - /fd/0.0.3: - resolution: {integrity: sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==} - dev: false - /fecha/4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} dev: true @@ -19446,8 +19491,8 @@ packages: '@parcel/transformer-json': 2.8.3_@parcel+core@2.8.3 dev: false - /gatsby-plugin-page-creator/5.8.0-next.0_z7kyunzhk3nj7555smr4e43evq: - resolution: {integrity: sha512-G3NxUJOTZQFt+b2OO0A9yOxfKGiwnUdvpBymob9kJ/YyxLX82ri3xlXPTxp7imQDIbv1BbVRVFV45EVWrWJWKg==} + /gatsby-plugin-page-creator/5.8.0-next.1_fh4uguvww4ue52ssdvsfdxoufq: + resolution: {integrity: sha512-PvwB3Avp4YWXKP+5GkeXYRHMyP2Tir5tHbeMh/84SqA5iqtbwrPcIoL+YC1f+eKBQZBoC7Za3o1GXhbJTx+kqg==} engines: {node: '>=18.0.0'} peerDependencies: gatsby: ^5.0.0-next @@ -19458,10 +19503,10 @@ packages: chokidar: 3.5.3 fs-exists-cached: 1.0.0 fs-extra: 11.1.0 - gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.3_biqbaboplfbrettd7655fr4n2y gatsby-core-utils: 4.8.0-next.0 gatsby-page-utils: 3.8.0-next.0 - gatsby-plugin-utils: 4.8.0-next.0_z7kyunzhk3nj7555smr4e43evq + gatsby-plugin-utils: 4.8.0-next.0_fh4uguvww4ue52ssdvsfdxoufq gatsby-telemetry: 4.8.0-next.0 globby: 11.1.0 lodash: 4.17.21 @@ -19471,7 +19516,7 @@ packages: - supports-color dev: false - /gatsby-plugin-typescript/5.8.0-next.0_gatsby@5.8.0-next.2: + /gatsby-plugin-typescript/5.8.0-next.0_gatsby@5.8.0-next.3: resolution: {integrity: sha512-ofnAJ/oR0VctV8QqKxYPhLWJPO1iz0Ek4U4mZb2YkknRTPKLnQdeAbohucst66BuHcY8zlZTTwZ2cUw+UW1dnQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -19483,13 +19528,13 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 '@babel/preset-typescript': 7.18.6_@babel+core@7.20.12 '@babel/runtime': 7.20.13 - babel-plugin-remove-graphql-queries: 5.8.0-next.0_u7ozffrhm6o22jdb3uxxwj2pzm - gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y + babel-plugin-remove-graphql-queries: 5.8.0-next.0_7pg6or64vhdsz7wls4jdrjahzm + gatsby: 5.8.0-next.3_biqbaboplfbrettd7655fr4n2y transitivePeerDependencies: - supports-color dev: false - /gatsby-plugin-utils/4.8.0-next.0_z7kyunzhk3nj7555smr4e43evq: + /gatsby-plugin-utils/4.8.0-next.0_fh4uguvww4ue52ssdvsfdxoufq: resolution: {integrity: sha512-Uzj8sP0tzpMF1wvgW7uct7LiSzkIl2bUpWhuJ9BS63mtWohYPAJIgc+kmeCS501C/SZtUz+Iipk5DKp9mjOV1Q==} engines: {node: '>=18.0.0'} peerDependencies: @@ -19499,7 +19544,7 @@ packages: '@babel/runtime': 7.20.13 fastq: 1.15.0 fs-extra: 11.1.0 - gatsby: 5.8.0-next.2_biqbaboplfbrettd7655fr4n2y + gatsby: 5.8.0-next.3_biqbaboplfbrettd7655fr4n2y gatsby-core-utils: 4.8.0-next.0 gatsby-sharp: 1.8.0-next.0 graphql: 16.6.0 @@ -19578,8 +19623,8 @@ packages: - supports-color dev: false - /gatsby/5.8.0-next.2_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-DckTpIu9AHHBODu/oqqPXeACNAUk8/QELhEje4Tdn46ZEiJgC7S65FEFYD+6Q38lpfffz0RiM1wSiIPUK0HNfg==} + /gatsby/5.8.0-next.3_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-CB6PY50dGZUfyHMxuEXNhFvcHxzUHhMzpiMFUbcoK67j7JnPeWC6qQ7aZo9dwsy7tj/7ml6yi3ABGgGRPPE52w==} engines: {node: '>=18.0.0'} hasBin: true requiresBuild: true @@ -19625,7 +19670,7 @@ packages: babel-plugin-add-module-exports: 1.0.4 babel-plugin-dynamic-import-node: 2.3.3 babel-plugin-lodash: 3.3.4 - babel-plugin-remove-graphql-queries: 5.8.0-next.0_u7ozffrhm6o22jdb3uxxwj2pzm + babel-plugin-remove-graphql-queries: 5.8.0-next.0_7pg6or64vhdsz7wls4jdrjahzm babel-preset-gatsby: 3.8.0-next.0_pp2vm42zn6vfmnpuhar3irht7i better-opn: 2.1.1 bluebird: 3.7.2 @@ -19674,9 +19719,9 @@ packages: gatsby-link: 5.8.0-next.0_uxzdzcrcylloub4rxar25ny6ra gatsby-page-utils: 3.8.0-next.0 gatsby-parcel-config: 1.8.0-next.0_@parcel+core@2.8.3 - gatsby-plugin-page-creator: 5.8.0-next.0_z7kyunzhk3nj7555smr4e43evq - gatsby-plugin-typescript: 5.8.0-next.0_gatsby@5.8.0-next.2 - gatsby-plugin-utils: 4.8.0-next.0_z7kyunzhk3nj7555smr4e43evq + gatsby-plugin-page-creator: 5.8.0-next.1_fh4uguvww4ue52ssdvsfdxoufq + gatsby-plugin-typescript: 5.8.0-next.0_gatsby@5.8.0-next.3 + gatsby-plugin-utils: 4.8.0-next.0_fh4uguvww4ue52ssdvsfdxoufq gatsby-react-router-scroll: 6.8.0-next.0_uxzdzcrcylloub4rxar25ny6ra gatsby-script: 2.8.0-next.0_uxzdzcrcylloub4rxar25ny6ra gatsby-telemetry: 4.8.0-next.0 @@ -19735,7 +19780,6 @@ packages: slugify: 1.6.5 socket.io: 4.5.4 socket.io-client: 4.5.4 - st: 2.0.0 stack-trace: 0.0.10 string-similarity: 1.2.2 strip-ansi: 6.0.1 @@ -20928,6 +20972,16 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.19 + dev: true + + /icss-utils/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + dev: false /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -24208,7 +24262,7 @@ packages: dev: true /level-write-stream/1.0.0: - resolution: {integrity: sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw=} + resolution: {integrity: sha512-bBNKOEOMl8msO+uIM9YX/gUO6ckokZ/4pCwTm/lwvs46x6Xs8Zy0sn3Vh37eDqse4mhy4fOMIb/JsSM2nyQFtw==} dependencies: end-stream: 0.1.0 dev: true @@ -24651,6 +24705,7 @@ packages: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 + dev: true /lru-cache/5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -24951,7 +25006,7 @@ packages: dev: false /memdown/1.4.1: - resolution: {integrity: sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=} + resolution: {integrity: sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==} dependencies: abstract-leveldown: 2.7.2 functional-red-black-tree: 1.0.1 @@ -25098,6 +25153,7 @@ packages: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true + dev: true /mime/3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} @@ -26260,7 +26316,7 @@ packages: destr: 1.2.2 node-fetch-native: 0.1.8 ufo: 0.8.6 - undici: 5.11.0 + undici: 5.21.0 dev: true /oidc-token-hash/5.0.1: @@ -26929,6 +26985,7 @@ packages: postcss: 8.4.19 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 + dev: true /postcss-calc/8.2.4_postcss@8.4.20: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} @@ -26940,6 +26997,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-calc/8.2.4_postcss@8.4.21: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + dev: false + /postcss-cli/9.1.0_postcss@8.4.14: resolution: {integrity: sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==} engines: {node: '>=12'} @@ -26988,6 +27055,7 @@ packages: colord: 2.9.2 postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-colormin/5.3.0_postcss@8.4.20: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} @@ -27002,6 +27070,19 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-colormin/5.3.0_postcss@8.4.21: + resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + caniuse-api: 3.0.0 + colord: 2.9.2 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-convert-values/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27022,6 +27103,7 @@ packages: browserslist: 4.21.4 postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-convert-values/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} @@ -27034,6 +27116,17 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-convert-values/5.1.3_postcss@8.4.21: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-discard-comments/5.1.2_postcss@8.4.14: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27050,6 +27143,7 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.19 + dev: true /postcss-discard-comments/5.1.2_postcss@8.4.20: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} @@ -27060,6 +27154,15 @@ packages: postcss: 8.4.20 dev: true + /postcss-discard-comments/5.1.2_postcss@8.4.21: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: false + /postcss-discard-duplicates/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27076,6 +27179,7 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.19 + dev: true /postcss-discard-duplicates/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} @@ -27086,6 +27190,15 @@ packages: postcss: 8.4.20 dev: true + /postcss-discard-duplicates/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: false + /postcss-discard-empty/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} @@ -27102,6 +27215,7 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.19 + dev: true /postcss-discard-empty/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} @@ -27112,6 +27226,15 @@ packages: postcss: 8.4.20 dev: true + /postcss-discard-empty/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: false + /postcss-discard-overridden/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27128,6 +27251,7 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.19 + dev: true /postcss-discard-overridden/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} @@ -27138,6 +27262,15 @@ packages: postcss: 8.4.20 dev: true + /postcss-discard-overridden/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: false + /postcss-discard-unused/5.1.0_postcss@8.4.19: resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27266,6 +27399,7 @@ packages: postcss: 8.4.19 postcss-value-parser: 4.2.0 stylehacks: 5.1.1_postcss@8.4.19 + dev: true /postcss-merge-longhand/5.1.7_postcss@8.4.20: resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} @@ -27278,6 +27412,17 @@ packages: stylehacks: 5.1.1_postcss@8.4.20 dev: true + /postcss-merge-longhand/5.1.7_postcss@8.4.21: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1_postcss@8.4.21 + dev: false + /postcss-merge-rules/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27302,6 +27447,7 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.19 postcss: 8.4.19 postcss-selector-parser: 6.0.10 + dev: true /postcss-merge-rules/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} @@ -27316,6 +27462,19 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /postcss-merge-rules/5.1.3_postcss@8.4.21: + resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-selector-parser: 6.0.10 + dev: false + /postcss-minify-font-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27334,6 +27493,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-minify-font-values/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} @@ -27345,6 +27505,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-minify-font-values/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-minify-gradients/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27367,6 +27537,7 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-minify-gradients/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} @@ -27380,6 +27551,18 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-minify-gradients/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.2 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-minify-params/5.1.4_postcss@8.4.14: resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27402,6 +27585,7 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-minify-params/5.1.4_postcss@8.4.20: resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} @@ -27415,6 +27599,18 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-minify-params/5.1.4_postcss@8.4.21: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-minify-selectors/5.2.1_postcss@8.4.14: resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27433,6 +27629,7 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 + dev: true /postcss-minify-selectors/5.2.1_postcss@8.4.20: resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} @@ -27444,6 +27641,16 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /postcss-minify-selectors/5.2.1_postcss@8.4.21: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.10 + dev: false + /postcss-modules-extract-imports/3.0.0_postcss@8.4.19: resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} @@ -27451,6 +27658,16 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.19 + dev: true + + /postcss-modules-extract-imports/3.0.0_postcss@8.4.21: + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + dev: false /postcss-modules-local-by-default/4.0.0_postcss@8.4.19: resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} @@ -27462,6 +27679,19 @@ packages: postcss: 8.4.19 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-local-by-default/4.0.0_postcss@8.4.21: + resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-selector-parser: 6.0.10 + postcss-value-parser: 4.2.0 + dev: false /postcss-modules-scope/3.0.0_postcss@8.4.19: resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} @@ -27471,6 +27701,17 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 + dev: true + + /postcss-modules-scope/3.0.0_postcss@8.4.21: + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.10 + dev: false /postcss-modules-values/4.0.0_postcss@8.4.19: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} @@ -27480,6 +27721,17 @@ packages: dependencies: icss-utils: 5.1.0_postcss@8.4.19 postcss: 8.4.19 + dev: true + + /postcss-modules-values/4.0.0_postcss@8.4.21: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.21 + postcss: 8.4.21 + dev: false /postcss-nested/5.0.6_postcss@8.4.14: resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.com/postcss-nested/-/postcss-nested-5.0.6.tgz} @@ -27517,6 +27769,7 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.19 + dev: true /postcss-normalize-charset/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} @@ -27527,6 +27780,15 @@ packages: postcss: 8.4.20 dev: true + /postcss-normalize-charset/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: false + /postcss-normalize-display-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27545,6 +27807,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-display-values/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} @@ -27556,6 +27819,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-display-values/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-positions/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27574,6 +27847,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-positions/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} @@ -27585,6 +27859,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-positions/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} @@ -27603,6 +27887,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-repeat-style/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} @@ -27614,6 +27899,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-string/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} @@ -27632,6 +27927,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-string/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} @@ -27643,6 +27939,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-string/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27661,6 +27967,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-timing-functions/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} @@ -27672,6 +27979,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-unicode/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27692,6 +28009,7 @@ packages: browserslist: 4.21.4 postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-unicode/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} @@ -27704,6 +28022,17 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-unicode/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-url/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} @@ -27724,6 +28053,7 @@ packages: normalize-url: 6.1.0 postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-url/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} @@ -27736,6 +28066,17 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-url/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-whitespace/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27754,6 +28095,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-normalize-whitespace/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} @@ -27765,6 +28107,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-normalize-whitespace/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-ordered-values/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27785,6 +28137,7 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.19 postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-ordered-values/5.1.3_postcss@8.4.20: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} @@ -27797,6 +28150,17 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-ordered-values/5.1.3_postcss@8.4.21: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-reduce-idents/5.2.0_postcss@8.4.19: resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27827,6 +28191,7 @@ packages: browserslist: 4.21.4 caniuse-api: 3.0.0 postcss: 8.4.19 + dev: true /postcss-reduce-initial/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} @@ -27839,6 +28204,17 @@ packages: postcss: 8.4.20 dev: true + /postcss-reduce-initial/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + caniuse-api: 3.0.0 + postcss: 8.4.21 + dev: false + /postcss-reduce-transforms/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27857,6 +28233,7 @@ packages: dependencies: postcss: 8.4.19 postcss-value-parser: 4.2.0 + dev: true /postcss-reduce-transforms/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} @@ -27868,6 +28245,16 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-reduce-transforms/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: false + /postcss-reporter/7.0.5_postcss@8.4.14: resolution: {integrity: sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==} engines: {node: '>=10'} @@ -27916,6 +28303,7 @@ packages: postcss: 8.4.19 postcss-value-parser: 4.2.0 svgo: 2.8.0 + dev: true /postcss-svgo/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} @@ -27928,6 +28316,17 @@ packages: svgo: 2.8.0 dev: true + /postcss-svgo/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + dev: false + /postcss-unique-selectors/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27946,6 +28345,7 @@ packages: dependencies: postcss: 8.4.19 postcss-selector-parser: 6.0.10 + dev: true /postcss-unique-selectors/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} @@ -27957,6 +28357,16 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /postcss-unique-selectors/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.10 + dev: false + /postcss-url/10.1.3_postcss@8.4.19: resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} engines: {node: '>=10'} @@ -27997,6 +28407,7 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /postcss/8.4.20: resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} @@ -28038,81 +28449,105 @@ packages: xtend: 4.0.2 dev: true - /pouchdb-abstract-mapreduce/7.3.0: - resolution: {integrity: sha512-+2fVt3SDh7D776lIGbYZOsKX5js1aUyUw7iJaTGitxSdQ2ObWSTrr3SUrj5Qo1CkgPXwRM3Tdoq/53JYAa2qCA==} + /pouchdb-abstract-mapreduce/8.0.1: + resolution: {integrity: sha512-BxJRHdfiC8gID8h4DPS0Xy6wsa2VBHRHMv9hsm0BhGTWTqS4k8ivItVSeU2dMoXiTBYp+7SerYmovUQNGSX1GA==} dependencies: - pouchdb-binary-utils: 7.3.0 - pouchdb-collate: 7.3.0 - pouchdb-collections: 7.3.0 - pouchdb-errors: 7.3.0 - pouchdb-fetch: 7.3.0 - pouchdb-mapreduce-utils: 7.3.0 - pouchdb-md5: 7.3.0 - pouchdb-utils: 7.3.0 + pouchdb-binary-utils: 8.0.1 + pouchdb-collate: 8.0.1 + pouchdb-collections: 8.0.1 + pouchdb-errors: 8.0.1 + pouchdb-fetch: 8.0.1 + pouchdb-mapreduce-utils: 8.0.1 + pouchdb-md5: 8.0.1 + pouchdb-utils: 8.0.1 transitivePeerDependencies: - encoding dev: true - /pouchdb-adapter-leveldb-core/7.3.0: - resolution: {integrity: sha512-OyUsEae1JlqR2jSGMohP03gj6VANh9fDR/3nPIa1vYyoQWlwQzOS7knKqDaJm7Nui3JC5q/lWos7/FGZBFuF5Q==} + /pouchdb-adapter-leveldb-core/8.0.1: + resolution: {integrity: sha512-XPVwW8f8VnbvQ5mGREeaKm0zEeHoHGO0osNAxD1BBOfU4x2In+3SNn+P+7b0adoZuHfiCSkcD9UHLgBtNMSsEQ==} dependencies: - argsarray: 0.0.1 buffer-from: 1.1.2 double-ended-queue: 2.1.0-0 levelup: 4.4.0 - pouchdb-adapter-utils: 7.3.0 - pouchdb-binary-utils: 7.3.0 - pouchdb-collections: 7.3.0 - pouchdb-errors: 7.3.0 - pouchdb-json: 7.3.0 - pouchdb-md5: 7.3.0 - pouchdb-merge: 7.3.0 - pouchdb-utils: 7.3.0 - sublevel-pouchdb: 7.3.0 + pouchdb-adapter-utils: 8.0.1 + pouchdb-binary-utils: 8.0.1 + pouchdb-collections: 8.0.1 + pouchdb-core: 8.0.1 + pouchdb-errors: 8.0.1 + pouchdb-json: 8.0.1 + pouchdb-md5: 8.0.1 + pouchdb-merge: 8.0.1 + pouchdb-utils: 8.0.1 + sublevel-pouchdb: 8.0.1 through2: 3.0.2 + transitivePeerDependencies: + - encoding dev: true - /pouchdb-adapter-memory/7.3.0: - resolution: {integrity: sha512-nUdYi5KpbUa0uv0L3IJorpiUnIOBPxX9qplCX9i7JE8OtLPeLyKuX3WC+3M1//8Lmmxg3b1wXSNIod6FJy4wAQ==} + /pouchdb-adapter-memory/8.0.1: + resolution: {integrity: sha512-bQPJR4877yPgHyakryThxzjT9LYRvL48XFPQWH3cILsX/tcoPEvWc42SZR1T6xXXPvRd2IwXPv8jxdaOsmbGuw==} dependencies: memdown: 1.4.1 - pouchdb-adapter-leveldb-core: 7.3.0 - pouchdb-utils: 7.3.0 + pouchdb-adapter-leveldb-core: 8.0.1 + pouchdb-utils: 8.0.1 + transitivePeerDependencies: + - encoding dev: true - /pouchdb-adapter-utils/7.3.0: - resolution: {integrity: sha512-mU1+smcagWSpInVx/VQk7VVjjnJlyagKtusUS3OdCMFZY35L6RbXC8eIhoNVDbkBfEv3cIwqQ3t7fdvkaa1odQ==} + /pouchdb-adapter-utils/8.0.1: + resolution: {integrity: sha512-2nTeYaImu958BU4e46SSdv0IdkXYS/PSy5CXyfb7jK9g0aBAp/JRi7qh9nsTjk4FewpT6OpaE/7evxMQa7UuMg==} dependencies: - pouchdb-binary-utils: 7.3.0 - pouchdb-collections: 7.3.0 - pouchdb-errors: 7.3.0 - pouchdb-md5: 7.3.0 - pouchdb-merge: 7.3.0 - pouchdb-utils: 7.3.0 + pouchdb-binary-utils: 8.0.1 + pouchdb-collections: 8.0.1 + pouchdb-errors: 8.0.1 + pouchdb-md5: 8.0.1 + pouchdb-merge: 8.0.1 + pouchdb-utils: 8.0.1 dev: true - /pouchdb-binary-utils/7.3.0: - resolution: {integrity: sha512-xvBH/XGHGcou2vkEzszJxkCc7YElfRUrkLUg51Jbdmh1mogLDUO0bU3Tj6TOIIJfRkQrU/HV+dDkMAhsil0amQ==} + /pouchdb-binary-utils/8.0.1: + resolution: {integrity: sha512-WsuR/S0aoUlcA0Alt99czkXsfuXWcrYXAcvGiTW02zawVXOafCnb/qHjA09TUaV0oy5HeHmYaNnDckoOUqspeA==} dependencies: buffer-from: 1.1.2 dev: true - /pouchdb-collate/7.3.0: - resolution: {integrity: sha512-ys7rXKtEr6cfghgUjknwFJiOkITebV6JmeTybJKCzMV0r2luXu0OoPQsKVpE/wbM/3F5LxfpbFKGFpPcfGMvTA==} - dev: true - - /pouchdb-collections/7.3.0: - resolution: {integrity: sha512-Xr54m2+fErShXn+qAT4xwqJ+8NwddNPeTMJT4z4k1sZsrwfHmZsWbsKAyGPMF04eQaaU+7DDRMciu2VzaBUXyg==} - dev: true - - /pouchdb-errors/7.3.0: - resolution: {integrity: sha512-dTBbIC1BbCy6J9W/Csg5xROgb3wJN3HpbgAJHHSEtAkb8oA45KZmU3ZwEpNhf0AfPuQm4XgW1936PvlDlGgJiw==} + /pouchdb-changes-filter/8.0.1: + resolution: {integrity: sha512-UKgH6YRA9PnvIGHb0FuDEEqeTewgHugbbBt5vpVo0QmbWKxNiau/JiTC9mY5Hj9l7ghaIUpO0TFG95a6RXWsQA==} dependencies: - inherits: 2.0.4 + pouchdb-errors: 8.0.1 + pouchdb-selector-core: 8.0.1 + pouchdb-utils: 8.0.1 dev: true - /pouchdb-fetch/7.3.0: - resolution: {integrity: sha512-8/lcg8iMDG+GVs1dHNXA4ktJSEpH71dHU3xesMJ25tNQOqfAaaWrkfz9j71ZYDDkveLYE6UjUzl/sDacu2hSjw==} + /pouchdb-collate/8.0.1: + resolution: {integrity: sha512-DTuNz1UJjBTGZMUlWS1klSE1rPsmHy8IIDie3MFH1ZTz/C+SwGgGwkiAyUDv/n00D18EMLgXq5mu+r7L6K1BwQ==} + dev: true + + /pouchdb-collections/8.0.1: + resolution: {integrity: sha512-TlkQ2GGHJApJgL0b7bJMQcwX6eMfVenLeoK9mqHfC2fJssui+HWJJ5LYKHOWan11SeB90BQVFbO6rHN6CJQeDg==} + dev: true + + /pouchdb-core/8.0.1: + resolution: {integrity: sha512-Qkcmh3eoMHiKUma5Y/rH0Z7kjxXrr6p54j/WOH+TZ/RlJAchmdVY1TRfqay5CoK+8Ka0m8eibP+wD1DKZKJbDg==} + dependencies: + pouchdb-changes-filter: 8.0.1 + pouchdb-collections: 8.0.1 + pouchdb-errors: 8.0.1 + pouchdb-fetch: 8.0.1 + pouchdb-merge: 8.0.1 + pouchdb-utils: 8.0.1 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + dev: true + + /pouchdb-errors/8.0.1: + resolution: {integrity: sha512-H+ZsQxcG/JV3Tn29gnM6c9+lRPCN91ZYOkoIICsLjVRYgOTzN1AvNUD/G5JCB+81aI/u3fxZec0LEaZh6g6NHA==} + dev: true + + /pouchdb-fetch/8.0.1: + resolution: {integrity: sha512-Px5HLT8MxqTujc8bpPRKoouznDTJa9XBGqCbhl95q6rhjWRfwZEvXjV92z0B5BALAM6D6avMyG0DjuNfUWnMuA==} dependencies: abort-controller: 3.0.0 fetch-cookie: 0.11.0 @@ -28121,77 +28556,73 @@ packages: - encoding dev: true - /pouchdb-find/7.3.0: - resolution: {integrity: sha512-EwhnfyxCAkKf8PG4tfndTTygEmtuz+o1LiZkxfPrflfXA3m1jo1ithib0hwBYtEwEYWuZxH6B8pRZutbLoQCGA==} + /pouchdb-find/8.0.1: + resolution: {integrity: sha512-i5criYXMOXlbeRrCrXonqaOY+xiMiOyTLybqvtX/NkUsiD4BxJxkq5AxdSlHdJ9703nWJ0k6S+5C8VrpEj8tsQ==} dependencies: - pouchdb-abstract-mapreduce: 7.3.0 - pouchdb-collate: 7.3.0 - pouchdb-errors: 7.3.0 - pouchdb-fetch: 7.3.0 - pouchdb-md5: 7.3.0 - pouchdb-selector-core: 7.3.0 - pouchdb-utils: 7.3.0 + pouchdb-abstract-mapreduce: 8.0.1 + pouchdb-collate: 8.0.1 + pouchdb-errors: 8.0.1 + pouchdb-fetch: 8.0.1 + pouchdb-md5: 8.0.1 + pouchdb-selector-core: 8.0.1 + pouchdb-utils: 8.0.1 transitivePeerDependencies: - encoding dev: true - /pouchdb-json/7.3.0: - resolution: {integrity: sha512-D4wyi20ltyiFpuziQeMk3CbXs/Q58VoGTYTJQY8MWBw37OidtHGQAt1Kh5yJ435wJqDzJZyxMA5RxGZxEOBDVg==} + /pouchdb-json/8.0.1: + resolution: {integrity: sha512-P9P0QuD+q5QAcz1ykTZHJ/F2CHCfEr7RF/Gj+hjDj6+CeYwlO0TjvwKI0Dg83eLWz6W2cqaVIARDl62DS98dFw==} dependencies: vuvuzela: 1.0.3 dev: true - /pouchdb-mapreduce-utils/7.3.0: - resolution: {integrity: sha512-KDVSd+H2r+XWTrQfKWV71SknDDYRjYXoeWs0ZQl3xITHCcTl+fIgqyagg/XN+Zy/U9LeLPGMe2JdgPx9H8lJgw==} + /pouchdb-mapreduce-utils/8.0.1: + resolution: {integrity: sha512-asZcFLy1DA3oe5CeXIRCpfVrBHaHRvSb3Tc/LPD1dZDDtpEkeCuXGtJm+praN0jl41jTBEm0uMdD/YI0J5ZFXw==} dependencies: - argsarray: 0.0.1 - inherits: 2.0.4 - pouchdb-collections: 7.3.0 - pouchdb-utils: 7.3.0 + pouchdb-collections: 8.0.1 + pouchdb-utils: 8.0.1 dev: true - /pouchdb-md5/7.3.0: - resolution: {integrity: sha512-wL04QgoKyd/L/TV5gxgcvlEyCJiZoXCOEFJklTzkdza/kBQNJGPH7i0ZhKa7Sb+AvZYoWZHddf1Zgv7rBScHkA==} + /pouchdb-md5/8.0.1: + resolution: {integrity: sha512-shVcs/K/iilrcAhDEERpLIrGm/cnDVsXiocOzs7kycJEuBqYnLD9nj58VwWDcum26wfa8T9cznvEGE1jlYVNPQ==} dependencies: - pouchdb-binary-utils: 7.3.0 + pouchdb-binary-utils: 8.0.1 spark-md5: 3.0.2 dev: true - /pouchdb-merge/7.3.0: - resolution: {integrity: sha512-E7LmchMzwYFm6V8OBxejzARLisanpksOju2LEfuiYnotGfNDeW7MByP0qBH0/zF8BfUyyjA1cl7ByaEpsapkeQ==} + /pouchdb-merge/8.0.1: + resolution: {integrity: sha512-79dw6+K7js2+/kt9u4hKOkGCnz+ov0+yft2k21n6M+ylFEQyMKuWHEZRoFWr72o1vxwjhIXhUM1PB2PIdxIh0Q==} + dependencies: + pouchdb-utils: 8.0.1 dev: true - /pouchdb-selector-core/7.3.0: - resolution: {integrity: sha512-sK/cCrIGeL9ImcMhKGcwa54+bzX7Wv4hhVV+oUW3T1Nasaoxh+Muem1GuA+x1+SbTCE8y37rUg8i6DIOhX51ew==} + /pouchdb-selector-core/8.0.1: + resolution: {integrity: sha512-dHWsnR+mLGyfVld1vSHJI1xKTwS1xk1G2dggjfXfUrLehI+wysjTUOwiSNytyPzG6DpT+o86wyUpwzPwsDCLBw==} dependencies: - pouchdb-collate: 7.3.0 - pouchdb-utils: 7.3.0 + pouchdb-collate: 8.0.1 + pouchdb-utils: 8.0.1 dev: true - /pouchdb-utils/7.3.0: - resolution: {integrity: sha512-HH+5IXXWn/ZgVCSnrlydBMYn6MabT7RS7SNoo9w8qVH9efpZSp3eLchw6yMQNLw8LQefWmbbskiHV9VgJmSVWQ==} + /pouchdb-utils/8.0.1: + resolution: {integrity: sha512-pWgxdk9EHVWJmjQoEvTe+ZlPXyjcuQ/vgLITN+RjGwcYhoQYUE1M0PksQd2dUP3V8lGS4+wrg9lEM/qSJPYcpw==} dependencies: - argsarray: 0.0.1 clone-buffer: 1.0.0 immediate: 3.3.0 - inherits: 2.0.4 - pouchdb-collections: 7.3.0 - pouchdb-errors: 7.3.0 - pouchdb-md5: 7.3.0 + pouchdb-collections: 8.0.1 + pouchdb-errors: 8.0.1 + pouchdb-md5: 8.0.1 uuid: 8.3.2 dev: true - /pouchdb/7.3.0: - resolution: {integrity: sha512-OwsIQGXsfx3TrU1pLruj6PGSwFH+h5k4hGNxFkZ76Um7/ZI8F5TzUHFrpldVVIhfXYi2vP31q0q7ot1FSLFYOw==} + /pouchdb/8.0.1: + resolution: {integrity: sha512-xp5S83JOQn2NAL0ZQ5CU+DI26V9/YrYuVtkXnbGEIDrYiFfj5A8gAcfbxefXb/9O+Qn4n5RaT/19+8UBSZ42sw==} dependencies: abort-controller: 3.0.0 - argsarray: 0.0.1 buffer-from: 1.1.2 clone-buffer: 1.0.0 double-ended-queue: 2.1.0-0 fetch-cookie: 0.11.0 immediate: 3.3.0 - inherits: 2.0.4 level: 6.0.1 level-codec: 9.0.2 level-write-stream: 1.0.0 @@ -29726,7 +30157,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.0 - ajv-formats: 2.1.1_ajv@8.11.0 + ajv-formats: 2.1.1 ajv-keywords: 5.1.0_ajv@8.11.0 dev: true @@ -30326,7 +30757,7 @@ packages: sirv: 2.0.2 solid-js: 1.6.6 terser: 5.16.1 - undici: 5.11.0 + undici: 5.21.0 vite-plugin-inspect: 0.7.15_rollup@3.15.0 vite-plugin-solid: 2.5.0_solid-js@1.6.6 wait-on: 6.0.1_debug@4.3.4 @@ -30578,19 +31009,6 @@ packages: dev: true optional: true - /st/2.0.0: - resolution: {integrity: sha512-drN+aGYnrZPNYIymmNwIY7LXYJ8MqsqXj4fMRue3FOgGMdGjSX10fhJ3qx0sVQPhcWxhEaN4U/eWM4O4dbYNAw==} - hasBin: true - dependencies: - async-cache: 1.1.0 - bl: 4.1.0 - fd: 0.0.3 - mime: 2.6.0 - negotiator: 0.6.3 - optionalDependencies: - graceful-fs: 4.2.10 - dev: false - /stable/0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' @@ -30966,6 +31384,7 @@ packages: browserslist: 4.21.4 postcss: 8.4.19 postcss-selector-parser: 6.0.10 + dev: true /stylehacks/5.1.1_postcss@8.4.20: resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} @@ -30978,14 +31397,24 @@ packages: postcss-selector-parser: 6.0.10 dev: true + /stylehacks/5.1.1_postcss@8.4.21: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.4 + postcss: 8.4.21 + postcss-selector-parser: 6.0.10 + dev: false + /stylis/4.1.3: resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} dev: false - /sublevel-pouchdb/7.3.0: - resolution: {integrity: sha512-zp7u4jmv2N/s+dXZkWTtL4BjREs3SZ1nGBNNJ8RWX4yqN59oHgKmti4CfVOqfsAW9RMasmTqQAEPxL9hX8+CIA==} + /sublevel-pouchdb/8.0.1: + resolution: {integrity: sha512-IPbDh2meYVOorQwYuRgKCXsfemfy4UtQ920pq/b01W71n1yls/8BvAJTTmJjkWQ2szIXNCTXzflCOscCQ03M1w==} dependencies: - inherits: 2.0.4 level-codec: 9.0.2 ltgt: 2.2.1 readable-stream: 1.1.14 @@ -32399,8 +32828,15 @@ packages: resolution: {integrity: sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==} dev: true - /undici/5.11.0: - resolution: {integrity: sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw==} + /undici/5.14.0: + resolution: {integrity: sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==} + engines: {node: '>=12.18'} + dependencies: + busboy: 1.6.0 + dev: true + + /undici/5.21.0: + resolution: {integrity: sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 @@ -33323,7 +33759,7 @@ packages: dev: true /vuvuzela/1.0.3: - resolution: {integrity: sha1-O+FF5YJxxzylUnndhR8SpoIRSws=} + resolution: {integrity: sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==} dev: true /w3c-hr-time/1.0.2: diff --git a/turbo.json b/turbo.json index 8d92dcfb..cb597228 100644 --- a/turbo.json +++ b/turbo.json @@ -64,6 +64,7 @@ "@next-auth/firebase-adapter#build", "@next-auth/mongodb-adapter#build", "@next-auth/prisma-adapter#build", + "@next-auth/pouchdb-adapter#build", "@next-auth/typeorm-legacy-adapter#build", "next-auth#build" ], From f4f8c4a0b3b796e16d8c92a42c4ea10d78c2d517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 21:56:10 +0100 Subject: [PATCH 38/80] fix: links and references --- packages/adapter-pouchdb/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/adapter-pouchdb/src/index.ts b/packages/adapter-pouchdb/src/index.ts index aca57e22..af66b951 100644 --- a/packages/adapter-pouchdb/src/index.ts +++ b/packages/adapter-pouchdb/src/index.ts @@ -1,7 +1,7 @@ /** *
*

Official PouchDB adapter for Auth.js / NextAuth.js.

- * + * * * *
@@ -10,7 +10,6 @@ * * ```bash npm2yarn2pnpm * npm install next-auth pouchdb pouchdb-find @next-auth/pouchdb-adapter - * npm install prisma --save-dev * ``` * * @module @next-auth/pouchdb-adapter From f0b475fc723c82599472363de09e58863ef69a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 21:59:19 +0100 Subject: [PATCH 39/80] docs: move adapters sidebar around --- docs/docs/reference/06-adapters/00-overview.md | 11 +++++++---- docs/sidebars.js | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/docs/reference/06-adapters/00-overview.md b/docs/docs/reference/06-adapters/00-overview.md index 902c170b..eede1aba 100644 --- a/docs/docs/reference/06-adapters/00-overview.md +++ b/docs/docs/reference/06-adapters/00-overview.md @@ -1,7 +1,10 @@ --- -title: Database Adapters +title: Overview --- -:::warning WIP -`@auth/*-adapter` is work in progress. for the time being, please go to [NextAuth.js Adapters](https://next-auth.js.org/adapters/overview). -::: +Auth.js / NextAuth.js database adapters. + + +:::warning +Auth.js (`@auth/*`) support is experimental. +::: \ No newline at end of file diff --git a/docs/sidebars.js b/docs/sidebars.js index a791ccef..3dc43fe7 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -50,6 +50,7 @@ module.exports = { label: "Database Adapters", link: { type: "doc", id: "reference/adapters/overview" }, items: [ + { type: "autogenerated", dirName: "reference/06-adapters" }, { type: "doc", id: "reference/adapter/prisma/index" }, { type: "doc", id: "reference/adapter/typeorm/index" }, { type: "doc", id: "reference/adapter/mongodb/index" }, @@ -57,7 +58,6 @@ module.exports = { { type: "doc", id: "reference/adapter/dynamodb/index" }, { type: "doc", id: "reference/adapter/fauna/index" }, { type: "doc", id: "reference/adapter/pouchdb/index" }, - { type: "autogenerated", dirName: "reference/06-adapters" }, ], }, "reference/warnings", From 90eeeeab2f35ace519eca8d3231bc089c4b7bb51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 22:28:23 +0100 Subject: [PATCH 40/80] docs: unify adapters (#7013) * remove unmaintained changelogs * move logos to docs * unify readmes * fix logo urls --- .../static/img/adapters/dgraph.svg | 0 .../static/img/adapters/dynamodb.png | Bin .../static/img/adapters/fauna.svg | 0 .../static/img/adapters/firebase.svg | 0 .../static/img/adapters/mikro-orm.svg | 0 .../static/img/adapters/mongodb.svg | 0 .../static/img/adapters/neo4j.svg | 0 .../static/img/adapters/prisma.svg | 0 .../static/img/adapters/sequelize.svg | 0 .../static/img/adapters/supabase.svg | 0 .../static/img/adapters/typeorm.png | Bin .../static/img/adapters/upstash-redis.svg | 0 .../static/img/adapters/xata.svg | 0 packages/adapter-dgraph/CHANGELOG.md | 8 - packages/adapter-dgraph/README.md | 172 ++--------- packages/adapter-dgraph/src/index.ts | 2 +- packages/adapter-dynamodb/CHANGELOG.md | 22 -- packages/adapter-dynamodb/README.md | 123 ++------ packages/adapter-fauna/CHANGELOG.md | 49 ---- packages/adapter-fauna/README.md | 80 ++---- packages/adapter-fauna/src/index.ts | 2 +- packages/adapter-firebase/README.md | 49 ++-- packages/adapter-firebase/src/index.ts | 2 +- packages/adapter-mikro-orm/CHANGELOG.md | 8 - packages/adapter-mikro-orm/README.md | 76 ++--- packages/adapter-mongodb/CHANGELOG.md | 8 - packages/adapter-mongodb/README.md | 108 ++----- packages/adapter-mongodb/src/index.ts | 2 +- packages/adapter-neo4j/CHANGELOG.md | 14 - packages/adapter-neo4j/README.md | 77 ++--- packages/adapter-pouchdb/README.md | 4 +- packages/adapter-prisma/CHANGELOG.md | 26 -- packages/adapter-prisma/README.md | 75 ++--- packages/adapter-prisma/src/index.ts | 2 +- packages/adapter-sequelize/CHANGELOG.md | 8 - packages/adapter-sequelize/README.md | 116 ++------ packages/adapter-supabase/README.md | 77 ++--- packages/adapter-typeorm-legacy/CHANGELOG.md | 24 -- packages/adapter-typeorm-legacy/README.md | 107 ++----- packages/adapter-upstash-redis/CHANGELOG.md | 15 - packages/adapter-upstash-redis/README.md | 107 ++----- packages/adapter-xata/README.md | 268 ++---------------- 42 files changed, 319 insertions(+), 1312 deletions(-) rename packages/adapter-dgraph/logo.svg => docs/static/img/adapters/dgraph.svg (100%) rename packages/adapter-dynamodb/logo.png => docs/static/img/adapters/dynamodb.png (100%) rename packages/adapter-fauna/logo.svg => docs/static/img/adapters/fauna.svg (100%) rename packages/adapter-firebase/logo.svg => docs/static/img/adapters/firebase.svg (100%) rename packages/adapter-mikro-orm/logo.svg => docs/static/img/adapters/mikro-orm.svg (100%) rename packages/adapter-mongodb/logo.svg => docs/static/img/adapters/mongodb.svg (100%) rename packages/adapter-neo4j/logo.svg => docs/static/img/adapters/neo4j.svg (100%) rename packages/adapter-prisma/logo.svg => docs/static/img/adapters/prisma.svg (100%) rename packages/adapter-sequelize/logo.svg => docs/static/img/adapters/sequelize.svg (100%) rename packages/adapter-supabase/logo.svg => docs/static/img/adapters/supabase.svg (100%) rename packages/adapter-typeorm-legacy/logo.png => docs/static/img/adapters/typeorm.png (100%) rename packages/adapter-upstash-redis/logo.svg => docs/static/img/adapters/upstash-redis.svg (100%) rename packages/adapter-xata/logo.svg => docs/static/img/adapters/xata.svg (100%) delete mode 100644 packages/adapter-dgraph/CHANGELOG.md delete mode 100644 packages/adapter-dynamodb/CHANGELOG.md delete mode 100644 packages/adapter-fauna/CHANGELOG.md delete mode 100644 packages/adapter-mikro-orm/CHANGELOG.md delete mode 100644 packages/adapter-mongodb/CHANGELOG.md delete mode 100644 packages/adapter-neo4j/CHANGELOG.md delete mode 100644 packages/adapter-prisma/CHANGELOG.md delete mode 100644 packages/adapter-sequelize/CHANGELOG.md delete mode 100644 packages/adapter-typeorm-legacy/CHANGELOG.md delete mode 100644 packages/adapter-upstash-redis/CHANGELOG.md diff --git a/packages/adapter-dgraph/logo.svg b/docs/static/img/adapters/dgraph.svg similarity index 100% rename from packages/adapter-dgraph/logo.svg rename to docs/static/img/adapters/dgraph.svg diff --git a/packages/adapter-dynamodb/logo.png b/docs/static/img/adapters/dynamodb.png similarity index 100% rename from packages/adapter-dynamodb/logo.png rename to docs/static/img/adapters/dynamodb.png diff --git a/packages/adapter-fauna/logo.svg b/docs/static/img/adapters/fauna.svg similarity index 100% rename from packages/adapter-fauna/logo.svg rename to docs/static/img/adapters/fauna.svg diff --git a/packages/adapter-firebase/logo.svg b/docs/static/img/adapters/firebase.svg similarity index 100% rename from packages/adapter-firebase/logo.svg rename to docs/static/img/adapters/firebase.svg diff --git a/packages/adapter-mikro-orm/logo.svg b/docs/static/img/adapters/mikro-orm.svg similarity index 100% rename from packages/adapter-mikro-orm/logo.svg rename to docs/static/img/adapters/mikro-orm.svg diff --git a/packages/adapter-mongodb/logo.svg b/docs/static/img/adapters/mongodb.svg similarity index 100% rename from packages/adapter-mongodb/logo.svg rename to docs/static/img/adapters/mongodb.svg diff --git a/packages/adapter-neo4j/logo.svg b/docs/static/img/adapters/neo4j.svg similarity index 100% rename from packages/adapter-neo4j/logo.svg rename to docs/static/img/adapters/neo4j.svg diff --git a/packages/adapter-prisma/logo.svg b/docs/static/img/adapters/prisma.svg similarity index 100% rename from packages/adapter-prisma/logo.svg rename to docs/static/img/adapters/prisma.svg diff --git a/packages/adapter-sequelize/logo.svg b/docs/static/img/adapters/sequelize.svg similarity index 100% rename from packages/adapter-sequelize/logo.svg rename to docs/static/img/adapters/sequelize.svg diff --git a/packages/adapter-supabase/logo.svg b/docs/static/img/adapters/supabase.svg similarity index 100% rename from packages/adapter-supabase/logo.svg rename to docs/static/img/adapters/supabase.svg diff --git a/packages/adapter-typeorm-legacy/logo.png b/docs/static/img/adapters/typeorm.png similarity index 100% rename from packages/adapter-typeorm-legacy/logo.png rename to docs/static/img/adapters/typeorm.png diff --git a/packages/adapter-upstash-redis/logo.svg b/docs/static/img/adapters/upstash-redis.svg similarity index 100% rename from packages/adapter-upstash-redis/logo.svg rename to docs/static/img/adapters/upstash-redis.svg diff --git a/packages/adapter-xata/logo.svg b/docs/static/img/adapters/xata.svg similarity index 100% rename from packages/adapter-xata/logo.svg rename to docs/static/img/adapters/xata.svg diff --git a/packages/adapter-dgraph/CHANGELOG.md b/packages/adapter-dgraph/CHANGELOG.md deleted file mode 100644 index 661cc9ac..00000000 --- a/packages/adapter-dgraph/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.2](https://github.com/nextauthjs/adapters/compare/@next-auth/dgraph-adapter@1.0.1...@next-auth/dgraph-adapter@1.0.2) (2021-12-06) - -**Note:** Version bump only for package @next-auth/dgraph-adapter diff --git a/packages/adapter-dgraph/README.md b/packages/adapter-dgraph/README.md index 813a28b8..0c09bce1 100644 --- a/packages/adapter-dgraph/README.md +++ b/packages/adapter-dgraph/README.md @@ -1,152 +1,28 @@

-
-      -

Dgraph Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

+
+ + + + + + +

Dgraph Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the Dgraph Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -You can find two Graphql schemas in the [`docs`](https://authjs.dev/adapters/dgraph/schema.gql). - -1. The unsecure don't implement any auth directive is perfect for a quick start. -2. The second one is more secure and require you replace some value before copy pasting it into your Dgraph console ([`see Securing your database`](#securing-your-database)). - -## Getting Started - -1. Install `next-auth` and `@next-auth/dgraph-adapter` - -```js -npm install next-auth @next-auth/dgraph-adapter -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { DgraphAdapter } from "@next-auth/dgraph-adapter"; - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [ - ..., - ], - adapter: DgraphAdapter({ - endpoint: process.env.DGRAPH_GRAPHQL_ENDPOINT, - authToken: process.env.DGRAPH_GRAPHQL_KEY, - - // you can omit the following properties if you are running an unsecure schema - authHeader: "", - jwtSecret: process.env.SECRET - }) - ... -}) -``` - -## Quick start with the unsecure schema - -The simplest way to use Dgraph is by copy pasting the unsecure schema into your dashboard. Then create an api client key and grab your endpoint to initialize your `DgraphClient`. Forget about `authHeader` and `jwtSecret`. - -## Securing your database - -Fore sake of security and mostly if your client directly communicate with the graphql server you obviously want to restrict the access to the types used by next-auth. That's why you see a lot of @auth directive alongside this types in the schema. - -### Dgraph.Authorization - -The first thing to do in order to secure your graphql backend is to define the `Dgraph.Authorization` object at the bottom of your schema and provide `authHeader` and `jwtSecret` values to the DgraphClient. - -```js -# Dgraph.Authorization {"VerificationKey":"","Header":"","Namespace":"","Algo":"HS256"} -``` - -### VerificationKey and jwtSecret - -This is the key you use to sign the JWT. Probably your `process.env.SECRET`. - -### Header and authHeader - -The `Header` tells Dgraph where to lookup for a jwt with auth credentials. You have to configure it a te bottom of your schema. This header is the same as the `authHeader` property you provide when you instantiate the DgraphClient. - -## Working with JWT session and @auth directive - -Dgraph only works with HS256 or RS256 algorithms. If you want to use session jwt to securely interact with your dgraph database you have to customize next-auth encode and decode functions because the default algorithm is HS512. You can there going further and customize the jwt with roles if you want to implement [`RBAC logic`](https://dgraph.io/docs/graphql/authorization/directive/#role-based-access-control). - -```js -import * as jwt from "jsonwebtoken"; - -export default NextAuth({ - -... - -session: { - jwt: true - }, - jwt: { - secret: process.env.SECRET, - encode: async ({ secret, token }) => { - return jwt.sign({ - ...token, - userId: token.id, - // role: "ADMIN" for RBAC - }, - secret, - { - algorithm: "HS256", - expiresIn: 30 * 24 * 60 * 60; // 30 days - });; - }, - decode: async ({ secret, token }) => { - return jwt.verify(token, secret, { algorithms: ["HS256"] }); - } - }, - -... - -}) -``` - -Once your `Dgraph.Authorization` define in your schema and this JWT settings set, this will allow you to define [`@auth rules`](https://dgraph.io/docs/graphql/authorization/authorization-overview/) for every part of your schema. - -## @auth implementation - -```graphql - -type User - @auth( - ... - - query: { or: [ - { - rule: """ - query ($userId: String!) { - queryUser(filter: { id: { eq: $userId } } ) { - id - } - } - """ - }, - { rule: "{$role { eq: "ADMIN" } }" } - { rule: "{$nextAuth { eq: true } }" }, - ]}, - - ... - ) { - id: ID - ... -} - -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/dgraph). \ No newline at end of file diff --git a/packages/adapter-dgraph/src/index.ts b/packages/adapter-dgraph/src/index.ts index 16f9d6af..d4e034e9 100644 --- a/packages/adapter-dgraph/src/index.ts +++ b/packages/adapter-dgraph/src/index.ts @@ -2,7 +2,7 @@ *
*

Official DynamoDB adapter for Auth.js / NextAuth.js.

* - * + * * *
* diff --git a/packages/adapter-dynamodb/CHANGELOG.md b/packages/adapter-dynamodb/CHANGELOG.md deleted file mode 100644 index 13f3d241..00000000 --- a/packages/adapter-dynamodb/CHANGELOG.md +++ /dev/null @@ -1,22 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.2](https://github.com/nextauthjs/adapters/compare/@next-auth/dynamodb-adapter@1.0.1...@next-auth/dynamodb-adapter@1.0.2) (2022-01-10) - -### Bug Fixes - -- **dynamo:** Ensure expires attribute is stored as a UNIX timestamp ([#367](https://github.com/nextauthjs/adapters/issues/367)) ([c262110](https://github.com/nextauthjs/adapters/commit/c2621103d01c10929fb3e2b0aef4443d1e2e0be1)) - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/dynamodb-adapter@1.0.0...@next-auth/dynamodb-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/dynamodb-adapter - -## [0.4.2](https://github.com/nextauthjs/adapters/compare/@next-auth/dynamodb-adapter@0.4.1...@next-auth/dynamodb-adapter@0.4.2) (2021-07-02) - -**Note:** Version bump only for package @next-auth/dynamodb-adapter - -## [0.4.1](https://github.com/nextauthjs/adapters/compare/@next-auth/dynamodb-adapter@0.4.0...@next-auth/dynamodb-adapter@0.4.1) (2021-06-30) - -**Note:** Version bump only for package @next-auth/dynamodb-adapter diff --git a/packages/adapter-dynamodb/README.md b/packages/adapter-dynamodb/README.md index 0c72bef9..b7025a8c 100644 --- a/packages/adapter-dynamodb/README.md +++ b/packages/adapter-dynamodb/README.md @@ -1,103 +1,28 @@

-
-      -

DynamoDB Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- Build Test - Bundle Size - @next-auth/dynamodb-adapter Version -

+
+ + + + + + +

DynamoDB Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the AWS DynamoDB Adapter for next-auth. This package can only be used in conjunction with the primary next-auth package. It is not a standalone package. - -You need a table with a partition key `pk` and a sort key `sk`. Your table also needs a global secondary index named `GSI1` with `GSI1PK` as partition key and `GSI1SK` as sorting key. You can set whatever you want as the table name and the billing method. - -If you want sessions and verification tokens to get automatically removed from your table you need to [activate TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html) on your table with the TTL attribute name set to `expires` - -You can find the DynamoDB schema in the docs at [authjs.dev/reference/adapters/dynamodb](https://authjs.dev/reference/adapters/dynamodb). - -## Getting Started - -1. Install `next-auth` and `@next-auth/dynamodb-adapter` - -```js -npm install next-auth @next-auth/dynamodb-adapter -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -You need to pass `DocumentClient` instance from `aws-sdk` to the adapter. -The default table name is `next-auth`, but you can customise that by passing `{ tableName: 'your-table-name' }` as the second parameter in the adapter. - -```js -import { DynamoDB } from "@aws-sdk/client-dynamodb" -import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb" -import NextAuth from "next-auth"; -import Providers from "next-auth/providers"; -import { DynamoDBAdapter } from "@next-auth/dynamodb-adapter" - -const config: DynamoDBClientConfig = { - credentials: { - accessKeyId: process.env.NEXT_AUTH_AWS_ACCESS_KEY as string, - secretAccessKey: process.env.NEXT_AUTH_AWS_SECRET_KEY as string, - }, - region: process.env.NEXT_AUTH_AWS_REGION, -}; - -const client = DynamoDBDocument.from(new DynamoDB(config), { - marshallOptions: { - convertEmptyValues: true, - removeUndefinedValues: true, - convertClassInstanceToMap: true, - }, -}) - -export default NextAuth({ - // Configure one or more authentication providers - providers: [ - Providers.GitHub({ - clientId: process.env.GITHUB_ID, - clientSecret: process.env.GITHUB_SECRET, - }), - Providers.Email({ - server: process.env.EMAIL_SERVER, - from: process.env.EMAIL_FROM, - }), - // ...add more providers here - ], - adapter: DynamoDBAdapter( - client - ), - ... -}); -``` - -(AWS secrets start with `NEXT_AUTH_` in order to not conflict with [Vercel's reserved environment variables](https://vercel.com/docs/environment-variables#reserved-environment-variables).) - -## Table structure - -The table respects the single table design pattern. This has many advantages: - -- Only one table to manage, monitor and provision. -- Querying relations is faster than with multi-table schemas (for eg. retrieving all sessions for a user). -- Only one table needs to be replicated, if you want to go multi-region. - -Here is a schema of the table : - -

- -

- -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/dynamodb). \ No newline at end of file diff --git a/packages/adapter-fauna/CHANGELOG.md b/packages/adapter-fauna/CHANGELOG.md deleted file mode 100644 index eb189d95..00000000 --- a/packages/adapter-fauna/CHANGELOG.md +++ /dev/null @@ -1,49 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.2](https://github.com/nextauthjs/adapters/compare/@next-auth/fauna-adapter@1.0.1...@next-auth/fauna-adapter@1.0.2) (2022-01-10) - -### Bug Fixes - -- **fauna:** Convert `value` prop to `Date` only if of type `string` ([#365](https://github.com/nextauthjs/adapters/issues/365)) ([c8dad2b](https://github.com/nextauthjs/adapters/commit/c8dad2b1bf74ab1574c92ee5fda879d798a43977)), closes [#364](https://github.com/nextauthjs/adapters/issues/364) - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/fauna-adapter@1.0.0...@next-auth/fauna-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/fauna-adapter - -## [0.2.4](https://github.com/nextauthjs/adapters/compare/@next-auth/fauna-adapter@0.2.3...@next-auth/fauna-adapter@0.2.4) (2021-10-27) - -### Reverts - -- Revert "docs(fauna): update `README.md` (#244)" (#246) ([26cd24a](https://github.com/nextauthjs/adapters/commit/26cd24a6eba3d42ed7febd5eb45b13c236c57819)), closes [#244](https://github.com/nextauthjs/adapters/issues/244) [#246](https://github.com/nextauthjs/adapters/issues/246) - -## [0.2.3](https://github.com/nextauthjs/adapters/compare/@next-auth/fauna-adapter@0.2.2...@next-auth/fauna-adapter@0.2.3) (2021-09-19) - -**Note:** Version bump only for package @next-auth/fauna-adapter - -## [0.2.2](https://github.com/nextauthjs/adapters/compare/@next-auth/fauna-adapter@0.2.1...@next-auth/fauna-adapter@0.2.2) (2021-07-02) - -**Note:** Version bump only for package @next-auth/fauna-adapter - -## [0.2.1](https://github.com/nextauthjs/adapters/compare/@next-auth/fauna-adapter@0.2.0...@next-auth/fauna-adapter@0.2.1) (2021-06-30) - -### Bug Fixes - -- **fauna:** change the name of the index to `verification_request_by_token_and_identifier` ([#157](https://github.com/nextauthjs/adapters/issues/157)) ([01a3c52](https://github.com/nextauthjs/adapters/commit/01a3c5205f30eec57c7b9298b762cccf1f2400fd)) - -# [0.2.0](https://github.com/nextauthjs/adapters/compare/@next-auth/fauna-adapter@0.1.0...@next-auth/fauna-adapter@0.2.0) (2021-06-30) - -### Bug Fixes - -- adapter export function name ([eb6a21a](https://github.com/nextauthjs/adapters/commit/eb6a21a0302ef42a32314e48a75542bade26605e)) -- include /dist files in published build ([751ea95](https://github.com/nextauthjs/adapters/commit/751ea95a3b40dc3a94bf4de6253974e1664a2661)) -- merge conflicts ([aa48f2f](https://github.com/nextauthjs/adapters/commit/aa48f2f7586345764d0a586df23534f9abc2b53d)) -- rm type=module from package.json ([c207348](https://github.com/nextauthjs/adapters/commit/c207348d126a766abe341e6afe36b04d47c6bac6)) -- specify module in package.json ([d6e85ce](https://github.com/nextauthjs/adapters/commit/d6e85ce68b0a7d70f6b6078ac8d66e36c4724131)) -- test match new export ([ee96664](https://github.com/nextauthjs/adapters/commit/ee966647dadbc649d6a93f5ae4d5fb5deb6f6772)) - -### Features - -- add build step to package.json ([28a4f40](https://github.com/nextauthjs/adapters/commit/28a4f403b07fc115c171623d6801c9392f50bd28)) diff --git a/packages/adapter-fauna/README.md b/packages/adapter-fauna/README.md index f4a43330..f855aac0 100644 --- a/packages/adapter-fauna/README.md +++ b/packages/adapter-fauna/README.md @@ -1,60 +1,28 @@

-
- -      -

Fauna Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- Build Test - Bundle Size - @next-auth/fauna-adapter Version -

+
+ + + + + + +

Fauna Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the Fauna Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -You can find the Fauna schema and seed information in the docs at [authjs.dev/reference/adapters/fauna](https://authjs.dev/reference/adapters/fauna). - -## Getting Started - -1. Install `faunadb`, `next-auth` and `@next-auth/fauna-adapter` - -```js -npm install faunadb next-auth @next-auth/fauna-adapter@next -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { Client as FaunaClient } from "faunadb" -import { FaunaAdapter } from "@next-auth/fauna-adapter" - -const client = new FaunaClient({ - secret: "secret", - scheme: "http", - domain: "localhost", - port: 8443, -}) - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [], - adapter: FaunaAdapter(client) - ... -}) -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/fauna). \ No newline at end of file diff --git a/packages/adapter-fauna/src/index.ts b/packages/adapter-fauna/src/index.ts index 29cd0b1e..82c84a38 100644 --- a/packages/adapter-fauna/src/index.ts +++ b/packages/adapter-fauna/src/index.ts @@ -3,7 +3,7 @@ *
*

Official Fauna adapter for Auth.js / NextAuth.js.

* - * + * * *
* diff --git a/packages/adapter-firebase/README.md b/packages/adapter-firebase/README.md index bfa7ccda..a84a2e93 100644 --- a/packages/adapter-firebase/README.md +++ b/packages/adapter-firebase/README.md @@ -1,29 +1,28 @@

-
- - -

Firebase Adapter - Auth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- Build Test - Bundle Size - @next-auth/firebase-adapter Version -

+
+ + + + + + +

Firebase Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

+--- -This is the official Firebase Adapter for [Auth.js](https://authjs.dev) / [NextAuth.js](https://next-auth.js.org/), using the [Firebase Admin SDK](https://firebase.google.com/docs/admin/setup) and [Firestore](https://firebase.google.com/docs/firestore). - -## Documentation - -Check out the [documentation](https://authjs.dev/reference/adapter/firebase) to learn how to use this adapter in your project. - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/firebase). \ No newline at end of file diff --git a/packages/adapter-firebase/src/index.ts b/packages/adapter-firebase/src/index.ts index 577853e7..2fdf9d04 100644 --- a/packages/adapter-firebase/src/index.ts +++ b/packages/adapter-firebase/src/index.ts @@ -5,7 +5,7 @@ * using the Firebase Admin SDK *  and Firestore. * - * + * * * * diff --git a/packages/adapter-mikro-orm/CHANGELOG.md b/packages/adapter-mikro-orm/CHANGELOG.md deleted file mode 100644 index 6519a20a..00000000 --- a/packages/adapter-mikro-orm/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/mikro-orm-adapter@1.0.0...@next-auth/mikro-orm-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/mikro-orm-adapter diff --git a/packages/adapter-mikro-orm/README.md b/packages/adapter-mikro-orm/README.md index 6965546d..ffa08208 100644 --- a/packages/adapter-mikro-orm/README.md +++ b/packages/adapter-mikro-orm/README.md @@ -1,56 +1,28 @@

-
-      -

Mikro ORM Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- CI Test - Bundle Size - @next-auth/mikro-orm-adapter Version -

+
+ + + + + + +

MikroORM Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the MikroORM Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -## Getting Started - -1. Install `next-auth` and `@next-auth/mikro-orm-adapter` - - ```js - npm install next-auth @next-auth/mikro-orm-adapter@next - ``` - -2. Add this adapter to your `pages/api/[...nextauth].ts` next-auth configuration object. - - ```typescript title="pages/api/auth/[...nextauth].ts" - import NextAuth from "next-auth" - import { MikroOrmAdapter } from "@next-auth/mikro-orm-adapter" - - // For more information on each option (and a full list of options) go to - // https://authjs.dev/reference/configuration/auth-options - export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [], - adapter: MikroOrmAdapter({ - dbName: "./db.sqlite", - type: "sqlite", - debug: process.env.DEBUG === "true" || process.env.DEBUG?.includes("db"), - ... - }, { - // pass extended models as { entities: { } } if needed - }), - ... - }); - ``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/mikro-orm). \ No newline at end of file diff --git a/packages/adapter-mongodb/CHANGELOG.md b/packages/adapter-mongodb/CHANGELOG.md deleted file mode 100644 index 0a20d839..00000000 --- a/packages/adapter-mongodb/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/mongodb-adapter@1.0.0...@next-auth/mongodb-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/mongodb-adapter diff --git a/packages/adapter-mongodb/README.md b/packages/adapter-mongodb/README.md index 0455e62c..87a578e5 100644 --- a/packages/adapter-mongodb/README.md +++ b/packages/adapter-mongodb/README.md @@ -1,88 +1,28 @@

-
-      -

MongoDB Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- CI Test - Bundle Size - @next-auth/mongodb-adapter Version -

+
+ + + + + + +

MongoDB Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the MongoDB Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -## Getting Started - -1. Install `mongodb`, `next-auth` and `@next-auth/mongodb-adapter` - -```js -npm install mongodb next-auth @next-auth/mongodb-adapter@next -``` - -2. Add `lib/mongodb.js` - -```js -// This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb -import { MongoClient } from "mongodb" - -const uri = process.env.MONGODB_URI -const options = { - useUnifiedTopology: true, - useNewUrlParser: true, -} - -let client -let clientPromise - -if (!process.env.MONGODB_URI) { - throw new Error("Please add your Mongo URI to .env.local") -} - -if (process.env.NODE_ENV === "development") { - // In development mode, use a global variable so that the value - // is preserved across module reloads caused by HMR (Hot Module Replacement). - if (!global._mongoClientPromise) { - client = new MongoClient(uri, options) - global._mongoClientPromise = client.connect() - } - clientPromise = global._mongoClientPromise -} else { - // In production mode, it's best to not use a global variable. - client = new MongoClient(uri, options) - clientPromise = client.connect() -} - -// Export a module-scoped MongoClient promise. By doing this in a -// separate module, the client can be shared across functions. -export default clientPromise -``` - -3. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { MongoDBAdapter } from "@next-auth/mongodb-adapter" -import clientPromise from "lib/mongodb" - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - adapter: MongoDBAdapter(clientPromise, { - databaseName: 'my-data-base-name' - }), - ... -}) -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/mongodb). \ No newline at end of file diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index 90da4010..f12d4b83 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -2,7 +2,7 @@ *
*

Official MongoDB adapter for Auth.js / NextAuth.js.

* - * + * * *
* diff --git a/packages/adapter-neo4j/CHANGELOG.md b/packages/adapter-neo4j/CHANGELOG.md deleted file mode 100644 index 7fee90af..00000000 --- a/packages/adapter-neo4j/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.2](https://github.com/nextauthjs/adapters/compare/@next-auth/neo4j-adapter@1.0.1...@next-auth/neo4j-adapter@1.0.2) (2021-12-23) - -### Bug Fixes - -- **neo4j:** update user bugfix ([#352](https://github.com/nextauthjs/adapters/issues/352)) ([8c4ddbd](https://github.com/nextauthjs/adapters/commit/8c4ddbd70d04520a073354870e59040103e3d58d)) - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/neo4j-adapter@1.0.0...@next-auth/neo4j-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/neo4j-adapter diff --git a/packages/adapter-neo4j/README.md b/packages/adapter-neo4j/README.md index 0b374218..e6c0ed93 100644 --- a/packages/adapter-neo4j/README.md +++ b/packages/adapter-neo4j/README.md @@ -1,57 +1,28 @@

-
-      -

Neo4j Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- Canary CI Test - Bundle Size - @next-auth/neo4j-adapter Version -

+
+ + + + + + +

Neo4j Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the Neo4j Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -You can find the Neo4j schema in the docs at [authjs.dev/reference/adapters/neo4j](authjs.dev/reference/adapters/neo4j). - -## Getting Started - -1. Install `neo4j-driver`, `next-auth` and `@next-auth/neo4j-adapter` - -```js -npm install neo4j-driver next-auth @next-auth/neo4j-adapter@next -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import neo4j from "neo4j-driver" -import { Neo4jAdapter } from "@next-auth/neo4j-adapter" - -// Setup your neo4j driver instance -const driver = neo4j.driver( - "bolt://localhost", - neo4j.auth.basic("neo4j", "password") -) -const neo4jSession = driver.session() - -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [], - adapter: Neo4jAdapter(neo4jSession), - ... -}) -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please first read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/neo4j). \ No newline at end of file diff --git a/packages/adapter-pouchdb/README.md b/packages/adapter-pouchdb/README.md index 0d605941..87e08c2b 100644 --- a/packages/adapter-pouchdb/README.md +++ b/packages/adapter-pouchdb/README.md @@ -1,9 +1,9 @@


- + - +

PouchDB Adapter - NextAuth.js / Auth.js

diff --git a/packages/adapter-prisma/CHANGELOG.md b/packages/adapter-prisma/CHANGELOG.md deleted file mode 100644 index 72829533..00000000 --- a/packages/adapter-prisma/CHANGELOG.md +++ /dev/null @@ -1,26 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/prisma-adapter@1.0.0...@next-auth/prisma-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/prisma-adapter - -## [0.5.4](https://github.com/nextauthjs/adapters/compare/@next-auth/prisma-adapter@0.5.3...@next-auth/prisma-adapter@0.5.4) (2021-08-17) - -**Note:** Version bump only for package @next-auth/prisma-adapter - -## [0.5.3](https://github.com/nextauthjs/adapters/compare/@next-auth/prisma-adapter@0.5.2...@next-auth/prisma-adapter@0.5.3) (2021-07-11) - -### Bug Fixes - -- **prisma:** remove spread profile object ([#166](https://github.com/nextauthjs/adapters/issues/166)) ([d33dfb0](https://github.com/nextauthjs/adapters/commit/d33dfb0ea20667004831e5ac41e718008f233025)) - -## [0.5.2](https://github.com/nextauthjs/adapters/compare/@next-auth/prisma-adapter@0.5.1...@next-auth/prisma-adapter@0.5.2) (2021-07-02) - -**Note:** Version bump only for package @next-auth/prisma-adapter - -## [0.5.1](https://github.com/nextauthjs/adapters/compare/@next-auth/prisma-adapter@0.5.0...@next-auth/prisma-adapter@0.5.1) (2021-06-30) - -**Note:** Version bump only for package @next-auth/prisma-adapter diff --git a/packages/adapter-prisma/README.md b/packages/adapter-prisma/README.md index 0921bd8f..ae582a7c 100644 --- a/packages/adapter-prisma/README.md +++ b/packages/adapter-prisma/README.md @@ -1,55 +1,28 @@

-
-      -

Prisma Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- CI Test - Bundle Size - @next-auth/prisma-adapter Version -

+
+ + + + + + +

Prisma Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the Prisma Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -You can find the Prisma schema in the docs at [authjs.dev/reference/adapters/prisma](https://authjs.dev/reference/adapters/prisma). - -## Getting Started - -1. Install `next-auth` and `@next-auth/prisma-adapter` as well as `prisma` and `@prisma/client`. - -```js -npm install next-auth @next-auth/prisma-adapter @prisma/client -npm install --save-dev prisma -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { PrismaAdapter } from "@next-auth/prisma-adapter" -import * as Prisma from "@prisma/client" - -const prisma = new Prisma.PrismaClient() - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [], - adapter: PrismaAdapter(prisma) - ... -}) -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/prisma). \ No newline at end of file diff --git a/packages/adapter-prisma/src/index.ts b/packages/adapter-prisma/src/index.ts index 69897d85..012ea823 100644 --- a/packages/adapter-prisma/src/index.ts +++ b/packages/adapter-prisma/src/index.ts @@ -2,7 +2,7 @@ *
*

Official Prisma adapter for Auth.js / NextAuth.js.

* - * + * * *
* diff --git a/packages/adapter-sequelize/CHANGELOG.md b/packages/adapter-sequelize/CHANGELOG.md deleted file mode 100644 index cba071fc..00000000 --- a/packages/adapter-sequelize/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/sequelize-adapter@1.0.0...@next-auth/sequelize-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/sequelize-adapter diff --git a/packages/adapter-sequelize/README.md b/packages/adapter-sequelize/README.md index fcc91905..160ec535 100644 --- a/packages/adapter-sequelize/README.md +++ b/packages/adapter-sequelize/README.md @@ -1,96 +1,28 @@

-
-      -

Sequelize Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- CI Test - Bundle Size - @next-auth/sequelize-adapter Version -

+
+ + + + + + +

Sequelize Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the Sequelize Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -You can find the Sequelize schema in the docs at [authjs.dev/reference/adapters/sequelize](https://authjs.dev/reference/adapters/sequelize). - -## Getting Started - -1. Install `next-auth` and `@next-auth/sequelize-adapter` as well as `sequelize` and your [database driver](https://sequelize.org/master/manual/getting-started.html) of choice. - -```js -npm install next-auth @next-auth/sequelize-adapter sequelize sqlite3 -npm install --save-dev sequelize -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import SequelizeAdapter from "@next-auth/sequelize-adapter" -import Sequelize from 'sequelize' - -const sequelize = new Sequelize("sqlite::memory:") - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - ... - adapter: SequelizeAdapter(sequelize) - ... -}) -``` - -## Updating the database schema - -In development, the sequelize adapter will create the necessary tables, foreign keys and indexes in your database. In production, synchronization is disabled. Best practice is to create the [required tables](https://authjs.dev/reference/adapters/models) in your database via [migrations](https://sequelize.org/master/manual/migrations.html). - -In development, if you do not want the adapter to automatically create tables, you are able to pass `{ synchronize: false }` as the second option to `SequelizeAdapter` to disable this behavior: - -```js -import NextAuth from "next-auth" -import SequelizeAdapter from "@next-auth/sequelize-adapter" -import Sequelize from 'sequelize' - -const sequelize = new Sequelize("sqlite::memory:") - -export default NextAuth({ - ... - adapter: SequelizeAdapter(sequelize, { synchronize: false }) - ... -}) -``` - -## Using custom models - -Sequelize models are option to customization like so: - -```js -import NextAuth from "next-auth" -import SequelizeAdapter, { models } from "@next-auth/sequelize-adapter" -import Sequelize, { DataTypes } from 'sequelize' - -const sequelize = new Sequelize("sqlite::memory:") - -export default NextAuth({ - ... - adapter: SequelizeAdapter(sequelize, { - models: { - User: sequelize.define('user', { ...models.User, phoneNumber: DataTypes.STRING }) - } - }) - ... -}) -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/sequelize). \ No newline at end of file diff --git a/packages/adapter-supabase/README.md b/packages/adapter-supabase/README.md index 7d6c3bbf..821aff07 100644 --- a/packages/adapter-supabase/README.md +++ b/packages/adapter-supabase/README.md @@ -1,57 +1,28 @@

-
- - -

Supabase Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- Build Test - Bundle Size - @next-auth/supabase-adapter Version -

+
+ + + + + + +

Supabase Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the Supabase Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -You can find more Supabase information in the docs at [authjs.dev/reference/adapters/supabase](https://authjs.dev/reference/adapters/supabase). - -## Getting Started - -1. Install `@supabase/supabase-js`, `next-auth` and `@next-auth/supabase-adapter`. - -```js -npm install @supabase/supabase-js next-auth @next-auth/supabase-adapter -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { SupabaseAdapter } from "@next-auth/supabase-adapter" - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [ - // ... - ], - adapter: SupabaseAdapter({ - url: process.env.NEXT_PUBLIC_SUPABASE_URL, - secret: process.env.SUPABASE_SERVICE_ROLE_KEY, - }), - // ... -}) -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/next-auth/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/supabase). \ No newline at end of file diff --git a/packages/adapter-typeorm-legacy/CHANGELOG.md b/packages/adapter-typeorm-legacy/CHANGELOG.md deleted file mode 100644 index 3b35d350..00000000 --- a/packages/adapter-typeorm-legacy/CHANGELOG.md +++ /dev/null @@ -1,24 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.0.1](https://github.com/nextauthjs/adapters/compare/@next-auth/typeorm-legacy-adapter@1.0.0...@next-auth/typeorm-legacy-adapter@1.0.1) (2021-12-06) - -**Note:** Version bump only for package @next-auth/typeorm-legacy-adapter - -## [0.1.4](https://github.com/nextauthjs/adapters/compare/@next-auth/typeorm-legacy-adapter@0.1.3...@next-auth/typeorm-legacy-adapter@0.1.4) (2021-08-17) - -**Note:** Version bump only for package @next-auth/typeorm-legacy-adapter - -## [0.1.3](https://github.com/nextauthjs/adapters/compare/@next-auth/typeorm-legacy-adapter@0.1.2...@next-auth/typeorm-legacy-adapter@0.1.3) (2021-07-11) - -**Note:** Version bump only for package @next-auth/typeorm-legacy-adapter - -## [0.1.2](https://github.com/nextauthjs/adapters/compare/@next-auth/typeorm-legacy-adapter@0.1.1...@next-auth/typeorm-legacy-adapter@0.1.2) (2021-07-02) - -**Note:** Version bump only for package @next-auth/typeorm-legacy-adapter - -## [0.1.1](https://github.com/nextauthjs/adapters/compare/@next-auth/typeorm-legacy-adapter@0.1.0...@next-auth/typeorm-legacy-adapter@0.1.1) (2021-06-30) - -**Note:** Version bump only for package @next-auth/typeorm-legacy-adapter diff --git a/packages/adapter-typeorm-legacy/README.md b/packages/adapter-typeorm-legacy/README.md index 7ef24335..8bff6662 100644 --- a/packages/adapter-typeorm-legacy/README.md +++ b/packages/adapter-typeorm-legacy/README.md @@ -1,87 +1,28 @@

-
-      -

TypeORM (Legacy) Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- Canary CI Test - Bundle Size - @next-auth/typeorm-legacy-adapter Version -

+
+ + + + + + +

TypeORM Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the TypeORM Adapter for [`auth.js`](https://authjs.dev). This package can only be used in conjunction with the primary `auth.js` package. It is not a standalone package. - -You can find more TypeORM information in the docs at [authjs.dev/adapters/typeorm](https://authjs.dev/reference/adapters/typeorm). - -## Getting Started - -1. Install `typeorm`, `next-auth` and `@next-auth/typeorm-legacy-adapter` - -```js -npm install next-auth @next-auth/typeorm-legacy-adapter@next typeorm -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-config -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [], - adapter: TypeORMLegacyAdapter({ - type: 'sqlite', // or mysql, postgresql, mssql - database: ':memory:', - synchronize: true - }), - ... -}) -``` - -> The `synchronize` option in TypeORM will generate SQL that exactly matches the documented schemas for MySQL and Postgres. -> -> However, it should not be enabled against production databases as it may cause data loss if the configured schema does not match the expected schema! - -## Options - -This adapter supports MySQL, PostgreSQL, SQLite, as well as MSSQL. Further configuration options are listed below. - -> If you're looking for MongoDB support, it's been pulled out into its own adapter [@next-auth/mongodb-adapter](https://authjs.dev/reference/adapters/mongodb). - -### SQLite - -With sqlite, you have the option of using a file on disk as the database, or using a temporary in-memory database. In the `database` field you can either pass in a valid file path to the on-disk database you want to use, or simply write `:memory:` for an in-memory database which will disappear whenever you restart the process. - -### MySQL - -For MySQL, simply pass a valid connection string to the `database` option, such as `mysql://nextauth:password@127.0.0.1:3306/nextauth?synchronise=true`, and do not forget to set the `type` value to `mysql`. - -Schema: [mysql/schema.sql](https://github.com/nextauthjs/adapters/tree/canary/packages/typeorm-legacy/tests/mysql/schema.sql) - -### PostgreSQL - -For PostgreSQL, you also only need to pass a valid connection string to the `database` option, such as `postgres://nextauth:password@127.0.0.1:5432/nextauth`, and do not forget to set the `type` value to `postgres`. - -Schema: [postgresql/schema.sql](https://github.com/nextauthjs/adapters/tree/canary/packages/typeorm-legacy/tests/postgresql/schema.sql) - -### Microsoft SQL Server - -For MsSQL, pass a valid connection string to the `database` option, such as `mssql://nextauth:password@127.0.0.1:1433/nextauth`, and do not forget to set the `type` value to `mssql`. - -Schema: [mssql/schema.sql](https://github.com/nextauthjs/adapters/tree/canary/packages/typeorm-legacy/tests/mssql/schema.sql) - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/typeorm). \ No newline at end of file diff --git a/packages/adapter-upstash-redis/CHANGELOG.md b/packages/adapter-upstash-redis/CHANGELOG.md deleted file mode 100644 index 8f36f71c..00000000 --- a/packages/adapter-upstash-redis/CHANGELOG.md +++ /dev/null @@ -1,15 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# 1.1.0 (2022-01-17) - -### Bug Fixes - -- **upstash-redis:** expose environment variables in workflow ([#373](https://github.com/nextauthjs/adapters/issues/373)) ([fcee362](https://github.com/nextauthjs/adapters/commit/fcee36227fec4e42e818f104b06a3030838790da)) -- **upstash-redis:** fix deployment ([c2df2c8](https://github.com/nextauthjs/adapters/commit/c2df2c86b53f4e42a2bc1051256701ec7cc08fbd)) - -### Features - -- **upstash-redis:** add upstash-redis adapter ([#341](https://github.com/nextauthjs/adapters/issues/341)) ([f4a8464](https://github.com/nextauthjs/adapters/commit/f4a84644296f545c1dac16519337a6dc7718c88c)) diff --git a/packages/adapter-upstash-redis/README.md b/packages/adapter-upstash-redis/README.md index 4ead3a9c..39e565f8 100644 --- a/packages/adapter-upstash-redis/README.md +++ b/packages/adapter-upstash-redis/README.md @@ -1,87 +1,28 @@

-
-      -

Upstash Redis Adapter - NextAuth.js

-

- Open Source. Full Stack. Own Your Data. -

-

- CI Test - Bundle Size - @next-auth/upstash-adapter Version -

+
+ + + + + + +

Upstash Redis Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-## Overview +--- -This is the Upstash Redis adapter for [`next-auth`](https://authjs.dev). This package can only be used in conjunction with the primary `next-auth` and `@upstash/redis` packages. It is not a standalone package. - -## Getting Started - -1. Install `next-auth` and `@next-auth/upstash-redis-adapter` as well as `@upstash/redis` via NPM. - -```js -npm install next-auth @next-auth/upstash-redis-adapter @upstash/redis -``` - -2. Add the following code to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js -import NextAuth from "next-auth" -import { UpstashRedisAdapter } from "@next-auth/upstash-adapter" -import { Redis } from "@upstash/redis" - -const redis = new Redis({ - url:"UPSTASH_REDIS_REST_URL", - token:"UPSTASH_REDIS_REST_TOKEN", -}) - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - ... - adapter: UpstashRedisAdapter(redis) - ... -}) -``` - -## Using Multiple Apps with a Single Upstash Redis Instance - -The Upstash free-tier allows for only one Redis instance. If you have multiple Next-Auth connected apps using this instance, you need different key prefixes for every app. - -You can change the prefixes by passing an `options` object as the second argument to the adapter factory function. - -The default values for this object are: - -```js -const defaultOptions = { - baseKeyPrefix: "", - accountKeyPrefix: "user:account:", - accountByUserIdPrefix: "user:account:by-user-id:", - emailKeyPrefix: "user:email:", - sessionKeyPrefix: "user:session:", - sessionByUserIdKeyPrefix: "user:session:by-user-id:", - userKeyPrefix: "user:", - verificationTokenKeyPrefix: "user:token:", -} -``` - -Usually changing the `baseKeyPrefix` should be enough for this scenario, but for more custom setups, you can also change the prefixes of every single key. - -Example: - -```js -export default NextAuth({ - ... - adapter: UpstashRedisAdapter(redis, {baseKeyPrefix: "app2:"}) - ... -}) -``` - -## Contributing - -We're open to all community contributions! If you'd like to contribute in any way, please read our [Contributing Guide](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md). - -## License - -ISC +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/upstash-redis). \ No newline at end of file diff --git a/packages/adapter-xata/README.md b/packages/adapter-xata/README.md index 02c0cd00..a1898165 100644 --- a/packages/adapter-xata/README.md +++ b/packages/adapter-xata/README.md @@ -1,248 +1,28 @@

-
-      -

Xata Adapter - NextAuth.js

-

- Think data, not databases. -

-

- CI Test - Bundle Size - @next-auth/xata-adapter Version -

+
+ + + + + + +

Xata Adapter - NextAuth.js / Auth.js

+

+ + TypeScript + + + npm + + + Downloads + + + Github Stars + +

-This adapter allows using next-auth with Xata as a database to store users, sessions, and more. The preferred way to create a Xata project and use Xata databases is using the [Xata Command Line Interface (CLI)](https://docs.xata.io/cli/getting-started). The CLI allows generating a `XataClient` that will help you work with Xata in a safe way, and that this adapter depends on. +--- - - -## Getting Started - -Let's first make sure we have everything installed and configured. We're going to need: - -- next-auth + adapter -- the Xata CLI -- to configure the CLI - -We can do this like so: - -```bash npm2yarn2pnpm -# Install next-auth + adapter -npm install next-auth @next-auth/xata-adapter - -# Install the Xata CLI globally if you don't already have it -npm install --location=global @xata.io/cli - -# Login -xata auth login -``` - -Now that we're ready, let's create a new Xata project using our next-auth schema that the Xata adapter can work with. To do that, copy and paste this schema file into your project's directory: - -```json title="schema.json" -{ - "tables": [ - { - "name": "nextauth_users", - "columns": [ - { - "name": "email", - "type": "email" - }, - { - "name": "emailVerified", - "type": "datetime" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "image", - "type": "string" - } - ] - }, - { - "name": "nextauth_accounts", - "columns": [ - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - }, - { - "name": "type", - "type": "string" - }, - { - "name": "provider", - "type": "string" - }, - { - "name": "providerAccountId", - "type": "string" - }, - { - "name": "refresh_token", - "type": "string" - }, - { - "name": "access_token", - "type": "string" - }, - { - "name": "expires_at", - "type": "int" - }, - { - "name": "token_type", - "type": "string" - }, - { - "name": "scope", - "type": "string" - }, - { - "name": "id_token", - "type": "text" - }, - { - "name": "session_state", - "type": "string" - } - ] - }, - { - "name": "nextauth_verificationTokens", - "columns": [ - { - "name": "identifier", - "type": "string" - }, - { - "name": "token", - "type": "string" - }, - { - "name": "expires", - "type": "datetime" - } - ] - }, - { - "name": "nextauth_users_accounts", - "columns": [ - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - }, - { - "name": "account", - "type": "link", - "link": { - "table": "nextauth_accounts" - } - } - ] - }, - { - "name": "nextauth_users_sessions", - "columns": [ - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - }, - { - "name": "session", - "type": "link", - "link": { - "table": "nextauth_sessions" - } - } - ] - }, - { - "name": "nextauth_sessions", - "columns": [ - { - "name": "sessionToken", - "type": "string" - }, - { - "name": "expires", - "type": "datetime" - }, - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - } - ] - } - ] -} -``` - -Now, run the following command: - -```bash -xata init --schema=./path/to/your/schema.json -``` - -The CLI will walk you through a setup process where you choose a [workspace](https://docs.xata.io/concepts/workspaces) (kind of like a GitHub org or a Vercel team) and an appropriate database. We recommend using a fresh database for this, as we'll augment it with tables that next-auth needs. - -Once you're done, you can continue using next-auth in your project as expected, like creating a `./pages/api/auth/[...nextauth]` route. - -```typescript title="pages/api/auth/[...nextauth].ts" -import NextAuth from "next-auth" -import GoogleProvider from "next-auth/providers/google" - -const client = new XataClient() - -export default NextAuth({ - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - }), - ], -}) -``` - -Now to Xata-fy this route, let's add the Xata client and adapter: - -```diff -import NextAuth from "next-auth" -import GoogleProvider from "next-auth/providers/google" -+import { XataAdapter } from "@next-auth/xata-adapter" -+import { XataClient } from "../../../xata" // or wherever you've chosen to create the client - -+const client = new XataClient() - -export default NextAuth({ -+ adapter: XataAdapter(client), - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - }), - ], -}) -``` - -This fully sets up your next-auth site to work with Xata. - -## Contributing - -This is an open-source project created by humans, and as such, might have a few issues. If you experience any of these, we recommend [opening issues](https://github.com/nextauthjs/next-auth/issues/new?assignees=&labels=triage&template=1_bug_framework.yml&title=Issue%20on%20Xata%20adapter&description=I%20experienced%20this%20issue:\n##%20Reproduction%20Steps:\n\n-) that can help us solve problems and build reliable software. +Check out the documentation at [authjs.dev](https://authjs.dev/reference/adapter/xata). \ No newline at end of file From af415e9438790cae006f4f043d70d52f7dee9a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 22:31:12 +0100 Subject: [PATCH 41/80] fix: correct link --- packages/adapter-mongodb/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index f12d4b83..55b63be4 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -1,6 +1,6 @@ /** *
- *

Official MongoDB adapter for Auth.js / NextAuth.js.

+ *

Official MongoDB adapter for Auth.js / NextAuth.js.

* * * From b03378be7fd2ecb95653f7e3f9c481c5f9e97b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 22:37:27 +0100 Subject: [PATCH 42/80] fix: correct links --- packages/adapter-mongodb/src/index.ts | 2 +- packages/adapter-typeorm-legacy/src/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index 55b63be4..3bef3424 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -1,7 +1,7 @@ /** *
*

Official MongoDB adapter for Auth.js / NextAuth.js.

- * + * * * *
diff --git a/packages/adapter-typeorm-legacy/src/index.ts b/packages/adapter-typeorm-legacy/src/index.ts index ea33db83..f7a036d5 100644 --- a/packages/adapter-typeorm-legacy/src/index.ts +++ b/packages/adapter-typeorm-legacy/src/index.ts @@ -1,7 +1,7 @@ /** *
- *

Official TypeORM adapter for Auth.js / NextAuth.js.

- * + *

Official TypeORM adapter for Auth.js / NextAuth.js.

+ * * * *
From e39a968a7b175009e6ea936eb43a6c8b9f800ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 22:38:00 +0100 Subject: [PATCH 43/80] fix: correct logo link --- packages/adapter-typeorm-legacy/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-typeorm-legacy/src/index.ts b/packages/adapter-typeorm-legacy/src/index.ts index f7a036d5..624bbbf6 100644 --- a/packages/adapter-typeorm-legacy/src/index.ts +++ b/packages/adapter-typeorm-legacy/src/index.ts @@ -2,7 +2,7 @@ *
*

Official TypeORM adapter for Auth.js / NextAuth.js.

* - * + * * *
* From 09402bf2fce3f79088cf9246d49c642e270ed021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 20 Mar 2023 22:45:14 +0100 Subject: [PATCH 44/80] fix: correct logo link --- packages/adapter-dynamodb/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-dynamodb/src/index.ts b/packages/adapter-dynamodb/src/index.ts index d1f64d59..fb369361 100644 --- a/packages/adapter-dynamodb/src/index.ts +++ b/packages/adapter-dynamodb/src/index.ts @@ -2,7 +2,7 @@ *
*

Official DynamoDB adapter for Auth.js / NextAuth.js.

* - * + * * *
* From 81589bf738f5bb18da066481f8176f9927951b1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Tue, 21 Mar 2023 00:49:39 +0100 Subject: [PATCH 45/80] docs: remove/rename files/directories --- ...-tutorial.mdx => credentials-tutorial.mdx} | 0 .../{06-databases.md => databases.md} | 0 ...-email-tutorial.mdx => email-tutorial.mdx} | 0 .../{01-introduction.md => introduction.md} | 0 ...-oauth-tutorial.mdx => oauth-tutorial.mdx} | 0 .../{07-security.md => security.md} | 0 .../{05-typescript.md => typescript.md} | 0 .../{08-upgrade-to-v4.md => upgrade-to-v4.md} | 0 .../guides/04-providers/00-custom-provider.md | 136 ------ .../{05-adapters => adapters}/_category_.json | 0 .../creating-a-database-adapter.md | 0 .../using-a-database-adapter.md | 0 .../{03-basics => basics}/_category_.json | 0 .../guides/{03-basics => basics}/callbacks.md | 0 .../{03-basics => basics}/deployment.md | 0 .../guides/{03-basics => basics}/events.md | 0 .../{03-basics => basics}/initialization.md | 0 .../{03-basics => basics}/overriding-jwt.md | 0 .../guides/{03-basics => basics}/pages.md | 0 .../refresh-token-rotation.md | 0 .../role-based-access-control.md | 0 .../securing-pages-and-api-routes.md | 0 .../_category_.json | 0 ...-corporate-link-checking-email-provider.md | 0 .../corporate-proxy.md | 0 .../{08-other => other}/_category_.json | 0 .../guides/{08-other => other}/ldap-auth.md | 0 .../usage-with-class-components.md | 0 .../_category_.json | 0 .../credentials-provider.md} | 0 docs/docs/guides/providers/custom-provider.md | 112 +++++ .../email-http-api.md} | 0 .../email-provider.md} | 0 .../guides/{09-resources.md => resources.md} | 0 .../{06-testing => testing}/_category_.json | 0 .../testing-with-cypress.md | 0 .../02-configuration/01-auth-config.md | 447 ------------------ .../docs/reference/02-configuration/04-env.md | 38 -- .../02-configuration/_category_.json | 5 - .../04-providers/02-oauth-builtin.mdx | 23 - docs/docs/reference/04-providers/02-oauth.mdx | 193 -------- docs/docs/reference/04-providers/04-email.md | 19 - .../reference/04-providers/05-credentials.md | 17 - .../reference/04-providers/_category_.json | 5 - docs/docs/reference/04-providers/index.md | 16 - docs/docs/reference/05-oauth-providers/42.md | 38 -- .../05-oauth-providers/_category_.json | 5 - .../reference/05-oauth-providers/apple.md | 137 ------ .../reference/05-oauth-providers/atlassian.md | 52 -- .../reference/05-oauth-providers/auth0.md | 39 -- .../reference/05-oauth-providers/authentik.md | 35 -- .../05-oauth-providers/azure-ad-b2c.md | 117 ----- .../reference/05-oauth-providers/azure-ad.md | 59 --- .../reference/05-oauth-providers/battlenet.md | 46 -- docs/docs/reference/05-oauth-providers/box.md | 34 -- .../05-oauth-providers/boxyhq-saml.md | 58 --- .../reference/05-oauth-providers/bungie.md | 137 ------ .../reference/05-oauth-providers/cognito.md | 49 -- .../reference/05-oauth-providers/coinbase.md | 38 -- .../reference/05-oauth-providers/discord.md | 34 -- .../reference/05-oauth-providers/dropbox.md | 34 -- .../reference/05-oauth-providers/eveonline.md | 51 -- .../reference/05-oauth-providers/facebook.md | 42 -- .../reference/05-oauth-providers/faceit.md | 38 -- .../05-oauth-providers/foursquare.md | 39 -- .../05-oauth-providers/freshbooks.md | 34 -- .../05-oauth-providers/fusionauth.md | 59 --- .../reference/05-oauth-providers/github.md | 46 -- .../reference/05-oauth-providers/gitlab.md | 38 -- .../reference/05-oauth-providers/google.md | 93 ---- .../05-oauth-providers/identity-server4.md | 61 --- .../reference/05-oauth-providers/instagram.md | 50 -- .../reference/05-oauth-providers/kakao.md | 40 -- .../reference/05-oauth-providers/keycloak.md | 41 -- .../docs/reference/05-oauth-providers/line.md | 47 -- .../reference/05-oauth-providers/linkedin.md | 38 -- .../reference/05-oauth-providers/mailchimp.md | 34 -- .../reference/05-oauth-providers/mailru.md | 34 -- .../05-oauth-providers/mattermost.md | 36 -- .../reference/05-oauth-providers/medium.md | 38 -- .../reference/05-oauth-providers/naver.md | 34 -- .../reference/05-oauth-providers/netlify.md | 34 -- .../docs/reference/05-oauth-providers/okta.md | 31 -- .../reference/05-oauth-providers/onelogin.md | 35 -- .../docs/reference/05-oauth-providers/osso.md | 47 -- docs/docs/reference/05-oauth-providers/osu.md | 38 -- .../reference/05-oauth-providers/patreon.md | 40 -- .../reference/05-oauth-providers/pipedrive.md | 30 -- .../reference/05-oauth-providers/reddit.md | 73 --- .../05-oauth-providers/salesforce.md | 30 -- .../reference/05-oauth-providers/slack.md | 41 -- .../reference/05-oauth-providers/spotify.md | 34 -- .../reference/05-oauth-providers/strava.md | 30 -- .../reference/05-oauth-providers/todoist.md | 35 -- .../reference/05-oauth-providers/trakt.md | 41 -- .../reference/05-oauth-providers/twitch.md | 36 -- .../reference/05-oauth-providers/twitter.md | 62 --- .../05-oauth-providers/united-effects.md | 43 -- docs/docs/reference/05-oauth-providers/vk.md | 57 --- .../reference/05-oauth-providers/wordpress.md | 38 -- .../reference/05-oauth-providers/workos.md | 103 ---- .../reference/05-oauth-providers/yandex.md | 34 -- .../docs/reference/05-oauth-providers/zoho.md | 34 -- .../docs/reference/05-oauth-providers/zoom.md | 34 -- docs/docs/reference/08-rest-api.md | 73 --- .../reference/{04-nextjs => nextjs}/client.md | 0 .../reference/{04-nextjs => nextjs}/index.md | 0 .../{04-solidstart => solidstart}/client.md | 0 .../{04-solidstart => solidstart}/index.md | 0 .../protected.md | 0 .../reference/{09-warnings.md => warnings.md} | 0 docs/scripts/generate-providers.mjs | 18 +- 112 files changed, 124 insertions(+), 3763 deletions(-) rename docs/docs/getting-started/{04-credentials-tutorial.mdx => credentials-tutorial.mdx} (100%) rename docs/docs/getting-started/{06-databases.md => databases.md} (100%) rename docs/docs/getting-started/{03-email-tutorial.mdx => email-tutorial.mdx} (100%) rename docs/docs/getting-started/{01-introduction.md => introduction.md} (100%) rename docs/docs/getting-started/{02-oauth-tutorial.mdx => oauth-tutorial.mdx} (100%) rename docs/docs/getting-started/{07-security.md => security.md} (100%) rename docs/docs/getting-started/{05-typescript.md => typescript.md} (100%) rename docs/docs/getting-started/{08-upgrade-to-v4.md => upgrade-to-v4.md} (100%) delete mode 100644 docs/docs/guides/04-providers/00-custom-provider.md rename docs/docs/guides/{05-adapters => adapters}/_category_.json (100%) rename docs/docs/guides/{05-adapters => adapters}/creating-a-database-adapter.md (100%) rename docs/docs/guides/{05-adapters => adapters}/using-a-database-adapter.md (100%) rename docs/docs/guides/{03-basics => basics}/_category_.json (100%) rename docs/docs/guides/{03-basics => basics}/callbacks.md (100%) rename docs/docs/guides/{03-basics => basics}/deployment.md (100%) rename docs/docs/guides/{03-basics => basics}/events.md (100%) rename docs/docs/guides/{03-basics => basics}/initialization.md (100%) rename docs/docs/guides/{03-basics => basics}/overriding-jwt.md (100%) rename docs/docs/guides/{03-basics => basics}/pages.md (100%) rename docs/docs/guides/{03-basics => basics}/refresh-token-rotation.md (100%) rename docs/docs/guides/{03-basics => basics}/role-based-access-control.md (100%) rename docs/docs/guides/{03-basics => basics}/securing-pages-and-api-routes.md (100%) rename docs/docs/guides/{07-corporate-proxies => corporate-proxies}/_category_.json (100%) rename docs/docs/guides/{07-corporate-proxies => corporate-proxies}/avoid-corporate-link-checking-email-provider.md (100%) rename docs/docs/guides/{07-corporate-proxies => corporate-proxies}/corporate-proxy.md (100%) rename docs/docs/guides/{08-other => other}/_category_.json (100%) rename docs/docs/guides/{08-other => other}/ldap-auth.md (100%) rename docs/docs/guides/{08-other => other}/usage-with-class-components.md (100%) rename docs/docs/guides/{04-providers => providers}/_category_.json (100%) rename docs/docs/guides/{04-providers/01-credentials-provider.md => providers/credentials-provider.md} (100%) create mode 100644 docs/docs/guides/providers/custom-provider.md rename docs/docs/guides/{04-providers/03-email-http-api.md => providers/email-http-api.md} (100%) rename docs/docs/guides/{04-providers/02-email-provider.md => providers/email-provider.md} (100%) rename docs/docs/guides/{09-resources.md => resources.md} (100%) rename docs/docs/guides/{06-testing => testing}/_category_.json (100%) rename docs/docs/guides/{06-testing => testing}/testing-with-cypress.md (100%) delete mode 100644 docs/docs/reference/02-configuration/01-auth-config.md delete mode 100644 docs/docs/reference/02-configuration/04-env.md delete mode 100644 docs/docs/reference/02-configuration/_category_.json delete mode 100644 docs/docs/reference/04-providers/02-oauth-builtin.mdx delete mode 100644 docs/docs/reference/04-providers/02-oauth.mdx delete mode 100644 docs/docs/reference/04-providers/04-email.md delete mode 100644 docs/docs/reference/04-providers/05-credentials.md delete mode 100644 docs/docs/reference/04-providers/_category_.json delete mode 100644 docs/docs/reference/04-providers/index.md delete mode 100644 docs/docs/reference/05-oauth-providers/42.md delete mode 100644 docs/docs/reference/05-oauth-providers/_category_.json delete mode 100644 docs/docs/reference/05-oauth-providers/apple.md delete mode 100644 docs/docs/reference/05-oauth-providers/atlassian.md delete mode 100644 docs/docs/reference/05-oauth-providers/auth0.md delete mode 100644 docs/docs/reference/05-oauth-providers/authentik.md delete mode 100644 docs/docs/reference/05-oauth-providers/azure-ad-b2c.md delete mode 100644 docs/docs/reference/05-oauth-providers/azure-ad.md delete mode 100644 docs/docs/reference/05-oauth-providers/battlenet.md delete mode 100644 docs/docs/reference/05-oauth-providers/box.md delete mode 100644 docs/docs/reference/05-oauth-providers/boxyhq-saml.md delete mode 100644 docs/docs/reference/05-oauth-providers/bungie.md delete mode 100644 docs/docs/reference/05-oauth-providers/cognito.md delete mode 100644 docs/docs/reference/05-oauth-providers/coinbase.md delete mode 100644 docs/docs/reference/05-oauth-providers/discord.md delete mode 100644 docs/docs/reference/05-oauth-providers/dropbox.md delete mode 100644 docs/docs/reference/05-oauth-providers/eveonline.md delete mode 100644 docs/docs/reference/05-oauth-providers/facebook.md delete mode 100644 docs/docs/reference/05-oauth-providers/faceit.md delete mode 100644 docs/docs/reference/05-oauth-providers/foursquare.md delete mode 100644 docs/docs/reference/05-oauth-providers/freshbooks.md delete mode 100644 docs/docs/reference/05-oauth-providers/fusionauth.md delete mode 100644 docs/docs/reference/05-oauth-providers/github.md delete mode 100644 docs/docs/reference/05-oauth-providers/gitlab.md delete mode 100644 docs/docs/reference/05-oauth-providers/google.md delete mode 100644 docs/docs/reference/05-oauth-providers/identity-server4.md delete mode 100644 docs/docs/reference/05-oauth-providers/instagram.md delete mode 100644 docs/docs/reference/05-oauth-providers/kakao.md delete mode 100644 docs/docs/reference/05-oauth-providers/keycloak.md delete mode 100644 docs/docs/reference/05-oauth-providers/line.md delete mode 100644 docs/docs/reference/05-oauth-providers/linkedin.md delete mode 100644 docs/docs/reference/05-oauth-providers/mailchimp.md delete mode 100644 docs/docs/reference/05-oauth-providers/mailru.md delete mode 100644 docs/docs/reference/05-oauth-providers/mattermost.md delete mode 100644 docs/docs/reference/05-oauth-providers/medium.md delete mode 100644 docs/docs/reference/05-oauth-providers/naver.md delete mode 100644 docs/docs/reference/05-oauth-providers/netlify.md delete mode 100644 docs/docs/reference/05-oauth-providers/okta.md delete mode 100644 docs/docs/reference/05-oauth-providers/onelogin.md delete mode 100644 docs/docs/reference/05-oauth-providers/osso.md delete mode 100644 docs/docs/reference/05-oauth-providers/osu.md delete mode 100644 docs/docs/reference/05-oauth-providers/patreon.md delete mode 100644 docs/docs/reference/05-oauth-providers/pipedrive.md delete mode 100644 docs/docs/reference/05-oauth-providers/reddit.md delete mode 100644 docs/docs/reference/05-oauth-providers/salesforce.md delete mode 100644 docs/docs/reference/05-oauth-providers/slack.md delete mode 100644 docs/docs/reference/05-oauth-providers/spotify.md delete mode 100644 docs/docs/reference/05-oauth-providers/strava.md delete mode 100644 docs/docs/reference/05-oauth-providers/todoist.md delete mode 100644 docs/docs/reference/05-oauth-providers/trakt.md delete mode 100644 docs/docs/reference/05-oauth-providers/twitch.md delete mode 100644 docs/docs/reference/05-oauth-providers/twitter.md delete mode 100644 docs/docs/reference/05-oauth-providers/united-effects.md delete mode 100644 docs/docs/reference/05-oauth-providers/vk.md delete mode 100644 docs/docs/reference/05-oauth-providers/wordpress.md delete mode 100644 docs/docs/reference/05-oauth-providers/workos.md delete mode 100644 docs/docs/reference/05-oauth-providers/yandex.md delete mode 100644 docs/docs/reference/05-oauth-providers/zoho.md delete mode 100644 docs/docs/reference/05-oauth-providers/zoom.md delete mode 100644 docs/docs/reference/08-rest-api.md rename docs/docs/reference/{04-nextjs => nextjs}/client.md (100%) rename docs/docs/reference/{04-nextjs => nextjs}/index.md (100%) rename docs/docs/reference/{04-solidstart => solidstart}/client.md (100%) rename docs/docs/reference/{04-solidstart => solidstart}/index.md (100%) rename docs/docs/reference/{04-solidstart => solidstart}/protected.md (100%) rename docs/docs/reference/{09-warnings.md => warnings.md} (100%) diff --git a/docs/docs/getting-started/04-credentials-tutorial.mdx b/docs/docs/getting-started/credentials-tutorial.mdx similarity index 100% rename from docs/docs/getting-started/04-credentials-tutorial.mdx rename to docs/docs/getting-started/credentials-tutorial.mdx diff --git a/docs/docs/getting-started/06-databases.md b/docs/docs/getting-started/databases.md similarity index 100% rename from docs/docs/getting-started/06-databases.md rename to docs/docs/getting-started/databases.md diff --git a/docs/docs/getting-started/03-email-tutorial.mdx b/docs/docs/getting-started/email-tutorial.mdx similarity index 100% rename from docs/docs/getting-started/03-email-tutorial.mdx rename to docs/docs/getting-started/email-tutorial.mdx diff --git a/docs/docs/getting-started/01-introduction.md b/docs/docs/getting-started/introduction.md similarity index 100% rename from docs/docs/getting-started/01-introduction.md rename to docs/docs/getting-started/introduction.md diff --git a/docs/docs/getting-started/02-oauth-tutorial.mdx b/docs/docs/getting-started/oauth-tutorial.mdx similarity index 100% rename from docs/docs/getting-started/02-oauth-tutorial.mdx rename to docs/docs/getting-started/oauth-tutorial.mdx diff --git a/docs/docs/getting-started/07-security.md b/docs/docs/getting-started/security.md similarity index 100% rename from docs/docs/getting-started/07-security.md rename to docs/docs/getting-started/security.md diff --git a/docs/docs/getting-started/05-typescript.md b/docs/docs/getting-started/typescript.md similarity index 100% rename from docs/docs/getting-started/05-typescript.md rename to docs/docs/getting-started/typescript.md diff --git a/docs/docs/getting-started/08-upgrade-to-v4.md b/docs/docs/getting-started/upgrade-to-v4.md similarity index 100% rename from docs/docs/getting-started/08-upgrade-to-v4.md rename to docs/docs/getting-started/upgrade-to-v4.md diff --git a/docs/docs/guides/04-providers/00-custom-provider.md b/docs/docs/guides/04-providers/00-custom-provider.md deleted file mode 100644 index b539f37b..00000000 --- a/docs/docs/guides/04-providers/00-custom-provider.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: Using a custom Provider -sidebar_label: Creating a Provider ---- - -You can use an OAuth provider that isn't built-in by using a custom object. - -As an example of what this looks like, this is the provider object returned for the Google provider: - -```js -{ - id: "google", - name: "Google", - type: "oauth", - wellKnown: "https://accounts.google.com/.well-known/openid-configuration", - authorization: { params: { scope: "openid email profile" } }, - idToken: true, - checks: ["pkce", "state"], - profile(profile) { - return { - id: profile.sub, - name: profile.name, - email: profile.email, - image: profile.picture, - } - }, -} -``` - -As you can see, if your provider supports OpenID Connect and the `/.well-known/openid-configuration` endpoint contains support for the `grant_type`: `authorization_code`, you only need to pass the URL to that configuration file and define some basic fields like `name` and `type`. - -Otherwise, you can pass a more full set of URLs for each OAuth2.0 flow step, for example: - -```js -{ - id: "kakao", - name: "Kakao", - type: "oauth", - authorization: "https://kauth.kakao.com/oauth/authorize", - token: "https://kauth.kakao.com/oauth/token", - userinfo: "https://kapi.kakao.com/v2/user/me", - profile(profile) { - return { - id: profile.id, - name: profile.kakao_account?.profile.nickname, - email: profile.kakao_account?.email, - image: profile.kakao_account?.profile.profile_image_url, - } - }, -} -``` - -Replace all the options in this JSON object with the ones from your custom provider - be sure to give it a unique ID and specify the required URLs, and finally add it to the providers array when initializing the library: - -```js title="pages/api/auth/[...nextauth].js" -import TwitterProvider from "next-auth/providers/twitter" -... -providers: [ - TwitterProvider({ - clientId: process.env.TWITTER_ID, - clientSecret: process.env.TWITTER_SECRET, - }), - { - id: 'customProvider', - name: 'CustomProvider', - type: 'oauth', - scope: '' // Make sure to request the users email address - ... - } -] -... -``` - -### Override default options - -For built-in providers, in most cases you will only need to specify the `clientId` and `clientSecret`. If you need to override any of the defaults, add your own [options](#options). - -Even if you are using a built-in provider, you can override any of these options to tweak the default configuration. - -:::note -The user provided options are deeply merged with the default options. That means you only have to override part of the options that you need to be different. For example if you want different scopes, overriding `authorization.params.scope` is enough, instead of the whole `authorization` option. -::: - -```js title=/api/auth/[...nextauth].js -import Auth0Provider from "next-auth/providers/auth0" - -Auth0Provider({ - clientId: process.env.CLIENT_ID, - clientSecret: process.env.CLIENT_SECRET, - issuer: process.env.ISSUER, - authorization: { params: { scope: "openid your_custom_scope" } }, -}) -``` - -Another example, the `profile` callback will return `id`, `name`, `email` and `picture` by default, but you might need more information from the provider. After setting the correct scopes, you can then do something like this: - -```js title=/api/auth/[...nextauth].js -import GoogleProvider from "next-auth/providers/google" - -GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - profile(profile) { - return { - // Return all the profile information you need. - // The only truly required field is `id` - // to be able identify the account when added to a database - } - }, -}) -``` - -An example of how to enable automatic account linking: - -```js title=/api/auth/[...nextauth].js -import GoogleProvider from "next-auth/providers/google" -GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - allowDangerousEmailAccountLinking: true, -}) -``` - -### Adding a new built-in provider - -If you think your custom provider might be useful to others, we encourage you to open a PR and add it to the built-in list so others can discover it much more easily! - -You only need to add three changes: - -1. Add your config: [`src/providers/{provider}.ts`](https://github.com/nextauthjs/next-auth/tree/main/packages/next-auth/src/providers)
- - Make sure you use a named default export, like this: `export default function YourProvider` - - Add two SVG's of the provider logo, like `google-dark.svg` (dark mode) and `google.svg` (light mode), to the `/packages/next-auth/provider-logos/` directory as well as the styling config to the provider config object. See existing provider for example -2. Add provider documentation: [`docs/docs/reference/05-oauth-providers/{provider}.md`](https://github.com/nextauthjs/next-auth/tree/main/docs/docs/reference/05-oauth-providers) -3. Add the new provider name to the `Provider type` dropdown options in [`the provider issue template`](https://github.com/nextauthjs/next-auth/edit/main/.github/ISSUE_TEMPLATE/2_bug_provider.yml) - -That's it! 🎉 Others will be able to discover and use this provider much more easily now! diff --git a/docs/docs/guides/05-adapters/_category_.json b/docs/docs/guides/adapters/_category_.json similarity index 100% rename from docs/docs/guides/05-adapters/_category_.json rename to docs/docs/guides/adapters/_category_.json diff --git a/docs/docs/guides/05-adapters/creating-a-database-adapter.md b/docs/docs/guides/adapters/creating-a-database-adapter.md similarity index 100% rename from docs/docs/guides/05-adapters/creating-a-database-adapter.md rename to docs/docs/guides/adapters/creating-a-database-adapter.md diff --git a/docs/docs/guides/05-adapters/using-a-database-adapter.md b/docs/docs/guides/adapters/using-a-database-adapter.md similarity index 100% rename from docs/docs/guides/05-adapters/using-a-database-adapter.md rename to docs/docs/guides/adapters/using-a-database-adapter.md diff --git a/docs/docs/guides/03-basics/_category_.json b/docs/docs/guides/basics/_category_.json similarity index 100% rename from docs/docs/guides/03-basics/_category_.json rename to docs/docs/guides/basics/_category_.json diff --git a/docs/docs/guides/03-basics/callbacks.md b/docs/docs/guides/basics/callbacks.md similarity index 100% rename from docs/docs/guides/03-basics/callbacks.md rename to docs/docs/guides/basics/callbacks.md diff --git a/docs/docs/guides/03-basics/deployment.md b/docs/docs/guides/basics/deployment.md similarity index 100% rename from docs/docs/guides/03-basics/deployment.md rename to docs/docs/guides/basics/deployment.md diff --git a/docs/docs/guides/03-basics/events.md b/docs/docs/guides/basics/events.md similarity index 100% rename from docs/docs/guides/03-basics/events.md rename to docs/docs/guides/basics/events.md diff --git a/docs/docs/guides/03-basics/initialization.md b/docs/docs/guides/basics/initialization.md similarity index 100% rename from docs/docs/guides/03-basics/initialization.md rename to docs/docs/guides/basics/initialization.md diff --git a/docs/docs/guides/03-basics/overriding-jwt.md b/docs/docs/guides/basics/overriding-jwt.md similarity index 100% rename from docs/docs/guides/03-basics/overriding-jwt.md rename to docs/docs/guides/basics/overriding-jwt.md diff --git a/docs/docs/guides/03-basics/pages.md b/docs/docs/guides/basics/pages.md similarity index 100% rename from docs/docs/guides/03-basics/pages.md rename to docs/docs/guides/basics/pages.md diff --git a/docs/docs/guides/03-basics/refresh-token-rotation.md b/docs/docs/guides/basics/refresh-token-rotation.md similarity index 100% rename from docs/docs/guides/03-basics/refresh-token-rotation.md rename to docs/docs/guides/basics/refresh-token-rotation.md diff --git a/docs/docs/guides/03-basics/role-based-access-control.md b/docs/docs/guides/basics/role-based-access-control.md similarity index 100% rename from docs/docs/guides/03-basics/role-based-access-control.md rename to docs/docs/guides/basics/role-based-access-control.md diff --git a/docs/docs/guides/03-basics/securing-pages-and-api-routes.md b/docs/docs/guides/basics/securing-pages-and-api-routes.md similarity index 100% rename from docs/docs/guides/03-basics/securing-pages-and-api-routes.md rename to docs/docs/guides/basics/securing-pages-and-api-routes.md diff --git a/docs/docs/guides/07-corporate-proxies/_category_.json b/docs/docs/guides/corporate-proxies/_category_.json similarity index 100% rename from docs/docs/guides/07-corporate-proxies/_category_.json rename to docs/docs/guides/corporate-proxies/_category_.json diff --git a/docs/docs/guides/07-corporate-proxies/avoid-corporate-link-checking-email-provider.md b/docs/docs/guides/corporate-proxies/avoid-corporate-link-checking-email-provider.md similarity index 100% rename from docs/docs/guides/07-corporate-proxies/avoid-corporate-link-checking-email-provider.md rename to docs/docs/guides/corporate-proxies/avoid-corporate-link-checking-email-provider.md diff --git a/docs/docs/guides/07-corporate-proxies/corporate-proxy.md b/docs/docs/guides/corporate-proxies/corporate-proxy.md similarity index 100% rename from docs/docs/guides/07-corporate-proxies/corporate-proxy.md rename to docs/docs/guides/corporate-proxies/corporate-proxy.md diff --git a/docs/docs/guides/08-other/_category_.json b/docs/docs/guides/other/_category_.json similarity index 100% rename from docs/docs/guides/08-other/_category_.json rename to docs/docs/guides/other/_category_.json diff --git a/docs/docs/guides/08-other/ldap-auth.md b/docs/docs/guides/other/ldap-auth.md similarity index 100% rename from docs/docs/guides/08-other/ldap-auth.md rename to docs/docs/guides/other/ldap-auth.md diff --git a/docs/docs/guides/08-other/usage-with-class-components.md b/docs/docs/guides/other/usage-with-class-components.md similarity index 100% rename from docs/docs/guides/08-other/usage-with-class-components.md rename to docs/docs/guides/other/usage-with-class-components.md diff --git a/docs/docs/guides/04-providers/_category_.json b/docs/docs/guides/providers/_category_.json similarity index 100% rename from docs/docs/guides/04-providers/_category_.json rename to docs/docs/guides/providers/_category_.json diff --git a/docs/docs/guides/04-providers/01-credentials-provider.md b/docs/docs/guides/providers/credentials-provider.md similarity index 100% rename from docs/docs/guides/04-providers/01-credentials-provider.md rename to docs/docs/guides/providers/credentials-provider.md diff --git a/docs/docs/guides/providers/custom-provider.md b/docs/docs/guides/providers/custom-provider.md new file mode 100644 index 00000000..a2a3bbd4 --- /dev/null +++ b/docs/docs/guides/providers/custom-provider.md @@ -0,0 +1,112 @@ +--- +title: Customized OAuth Provider +--- + +Auth.js comes with a set of built-in OAuth providers that you can import from `@auth/core/providers/*`. Every provider has their separate documentation page under the [core package's API Reference](/reference/core) + + +## Use your own provider + +However, you can use _any_ provider as long as they are compliant with the OAuth/OIDC specifications. + +Auth.js uses the [`oauth4webapi`](https://github.com/panva/oauth4webapi/blob/main/docs/README.md) package under the hood. + +To use a custom OAuth provider with Auth.js, pass an object to the [`providers` list](/reference/core#providers). + +It can implement either the [`OAuth2Config`](/reference/core/providers#oauth2configprofile) or the [`OIDCConfig`](/reference/core/providers#oidcconfigprofile) interface, depending on if your provider is OAuth 2 or OpenID Connect compliant. + +For example, if you have a fully OIDC-compliant provider, this is all you need: + +```ts +import type { OIDCConfig } from "@auth/core/providers" + +... +providers: [ + { + id: "my-oidc-provider", + name: "My Provider", + type: "oidc", + issuer: "https://my.oidc-provider.com", + clientId: process.env.CLIENT_ID, + clientSecret: process.env.CLIENT_SECRET + } satisfies OIDCConfig +] +... +``` + +Then, you can set the [Redirect URI](https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-07.html#name-client-redirection-endpoint) in your provider's dashboard to something like `https://app-url.com/{path-to-auth-handler}/callback/my-oidc-provider`. + +`{path-to-auth-handler}` is _usually_ `auth` or `api/auth`, depending on your framework of your choice. +`my-oidc-provider` matches the `id` you set in the [`providers` list](/reference/core#providers). + + +## Override default provider config + +For built-in providers, in most cases you will only need to specify the `clientId` and `clientSecret`, and in case of OIDC providers, the `issuer` property. If you need to override any of the defaults, you can add them in the provider's function call and they will be deep-merged with the default configuration options. + +:::note +The user provided options are deeply merged with the default options. That means you only have to override part of the options that you need to be different. For example if you want different scopes, overriding `authorization.params.scope` is enough, instead of the whole `authorization` option. +::: + + +For example, to override a provider's default scopes, you can do the following: + +```ts +import Auth0Provider from "@auth/core/providers/auth0" + +Auth0Provider({ + clientId: process.env.CLIENT_ID, + clientSecret: process.env.CLIENT_SECRET, + issuer: process.env.ISSUER, + authorization: { params: { scope: "openid your_custom_scope" } }, +}) +``` + +Another example, the `profile` callback will return `id`, `name`, `email` and `picture` by default, but you might want to return more information from the provider. After setting the correct scopes, you can then do something like this: + +```ts +import GoogleProvider from "@auth/core/providers/google" + +GoogleProvider({ + clientId: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + profile(profile) { + return { + // Return all the profile information you need. + // The only truly required field is `id` + // to be able identify the account when added to a database + } + }, +}) +``` + +An example of how to enable automatic account linking: + +```ts +import GoogleProvider from "@auth/core/providers/google" + +GoogleProvider({ + clientId: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + allowDangerousEmailAccountLinking: true, +}) +``` + +### Adding a new built-in provider + +If you think your custom provider might be useful to others, we encourage you to open a PR and add it to the built-in list. + +:::note +We are only accepting new providers to `@auth/core`, and not `next-auth`. Follow the steps below to make sure your PR is merged! +::: + +1. Create a new `{provider}.ts` (for it to get merged, you must use TypeScript) file under the [`packages/core/src/providers`](https://github.com/nextauthjs/next-auth/tree/main/packages/core/src/providers) directory. +2. Make sure that you are following other providers, ie.: + - Use a named default export: `export default function YourProvider` + - Export the TypeScript `interface` that defines the provider's available user info properties + - Add the necessary JSDoc comments/documentation (Study the built-in providers to get an understanding what's needed. For example, the [Auth0 provider](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/auth0.ts) is a good example for OIDC and the [GitHub Provider](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/github.ts) is an OAuth provider.) + - Add links to the provider's API reference/documentation so others can understand how to use the provider +3. Add the new provider name to the `Provider type` dropdown options in [`the provider issue template`](https://github.com/nextauthjs/next-auth/edit/main/.github/ISSUE_TEMPLATE/2_bug_provider.yml) +4. (Optional): Add a logo `{provider}.svg` to the [`docs/static/img/providers`](https://github.com/nextauthjs/next-auth/tree/main/docs/static/img/providers) directory. + +That's it! 🎉 Others will be able to discover and use this provider! \ No newline at end of file diff --git a/docs/docs/guides/04-providers/03-email-http-api.md b/docs/docs/guides/providers/email-http-api.md similarity index 100% rename from docs/docs/guides/04-providers/03-email-http-api.md rename to docs/docs/guides/providers/email-http-api.md diff --git a/docs/docs/guides/04-providers/02-email-provider.md b/docs/docs/guides/providers/email-provider.md similarity index 100% rename from docs/docs/guides/04-providers/02-email-provider.md rename to docs/docs/guides/providers/email-provider.md diff --git a/docs/docs/guides/09-resources.md b/docs/docs/guides/resources.md similarity index 100% rename from docs/docs/guides/09-resources.md rename to docs/docs/guides/resources.md diff --git a/docs/docs/guides/06-testing/_category_.json b/docs/docs/guides/testing/_category_.json similarity index 100% rename from docs/docs/guides/06-testing/_category_.json rename to docs/docs/guides/testing/_category_.json diff --git a/docs/docs/guides/06-testing/testing-with-cypress.md b/docs/docs/guides/testing/testing-with-cypress.md similarity index 100% rename from docs/docs/guides/06-testing/testing-with-cypress.md rename to docs/docs/guides/testing/testing-with-cypress.md diff --git a/docs/docs/reference/02-configuration/01-auth-config.md b/docs/docs/reference/02-configuration/01-auth-config.md deleted file mode 100644 index ea8e74fa..00000000 --- a/docs/docs/reference/02-configuration/01-auth-config.md +++ /dev/null @@ -1,447 +0,0 @@ ---- -title: Initialization ---- - -## Options - -Options are passed to Auth.js when initializing it in a server environment like a Next.js API Route. - -### providers - -- **Default value**: `[]` -- **Required**: _Yes_ - -#### Description - -An array of authentication providers for signing in (e.g. Google, Facebook, Twitter, GitHub, Email, etc) in any order. This can be one of the built-in providers or an object with a custom provider. - -Refer to the list of [all available Oauth providers](/reference/providers/oauth-builtin) and the [Oauth tutorial](/getting-started/oauth-tutorial) on how to use them. - ---- - -### secret - -- **Default value**: `string` (_SHA hash of the "options" object_) in development, no default in production. -- **Required**: _Yes, in production!_ - -#### Description - -A random string is used to hash tokens, sign/encrypt cookies and generate cryptographic keys. - -If you set [`NEXTAUTH_SECRET`](#nextauth_secret) as an environment variable, you don't have to define this option. - -If no value specified specified in development (and there is no `NEXTAUTH_SECRET` variable either), it uses a hash for all configuration options, including OAuth Client ID / Secrets for entropy. - -:::warning -Not providing any `secret` or `NEXTAUTH_SECRET` will throw [an error](/reference/errors#no_secret) in production. -::: - -You can quickly create a good value on the command line via this `openssl` command. - -```bash -$ openssl rand -base64 32 -``` - -:::tip -If you rely on the default secret generation in development, you might notice JWT decryption errors, since the secret changes whenever you change your configuration. Defining an explicit secret will make this problem go away. We will likely make this option mandatory, even in development, in the future. -::: - ---- - -### session - -- **Default value**: `object` -- **Required**: _No_ - -#### Description - -The `session` object and all properties on it are optional. - -Default values for this option are shown below: - -```js -session: { - // Choose how you want to save the user session. - // The default is `"jwt"`, an encrypted JWT (JWE) stored in the session cookie. - // If you use an `adapter` however, we default it to `"database"` instead. - // You can still force a JWT session by explicitly defining `"jwt"`. - // When using `"database"`, the session cookie will only contain a `sessionToken` value, - // which is used to look up the session in the database. - strategy: "database", - - // Seconds - How long until an idle session expires and is no longer valid. - maxAge: 30 * 24 * 60 * 60, // 30 days - - // Seconds - Throttle how frequently to write to database to extend a session. - // Use it to limit write operations. Set to 0 to always update the database. - // Note: This option is ignored if using JSON Web Tokens - updateAge: 24 * 60 * 60, // 24 hours -} -``` - ---- - -### jwt - -- **Default value**: `object` -- **Required**: _No_ - -#### Description - -JSON Web Tokens can be used for session tokens if enabled with `session: { strategy: "jwt" }` option. JSON Web Tokens are enabled by default if you have not specified an adapter. JSON Web Tokens are encrypted (JWE) by default. We recommend you keep this behaviour. See the [Override JWT `encode` and `decode` methods](#override-jwt-encode-and-decode-methods) advanced option. - -#### JSON Web Token Options - -```js -jwt: { - // The maximum age of the Auth.js issued JWT in seconds. - // Defaults to `session.maxAge`. - maxAge: 60 * 60 * 24 * 30, - // You can define your own encode/decode functions for signing and encryption - async encode() {}, - async decode() {}, -} -``` - -An example JSON Web Token contains a payload like this: - -```js -{ - name: 'Iain Collins', - email: 'me@iaincollins.com', - picture: 'https://example.com/image.jpg', - iat: 1594601838, - exp: 1597193838 -} -``` - -#### JWT Helper - -You can use the built-in `getToken()` helper method to verify and decrypt the token, like this: - -```js -import { getToken } from "next-auth/jwt" - -const secret = process.env.NEXTAUTH_SECRET - -export default async function handler(req, res) { - // if using `NEXTAUTH_SECRET` env variable, we detect it, and you won't actually need to `secret` - // const token = await getToken({ req }) - const token = await getToken({ req, secret }) - console.log("JSON Web Token", token) - res.end() -} -``` - -_For convenience, this helper function is also able to read and decode tokens passed from the `Authorization: 'Bearer token'` HTTP header._ - -**Required** - -The getToken() helper requires the following options: - -- `req` - (object) Request object -- `secret` - (string) JWT Secret. Use `NEXTAUTH_SECRET` instead. - -You must also pass _any options configured on the `jwt` option_ to the helper. - -e.g. Including custom session `maxAge` and custom signing and/or encryption keys or options - -**Optional** - -It also supports the following options: - -- `secureCookie` - (boolean) Use secure prefixed cookie name - - By default, the helper function will attempt to determine if it should use the secure prefixed cookie (e.g. `true` in production and `false` in development, unless NEXTAUTH_URL contains an HTTPS URL). - -- `cookieName` - (string) Session token cookie name - - The `secureCookie` option is ignored if `cookieName` is explicitly specified. - -- `raw` - (boolean) Get raw token (not decoded) - - If set to `true` returns the raw token without decrypting or verifying it. - -:::note -The JWT is stored in the Session Token cookie, the same cookie used for tokens with database sessions. -::: - ---- - -### pages - -- **Default value**: `{}` -- **Required**: _No_ - -#### Description - -Specify URLs to be used if you want to create custom sign in, sign out and error pages. - -Pages specified will override the corresponding built-in page. - -_For example:_ - -```js -pages: { - signIn: '/auth/signin', - signOut: '/auth/signout', - error: '/auth/error', // Error code passed in query string as ?error= - verifyRequest: '/auth/verify-request', // (used for check email message) - newUser: '/auth/new-user' // New users will be directed here on first sign in (leave the property out if not of interest) -} -``` - -:::note -When using this configuration, ensure that these pages actually exist. For example `error: '/auth/error'` refers to a page file at `pages/auth/error.js`. -::: - -See the documentation for the [creating custom pages guide](/guides/basics/pages) for more information. - ---- - -### callbacks - -- **Default value**: `object` -- **Required**: _No_ - -#### Description - -Callbacks are asynchronous functions you can use to control what happens when an action is performed. - -Callbacks are extremely powerful, especially in scenarios involving JSON Web Tokens as they allow you to implement access controls without a database and to integrate with external databases or APIs. - -You can specify a handler for any of the callbacks below. - -```js -callbacks: { - async signIn({ user, account, profile, email, credentials }) { - return true - }, - async redirect({ url, baseUrl }) { - return baseUrl - }, - async session({ session, token, user }) { - return session - }, - async jwt({ token, user, account, profile, isNewUser }) { - return token - } -} -``` - -See [our callbacks guide](/guides/basics/callbacks) for more information on how to use the callback functions. - ---- - -### events - -- **Default value**: `object` -- **Required**: _No_ - -#### Description - -Events are asynchronous functions that do not return a response, they are useful for audit logging. - -You can specify a handler for any of these events below - e.g. for debugging or to create an audit log. - -The content of the message object varies depending on the flow (e.g. OAuth or Email authentication flow, JWT or database sessions, etc). See the [events guide](/guides/basics/events) for more information on the form of each message object and how to use the events functions. - -```js -events: { - async signIn(message) { /* on successful sign in */ }, - async signOut(message) { /* on signout */ }, - async createUser(message) { /* user created */ }, - async updateUser(message) { /* user updated - e.g. their email was verified */ }, - async linkAccount(message) { /* account (e.g. Twitter) linked to a user */ }, - async session(message) { /* session is active */ }, -} -``` - ---- - -### adapter - -- **Default value**: none -- **Required**: _No_ - -#### Description - -By default Auth.js does not include an adapter any longer. If you would like to persist user / account data, please install one of the many available adapters. More information can be found in the [adapter documentation](/reference/adapters/overview). - ---- - -### debug - -- **Default value**: `false` -- **Required**: _No_ - -#### Description - -Set debug to `true` to enable debug messages for authentication and database operations. - ---- - -### logger - -- **Default value**: `console` -- **Required**: _No_ - -#### Description - -Override any of the logger levels (`undefined` levels will use the built-in logger), and intercept logs in NextAuth. You can use this to send NextAuth logs to a third-party logging service. - -The `code` parameter for `error` and `warn` are explained in the [Warnings](/reference/warnings) and [Errors](/reference/errors) pages respectively. - -Example: - -```js title="/pages/api/auth/[...nextauth].js" -import log from "logging-service" - -export default NextAuth({ - ... - logger: { - error(code, metadata) { - log.error(code, metadata) - }, - warn(code) { - log.warn(code) - }, - debug(code, metadata) { - log.debug(code, metadata) - } - } - ... -}) -``` - -:::note -If the `debug` level is defined by the user, it will be called regardless of the `debug: false` [option](#debug). -::: - ---- - -### theme - -- **Default value**: `object` -- **Required**: _No_ - -#### Description - -Changes the color scheme theme of [pages](/reference/configuration/auth-config#pages) as well as allows some minor customization. Set `theme.colorScheme` to `"light"`, if you want to force pages to always be light. Set to `"dark"`, if you want to force pages to always be dark. Set to `"auto"`, (or leave this option out) if you want the pages to follow the preferred system theme. (Uses the [prefers-color-scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme) media query.) - -In addition, you can define a logo URL in `theme.logo` which will be rendered above the main card in the default signin/signout/error/verify-request pages, as well as a `theme.brandColor` which will affect the accent color of these pages. - -```js -theme: { - colorScheme: "auto", // "auto" | "dark" | "light" - brandColor: "", // Hex color code - logo: "" // Absolute URL to image -} -``` - ---- - -## Advanced Options - -Advanced options are passed the same way as basic options, but may have complex implications or side effects. You should try to avoid using advanced options unless you are very comfortable using them. - ---- - -### useSecureCookies - -- **Default value**: `true` for HTTPS sites / `false` for HTTP sites -- **Required**: _No_ - -#### Description - -When set to `true` (the default for all site URLs that start with `https://`) then all cookies set by Auth.js will only be accessible from HTTPS URLs. - -This option defaults to `false` on URLs that start with `http://` (e.g. `http://localhost:3000`) for developer convenience. - -:::note -Properties on any custom `cookies` that are specified override this option. -::: - -:::warning -Setting this option to _false_ in production is a security risk and may allow sessions to be hijacked if used in production. It is intended to support development and testing. Using this option is not recommended. -::: - ---- - -### cookies - -- **Default value**: `{}` -- **Required**: _No_ - -#### Description - -Cookies in Auth.js are chunked by default, meaning that once they reach the 4kb limit, we will create a new cookie with the `.{number}` suffix and reassemble the cookies in the correct order when parsing / reading them. This was introduced to avoid size constraints which can occur when users want to store additional data in their sessionToken, for example. - -You can override the default cookie names and options for any of the cookies used by Auth.js. - -This is an advanced option and using it is not recommended as you may break authentication or introduce security flaws into your application. - -You can specify one or more cookies with custom properties, but if you specify custom options for a cookie you must provide all the options for that cookie. - -If you use this feature, you will likely want to create conditional behaviour to support setting different cookies policies in development and production builds, as you will be opting out of the built-in dynamic policy. - -:::tip -An example of a use case for this option is to support sharing session tokens across subdomains. -::: - -#### Example - -```js -cookies: { - sessionToken: { - name: `__Secure-next-auth.session-token`, - options: { - httpOnly: true, - sameSite: 'lax', - path: '/', - secure: true - } - }, - callbackUrl: { - name: `__Secure-next-auth.callback-url`, - options: { - sameSite: 'lax', - path: '/', - secure: true - } - }, - csrfToken: { - name: `__Host-next-auth.csrf-token`, - options: { - httpOnly: true, - sameSite: 'lax', - path: '/', - secure: true - } - }, - pkceCodeVerifier: { - name: `${cookiePrefix}next-auth.pkce.code_verifier`, - options: { - httpOnly: true, - sameSite: 'lax', - path: '/', - secure: useSecureCookies, - maxAge: 900 - } - }, - state: { - name: `${cookiePrefix}next-auth.state`, - options: { - httpOnly: true, - sameSite: "lax", - path: "/", - secure: useSecureCookies, - maxAge: 900 - }, - }, -} -``` - -:::warning -Using a custom cookie policy may introduce security flaws into your application and is intended as an option for advanced users who understand the implications. Using this option is not recommended. -::: diff --git a/docs/docs/reference/02-configuration/04-env.md b/docs/docs/reference/02-configuration/04-env.md deleted file mode 100644 index 52d8273c..00000000 --- a/docs/docs/reference/02-configuration/04-env.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Environment variables -sidebar_label: Environment Variables ---- - -## NEXTAUTH_URL - -When deploying to production, set the `NEXTAUTH_URL` environment variable to the canonical URL of your site. - -``` -NEXTAUTH_URL=https://example.com -``` - -If your Next.js application uses a custom base path, specify the route to the API endpoint in full. - -_e.g. `NEXTAUTH_URL=https://example.com/custom-route/api/auth`_ - -:::note -Using [System Environment Variables](https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables) we automatically detect when you deploy to [Vercel](https://vercel.com) so you don't have to define this variable. Make sure **Automatically expose System Environment Variables** is checked in your Project Settings. -::: - ---- - -## NEXTAUTH_SECRET - -Used to encrypt the Auth.js JWT, and to hash [email verification tokens](/reference/adapters/models#verification-token). This is the default value for the [`secret`](/reference/configuration/auth-config#secret) option. The `secret` option might be removed in the future in favor of this. - -If you are using [Middleware](/reference/nextjs/#prerequisites) this environment variable must be set. - ---- - -## NEXTAUTH_URL_INTERNAL - -If provided, server-side calls will use this instead of `NEXTAUTH_URL`. Useful in environments when the server doesn't have access to the canonical URL of your site. Defaults to `NEXTAUTH_URL`. - -``` -NEXTAUTH_URL_INTERNAL=http://10.240.8.16 -``` diff --git a/docs/docs/reference/02-configuration/_category_.json b/docs/docs/reference/02-configuration/_category_.json deleted file mode 100644 index 48eb56ab..00000000 --- a/docs/docs/reference/02-configuration/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Configuration", - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/reference/04-providers/02-oauth-builtin.mdx b/docs/docs/reference/04-providers/02-oauth-builtin.mdx deleted file mode 100644 index b84d2201..00000000 --- a/docs/docs/reference/04-providers/02-oauth-builtin.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Available OAuth providers -sidebar_label: OAuth providers ---- - -Authentication Providers in **Auth.js** are services that can be used to sign a user in. - -Auth.js comes with a set of built-in providers. You can find them [here](https://github.com/nextauthjs/next-auth/tree/main/packages/core/src/providers). Each built-in provider has its own documentation page: - -:::note -Auth.js supports any **2.x** and **OpenID Connect (OIDC)** compliant providers and has built-in support for the most popular services. -::: - -
    - {Object.entries(require("../../../providers.json")) - .filter(([key]) => !["email", "credentials"].includes(key)) - .sort(([, a], [, b]) => a.localeCompare(b)) - .map(([key, name]) => ( -
  • - {name} -
  • - ))} -
diff --git a/docs/docs/reference/04-providers/02-oauth.mdx b/docs/docs/reference/04-providers/02-oauth.mdx deleted file mode 100644 index 009f0d84..00000000 --- a/docs/docs/reference/04-providers/02-oauth.mdx +++ /dev/null @@ -1,193 +0,0 @@ ---- -title: OAuth Provider Options -sidebar_label: OAuth options ---- - -## Provider Options - -Whenever you configure a custom or a built-in OAuth provider, you have the following options available: - -```ts -interface OAuthConfig { - /** - * OpenID Connect (OIDC) compliant providers can configure - * this instead of `authorize`/`token`/`userinfo` options - * without further configuration needed in most cases. - * You can still use the `authorize`/`token`/`userinfo` - * options for advanced control. - * - * [Authorization Server Metadata](https://datatracker.ietf.org/doc/html/rfc8414#section-3) - */ - wellKnown?: string - /** - * The login process will be initiated by sending the user to this URL. - * - * [Authorization endpoint](https://datatracker.ietf.org/doc/html/rfc6749#section-3.1) - */ - authorization: EndpointHandler - /** - * Endpoint that returns OAuth 2/OIDC tokens and information about them. - * This includes `access_token`, `id_token`, `refresh_token`, etc. - * - * [Token endpoint](https://datatracker.ietf.org/doc/html/rfc6749#section-3.2) - */ - token: EndpointHandler< - UrlParams, - { - /** - * Parameters extracted from the request to the `/api/auth/callback/:providerId` endpoint. - * Contains params like `state`. - */ - params: CallbackParamsType - /** - * When using this custom flow, make sure to do all the necessary security checks. - * This object contains parameters you have to match against the request to make sure it is valid. - */ - checks: OAuthChecks - }, - { tokens: TokenSet } - > - /** - * When using an OAuth 2 provider, the user information must be requested - * through an additional request from the userinfo endpoint. - * - * [Userinfo endpoint](https://www.oauth.com/oauth2-servers/signing-in-with-google/verifying-the-user-info) - */ - userinfo?: EndpointHandler - type: "oauth" - /** - * Used in URLs to refer to a certain provider. - * @example /api/auth/callback/twitter // where the `id` is "twitter" - */ - id: string - version: string - profile(profile: P, tokens: TokenSet): Awaitable - checks?: ChecksType | ChecksType[] - clientId: string - clientSecret: string - /** - * If set to `true`, the user information will be extracted - * from the `id_token` claims, instead of - * making a request to the `userinfo` endpoint. - * - * `id_token` is usually present in OpenID Connect (OIDC) compliant providers. - * - * [`id_token` explanation](https://www.oauth.com/oauth2-servers/openid-connect/id-tokens) - */ - idToken?: boolean - region?: string - issuer?: string - client?: Partial - allowDangerousEmailAccountLinking?: boolean - /** - * Object containing the settings for the styling of the providers sign-in buttons - */ - style: ProviderStyleType -} -``` - -### `authorization` option - -Configure how to construct the request to the [_Authorization endpoint_](https://datatracker.ietf.org/doc/html/rfc6749#section-3.1). - -There are two ways to use this option: - -1. You can either set `authorization` to be a full URL, like `"https://example.com/oauth/authorization?scope=email"`. -2. Use an object with `url` and `params` like so - ```js - authorization: { - url: "https://example.com/oauth/authorization", - params: { scope: "email" } - } - ``` - -:::tip -If your Provider is OpenID Connect (OIDC) compliant, we recommend using the `wellKnown` option instead. -::: - -### `token` option - -Configure how to construct the request to the [_Token endpoint_](https://datatracker.ietf.org/doc/html/rfc6749#section-3.2). - -There are three ways to use this option: - -1. You can either set `token` to be a full URL, like `"https://example.com/oauth/token?some=param"`. -2. Use an object with `url` and `params` like so - ```js - token: { - url: "https://example.com/oauth/token", - params: { some: "param" } - } - ``` -3. Completely take control of the request: - ```js - token: { - url: "https://example.com/oauth/token", - async request(context) { - // context contains useful properties to help you make the request. - const tokens = await makeTokenRequest(context) - return { tokens } - } - } - ``` - -:::warning -Option 3. should not be necessary in most cases, but if your provider does not follow the spec, or you have some very unique constraints it can be useful. Try to avoid it, if possible. -::: - -:::tip -If your Provider is OpenID Connect (OIDC) compliant, we recommend using the `wellKnown` option instead. -::: - -### `userinfo` option - -A `userinfo` endpoint returns information about the logged-in user. It is not part of the OAuth specification, but usually available for most providers. - -There are three ways to use this option: - -1. You can either set `userinfo` to be a full URL, like `"https://example.com/oauth/userinfo?some=param"`. -2. Use an object with `url` and `params` like so - ```js - userinfo: { - url: "https://example.com/oauth/userinfo", - params: { some: "param" } - } - ``` -3. Completely take control of the request: - ```js - userinfo: { - url: "https://example.com/oauth/userinfo", - // The result of this method will be the input to the `profile` callback. - async request(context) { - // context contains useful properties to help you make the request. - return await makeUserinfoRequest(context) - } - } - ``` - -:::warning -Option 3. should not be necessary in most cases, but if your provider does not follow the spec, or you have some very unique constraints it can be useful. Try to avoid it, if possible. -::: - -:::tip -In the rare case you don't care about what this endpoint returns, or your provider does not have one, you could create a noop function: - -```js -userinfo: { - request: () => {} -} -``` - -::: - -:::tip -If your Provider is OpenID Connect (OIDC) compliant, we recommend using the `wellKnown` option instead. OIDC usually returns an `id_token` from the `token` endpoint. `next-auth` can decode the `id_token` to get the user information, instead of making an additional request to the `userinfo` endpoint. Just set `idToken: true` at the top-level of your provider configuration. If not set, `next-auth` will still try to contact this endpoint. -::: - -### `client` option - -An advanced option, hopefully you won't need it in most cases. `next-auth` uses `openid-client` under the hood, see the docs on this option [here](https://github.com/panva/node-openid-client/blob/main/docs/README.md#new-clientmetadata-jwks-options). - -### `allowDangerousEmailAccountLinking` option - -Normally, when you sign in with an OAuth provider and another account with the same email address already exists, the accounts are not linked automatically. Automatic account linking on sign in is not secure between arbitrary providers and is disabled by default (see our [Security FAQ](https://authjs.dev/reference/faq#security)). However, it may be desirable to allow automatic account linking if you trust that the provider involved has securely verified the email address associated with the account. Just set `allowDangerousEmailAccountLinking: true` in your provider configuration to enable automatic account linking. diff --git a/docs/docs/reference/04-providers/04-email.md b/docs/docs/reference/04-providers/04-email.md deleted file mode 100644 index ec8279f7..00000000 --- a/docs/docs/reference/04-providers/04-email.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Email Provider options -sidebar_label: Email options ---- - -| Name | Description | Type | Required | -| :---------------------: | :---------------------------------------------------------------------------------: | :------------------------------: | :------: | -| id | Unique ID for the provider | `string` | Yes | -| name | Descriptive name for the provider | `string` | Yes | -| type | Type of provider, in this case `email` | `"email"` | Yes | -| server | Path or object pointing to the email server | `string` or `Object` | Yes | -| sendVerificationRequest | Callback to execute when a verification request is sent | `(params) => Promise` | Yes | -| from | The email address from which emails are sent, default: "" | `string` | No | -| maxAge | How long until the e-mail can be used to log the user in seconds. Defaults to 1 day | `number` | No | - -See our guides on magic links authentication for further tips on how to customize this provider: - -- [Tutorial](/getting-started/email-tutorial) -- [Guide deep-dive](/guides/providers/email) diff --git a/docs/docs/reference/04-providers/05-credentials.md b/docs/docs/reference/04-providers/05-credentials.md deleted file mode 100644 index a8b97ffa..00000000 --- a/docs/docs/reference/04-providers/05-credentials.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Credentials Provider options -sidebar_label: Credentials options ---- - -| Name | Description | Type | Required | -| :---------: | :-----------------------------------------------: | :-----------------------------------: | :------: | -| id | Unique ID for the provider | `string` | Yes | -| name | Descriptive name for the provider | `string` | Yes | -| type | Type of provider, in this case `credentials` | `"credentials"` | Yes | -| credentials | The credentials to sign-in with | `Object` | Yes | -| authorize | Callback to execute once user is to be authorized | `(credentials, req) => Promise` | Yes | - -See our guides on credentials authentication for further tips on how to customize this provider: - -- [Tutorial](/getting-started/credentials-tutorial) -- [Guide deep-dive](guides/providers/credentials) diff --git a/docs/docs/reference/04-providers/_category_.json b/docs/docs/reference/04-providers/_category_.json deleted file mode 100644 index 906e287d..00000000 --- a/docs/docs/reference/04-providers/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Providers", - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/reference/04-providers/index.md b/docs/docs/reference/04-providers/index.md deleted file mode 100644 index b221dd67..00000000 --- a/docs/docs/reference/04-providers/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Overview ---- - -There's four ways a user can be signed in: - -- [Using a built-in OAuth Provider](/reference/providers/oauth-builtin) (e.g Github, Twitter, Google, etc...) -- [Using a custom OAuth Provider](/guides/providers/custom-provider) -- [Using Email](/getting-started/email-tutorial) -- [Using Credentials](/getting-started/credentials-tutorial) - -In case you need further customization, see the options for each type of provider: - -- [Oauth options](/reference/providers/oauth) -- [Email options](/reference/providers/email) -- [Credentials options](/reference/providers/credentials) diff --git a/docs/docs/reference/05-oauth-providers/42.md b/docs/docs/reference/05-oauth-providers/42.md deleted file mode 100644 index e4a176ad..00000000 --- a/docs/docs/reference/05-oauth-providers/42.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: 42-school -title: 42 School ---- - -:::note -42 returns a field on `Account` called `created_at` which is a number. See the [docs](https://api.intra.42.fr/apidoc/guides/getting_started#make-basic-requests). Make sure to add this field to your database schema, in case if you are using an [Adapter](/reference/adapters/overview). -::: - -## Documentation - -https://api.intra.42.fr/apidoc/guides/web_application_flow - -## Configuration - -https://profile.intra.42.fr/oauth/applications/new - -## Options - -The **42 School Provider** comes with a set of default options: - -- [42 School Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/42-school.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import FortyTwoProvider from "next-auth/providers/42-school"; -... -providers: [ - FortyTwoProvider({ - clientId: process.env.FORTY_TWO_CLIENT_ID, - clientSecret: process.env.FORTY_TWO_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/_category_.json b/docs/docs/reference/05-oauth-providers/_category_.json deleted file mode 100644 index 83b2df8c..00000000 --- a/docs/docs/reference/05-oauth-providers/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "OAuth Providers", - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/reference/05-oauth-providers/apple.md b/docs/docs/reference/05-oauth-providers/apple.md deleted file mode 100644 index a3611e6a..00000000 --- a/docs/docs/reference/05-oauth-providers/apple.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -id: apple -title: Apple ---- - -## Documentation - -https://developer.apple.com/sign-in-with-apple/get-started/ - -## Configuration - -https://developer.apple.com/account/resources/identifiers/list/serviceId - -## Options - -The **Apple Provider** comes with a set of default options: - -- [Apple Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/apple.ts) - -You can override any of the options to suit your own use case. - -### Generating a secret - -Apple requires the client secret to be a JWT. To generate one, you can use the following script: https://bal.so/apple-gen-secret. - -For more information, see the [Apple docs](https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens#3262048) - -Then, you can paste the result into your `.env.local` file under `APPLE_SECRET`, so you can refer to it from your code: - -```js -import AppleProvider from "next-auth/providers/apple"; -... -providers: [ - AppleProvider({ - clientId: process.env.APPLE_ID, - clientSecret: process.env.APPLE_SECRET - }) -] -... -``` - -:::tip -The TeamID is located on the top right after logging in. -::: - -:::tip -The KeyID is located after you create the key. Look for it before you download the k8 file. -::: - -## Testing on a development server - -:::tip -Apple requires all sites to run HTTPS (including local development instances). -::: - -:::tip -Apple doesn't allow you to use localhost in domains or subdomains. -::: - -### Host name resolution - -Edit your host file and point your site to `127.0.0.1`. - -_Linux/macOS_ - -``` -sudo echo '127.0.0.1 dev.example.com' >> /etc/hosts -``` - -_Windows_ (run PowerShell as administrator) - -```ps -Add-Content -Path C:\Windows\System32\drivers\etc\hosts -Value "127.0.0.1 dev.example.com" -Force -``` - -More info: [How to edit my host file?](https://phoenixnap.com/kb/how-to-edit-hosts-file-in-windows-mac-or-linux) - -### Create certificate - -Create a directory `certificates` and add the certificate files `localhost.key` and `localhost.crt`, which you generate using OpenSSL: - -_Linux/macOS_ - -```bash -openssl req -x509 -out localhost.crt -keyout localhost.key \ - -newkey rsa:2048 -nodes -sha256 \ - -subj "/CN=localhost" -extensions EXT -config <( \ - printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth") -``` - -_Windows_ - -The OpenSSL executable is distributed with [Git](https://git-scm.com/download/win) for Windows. Once installed you will find the openssl.exe file in `C:\Program Files\Git\mingw64\bin`, which you can add to the system PATH environment variable if it’s not already done. - -Add environment variable `OPENSSL_CONF=C:\Program Files\Git\mingw64\ssl\openssl.cnf` - -```cmd - req -x509 -out localhost.crt -keyout localhost.key \ - -newkey rsa:2048 -nodes -sha256 \ - -subj "/CN=localhost" -``` - -### Deploy to server - -You can create a `server.js` in the root of your project and run it with `node server.js` to test Sign in with Apple integration locally: - -```js -const { createServer } = require("https") -const { parse } = require("url") -const next = require("next") -const fs = require("fs") - -const dev = process.env.NODE_ENV !== "production" -const app = next({ dev }) -const handle = app.getRequestHandler() - -const httpsOptions = { - key: fs.readFileSync("./certificates/localhost.key"), - cert: fs.readFileSync("./certificates/localhost.crt"), -} - -app.prepare().then(() => { - createServer(httpsOptions, (req, res) => { - const parsedUrl = parse(req.url, true) - handle(req, res, parsedUrl) - }).listen(3000, (err) => { - if (err) throw err - console.log("> Ready on https://localhost:3000") - }) -}) -``` - -### Helpful guides - -- [How to setup localhost with HTTPS with a Next.js app](https://medium.com/@anMagpie/secure-your-local-development-server-with-https-next-js-81ac6b8b3d68) - -- [Guide to configuring Sign in with Apple](https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple) diff --git a/docs/docs/reference/05-oauth-providers/atlassian.md b/docs/docs/reference/05-oauth-providers/atlassian.md deleted file mode 100644 index 759a33bf..00000000 --- a/docs/docs/reference/05-oauth-providers/atlassian.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -id: atlassian -title: Atlassian ---- - -## Documentation - -https://developer.atlassian.com/cloud/jira/platform/oauth-2-authorization-code-grants-3lo-for-apps/#implementing-oauth-2-0--3lo- - -## Options - -The **Atlassian Provider** comes with a set of default options: - -- [Atlassian Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/atlassian.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import AtlassianProvider from "next-auth/providers/atlassian"; -... -providers: [ - AtlassianProvider({ - clientId: process.env.ATLASSIAN_CLIENT_ID, - clientSecret: process.env.ATLASSIAN_CLIENT_SECRET, - authorization: { - params: { - scope: "write:jira-work read:jira-work read:jira-user offline_access read:me" - } - } - }) -] -... -``` - -## Instructions - -### Configuration - -:::tip -An app can be created at https://developer.atlassian.com/apps/ -::: - -Under "Apis and features" in the side menu, configure the following for "OAuth 2.0 (3LO)": - -- Redirect URL - - http://localhost:3000/api/auth/callback/atlassian - -:::warning -To enable access to Jira Platform REST API you must enable User Identity API and add `read:me` to your provider scope option. -::: diff --git a/docs/docs/reference/05-oauth-providers/auth0.md b/docs/docs/reference/05-oauth-providers/auth0.md deleted file mode 100644 index d3e5fc5a..00000000 --- a/docs/docs/reference/05-oauth-providers/auth0.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: auth0 -title: Auth0 ---- - -## Documentation - -https://auth0.com/docs/api/authentication#authorize-application - -## Configuration - -https://manage.auth0.com/dashboard - -## Options - -The **Auth0 Provider** comes with a set of default options: - -- [Auth0 Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/auth0.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import Auth0Provider from "next-auth/providers/auth0"; -... -providers: [ - Auth0Provider({ - clientId: process.env.AUTH0_CLIENT_ID, - clientSecret: process.env.AUTH0_CLIENT_SECRET, - issuer: process.env.AUTH0_ISSUER - }) -] -... -``` - -:::note -`issuer` should be the fully qualified URL – e.g. `https://dev-s6clz2lv.eu.auth0.com` -::: diff --git a/docs/docs/reference/05-oauth-providers/authentik.md b/docs/docs/reference/05-oauth-providers/authentik.md deleted file mode 100644 index c1887318..00000000 --- a/docs/docs/reference/05-oauth-providers/authentik.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: authentik -title: Authentik ---- - -## Documentation - -https://goauthentik.io/docs/providers/oauth2 - -## Options - -The **Authentik Provider** comes with a set of default options: - -- [Authentik Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/authentik.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import AuthentikProvider from "next-auth/providers/authentik"; -... -providers: [ - AuthentikProvider({ - clientId: process.env.AUTHENTIK_ID, - clientSecret: process.env.AUTHENTIK_SECRET, - issuer: process.env.AUTHENTIK_ISSUER, - }) -] -... -``` - -:::note -`issuer` should include the slug without a trailing slash – e.g., `https://my-authentik-domain.com/application/o/My_Slug` -::: diff --git a/docs/docs/reference/05-oauth-providers/azure-ad-b2c.md b/docs/docs/reference/05-oauth-providers/azure-ad-b2c.md deleted file mode 100644 index da703643..00000000 --- a/docs/docs/reference/05-oauth-providers/azure-ad-b2c.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -id: azure-ad-b2c -title: Azure Active Directory B2C ---- - -:::note -Azure AD B2C returns the following fields on `Account`: - -- `refresh_token_expires_in` (number) -- `not_before` (number) -- `id_token_expires_in` (number) -- `profile_info` (string). - -See their [docs](https://docs.microsoft.com/en-us/azure/active-directory-b2c/access-tokens). Remember to add these fields to your database schema, in case if you are using an [Adapter](/reference/adapters/overview). -::: - -## Documentation - -https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-auth-code-flow - -## Configuration - -https://docs.microsoft.com/azure/active-directory-b2c/tutorial-create-tenant - -## Options - -The **Azure Active Directory Provider** comes with a set of default options: - -- [Azure Active Directory Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/azure-ad-b2c.ts) - -You can override any of the options to suit your own use case. - -## Configuration (Basic) - -Basic configuration sets up Azure AD B2C to return an ID Token. This should be done as a prerequisite prior to running through the Advanced configuration. - -Step 1: Azure AD B2C Tenant -https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-tenant - -Step 2: App Registration -https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-register-applications - -Step 3: User Flow -https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows - -Note: For the step "User attributes and token claims" you might minimally: - -- Collect attribute: - - Email Address - - Display Name - - Given Name - - Surname -- Return claim: - - Email Addresses - - Display Name - - Given Name - - Surname - - Identity Provider - - Identity Provider Access Token - - User's Object ID - -## Example - -In `.env.local` create the following entries: - -``` -AZURE_AD_B2C_TENANT_NAME= -AZURE_AD_B2C_CLIENT_ID= -AZURE_AD_B2C_CLIENT_SECRET= -AZURE_AD_B2C_PRIMARY_USER_FLOW= -``` - -In `pages/api/auth/[...nextauth].js` find or add the AZURE_AD_B2C entries: - -```js -import AzureADB2CProvider from "next-auth/providers/azure-ad-b2c"; -... -providers: [ - AzureADB2CProvider({ - tenantId: process.env.AZURE_AD_B2C_TENANT_NAME, - clientId: process.env.AZURE_AD_B2C_CLIENT_ID, - clientSecret: process.env.AZURE_AD_B2C_CLIENT_SECRET, - primaryUserFlow: process.env.AZURE_AD_B2C_PRIMARY_USER_FLOW, - authorization: { params: { scope: "offline_access openid" } }, - }), -] -... -``` - -## Configuration (Advanced) - -Advanced configuration sets up Azure AD B2C to return an Authorization Token. This builds on the steps completed in the Basic configuration above. - -Step 4: Add a Web API application -https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-single-page-app-webapi?tabs=app-reg-ga - -Note: this is a second app registration (similar to Step 2) but with different setup and configuration. - -## Example - -Nothing in `.env.local` needs to change here. The only update is in `pages/api/auth/[...nextauth].js` where you will need to add the additional scopes that were created in Step 4 above: - -```js -import AzureADB2CProvider from "next-auth/providers/azure-ad-b2c"; -... -providers: [ - AzureADB2CProvider({ - tenantId: process.env.AZURE_AD_B2C_TENANT_NAME, - clientId: process.env.AZURE_AD_B2C_CLIENT_ID, - clientSecret: process.env.AZURE_AD_B2C_CLIENT_SECRET, - primaryUserFlow: process.env.AZURE_AD_B2C_PRIMARY_USER_FLOW, - authorization: { params: { scope: `https://${process.env.AZURE_AD_B2C_TENANT_NAME}.onmicrosoft.com/api/demo.read https://${process.env.AZURE_AD_B2C_TENANT_NAME}.onmicrosoft.com/api/demo.write offline_access openid` } }, - }), -] -... - -``` diff --git a/docs/docs/reference/05-oauth-providers/azure-ad.md b/docs/docs/reference/05-oauth-providers/azure-ad.md deleted file mode 100644 index 82610041..00000000 --- a/docs/docs/reference/05-oauth-providers/azure-ad.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -id: azure-ad -title: Azure Active Directory ---- - -## Documentation - -https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow - -## Configuration - -https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app - -## Example - -### To allow specific Active Directory users access: - -- In https://portal.azure.com/ search for "Azure Active Directory", and select your organization. -- Next, go to "App Registration" in the left menu, and create a new one. -- Pay close attention to "Who can use this application or access this API?" - - This allows you to scope access to specific types of user accounts - - Only your tenant, all azure tenants, or all azure tenants and public Microsoft accounts (Skype, Xbox, Outlook.com, etc.) -- When asked for a redirection URL, use `https://yourapplication.com/api/auth/callback/azure-ad` or for development `http://localhost:3000/api/auth/callback/azure-ad`. -- After your App Registration is created, under "Client Credential" create your Client secret. -- Now copy your: - - Application (client) ID - - Directory (tenant) ID - - Client secret (value) - -In `.env.local` create the following entries: - -``` -AZURE_AD_CLIENT_ID= -AZURE_AD_CLIENT_SECRET= -AZURE_AD_TENANT_ID= -``` - -That will default the tenant to use the `common` authorization endpoint. [For more details see here](https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols#endpoints). - -:::note -Azure AD returns the profile picture in an ArrayBuffer, instead of just a URL to the image, so our provider converts it to a base64 encoded image string and returns that instead. See: https://docs.microsoft.com/en-us/graph/api/profilephoto-get?view=graph-rest-1.0#examples. The default image size is 48x48 to avoid [running out of space](https://authjs.dev/concepts/faq#:~:text=What%20are%20the%20disadvantages%20of%20JSON%20Web%20Tokens%3F) in case the session is saved as a JWT. -::: - -In `pages/api/auth/[...nextauth].js` find or add the `AzureAD` entries: - -```js -import AzureADProvider from "next-auth/providers/azure-ad"; - -... -providers: [ - AzureADProvider({ - clientId: process.env.AZURE_AD_CLIENT_ID, - clientSecret: process.env.AZURE_AD_CLIENT_SECRET, - tenantId: process.env.AZURE_AD_TENANT_ID, - }), -] -... - -``` diff --git a/docs/docs/reference/05-oauth-providers/battlenet.md b/docs/docs/reference/05-oauth-providers/battlenet.md deleted file mode 100644 index 69af1b00..00000000 --- a/docs/docs/reference/05-oauth-providers/battlenet.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -id: battle.net -title: Battle.net ---- - -## Documentation - -https://develop.battle.net/documentation/guides/using-oauth - -## Configuration - -https://develop.battle.net/access/clients - -## Options - -The **Battle.net Provider** comes with a set of default options: - -- [Battle.net Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/battlenet.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import BattleNetProvider from "next-auth/providers/battlenet"; -... -providers: [ - BattleNetProvider({ - clientId: process.env.BATTLENET_CLIENT_ID, - clientSecret: process.env.BATTLENET_CLIENT_SECRET, - issuer: process.env.BATTLENET_ISSUER - }) -] -... -``` - -`issuer` must be one of these values, based on the [available regions](https://develop.battle.net/documentation/guides/regionality-and-apis): - -```ts -type BattleNetIssuer = - | "https://www.battlenet.com.cn/oauth" - | "https://us.battle.net/oauth" - | "https://eu.battle.net/oauth" - | "https://kr.battle.net/oauth" - | "https://tw.battle.net/oauth" -``` diff --git a/docs/docs/reference/05-oauth-providers/box.md b/docs/docs/reference/05-oauth-providers/box.md deleted file mode 100644 index c7ce0c9e..00000000 --- a/docs/docs/reference/05-oauth-providers/box.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: box -title: Box ---- - -## Documentation - -https://developer.box.com/reference/ - -## Configuration - -https://developer.box.com/guides/sso-identities-and-app-users/connect-okta-to-app-users/configure-box/ - -## Options - -The **Box Provider** comes with a set of default options: - -- [Box Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/box.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import BoxProvider from "next-auth/providers/box"; -... -providers: [ - BoxProvider({ - clientId: process.env.BOX_CLIENT_ID, - clientSecret: process.env.BOX_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/boxyhq-saml.md b/docs/docs/reference/05-oauth-providers/boxyhq-saml.md deleted file mode 100644 index a2e67570..00000000 --- a/docs/docs/reference/05-oauth-providers/boxyhq-saml.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -id: boxyhq-saml -title: BoxyHQ SAML ---- - -## Documentation - -BoxyHQ SAML is an open source service that handles the SAML login flow as an OAuth 2.0 flow, abstracting away all the complexities of the SAML protocol. - -You can deploy BoxyHQ SAML as a separate service or embed it into your app using our NPM library. [Check out the documentation for more details](https://boxyhq.com/docs/jackson/deploy) - -## Configuration - -SAML login requires a configuration for every tenant of yours. One common method is to use the domain for an email address to figure out which tenant they belong to. You can also use a unique tenant ID (string) from your backend for this, typically some kind of account or organization ID. - -Check out the [documentation](https://boxyhq.com/docs/jackson/saml-flow#2-saml-config-api) for more details. - -## Options - -The **BoxyHQ SAML Provider** comes with a set of default options: - -- [BoxyHQ Provider options](https://github.com/nextauthjs/next-auth/tree/main/packages/next-auth/src/providers/boxyhq-saml.ts) - -You can override any of the options to suit your own use case. - -## Example - -```ts -import BoxyHQSAMLProvider from "next-auth/providers/boxyhq-saml" -... -providers: [ - BoxyHQSAMLProvider({ - issuer: "http://localhost:5225", - clientId: "dummy", // The dummy here is necessary since we'll pass tenant and product custom attributes in the client code - clientSecret: "dummy", // The dummy here is necessary since we'll pass tenant and product custom attributes in the client code - }) -} -... -``` - -On the client side you'll need to pass additional parameters `tenant` and `product` to the `signIn` function. This will allow BoxyHQL SAML to figure out the right SAML configuration and take your user to the right SAML Identity Provider to sign them in. - -```tsx -import { signIn } from "next-auth/react"; -... - - // Map your users's email to a tenant and product - const tenant = email.split("@")[1]; - const product = 'my_awesome_product'; -... - -... -``` - -:::warning -Email address is not returned by the Instagram API. -::: - -:::tip -Instagram display app required callback URL to be configured in your Facebook app and Facebook required you to use **https** even for localhost! In order to do that, you either need to [add an SSL to your localhost](https://www.freecodecamp.org/news/how-to-get-https-working-on-your-local-development-environment-in-5-minutes-7af615770eec/) or use a proxy such as [ngrok](https://ngrok.com/docs). -::: diff --git a/docs/docs/reference/05-oauth-providers/kakao.md b/docs/docs/reference/05-oauth-providers/kakao.md deleted file mode 100644 index c309058c..00000000 --- a/docs/docs/reference/05-oauth-providers/kakao.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -id: kakao -title: Kakao ---- - -## Documentation - -https://developers.kakao.com/product/kakaoLogin - -## Configuration - -https://developers.kakao.com/docs/latest/en/kakaologin/common - -## Options - -The **Kakao Provider** comes with a set of default options: - -- [Kakao Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/kakao.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import KakaoProvider from "next-auth/providers/kakao"; -... -providers: [ - KakaoProvider({ - clientId: process.env.KAKAO_CLIENT_ID, - clientSecret: process.env.KAKAO_CLIENT_SECRET - }) -] -... -``` - -## Instructions - -### Configuration - -Create a provider and a Kakao application at `https://developers.kakao.com/console/app`. In the settings of the app under Kakao Login, activate web app, change consent items and configure callback URL. diff --git a/docs/docs/reference/05-oauth-providers/keycloak.md b/docs/docs/reference/05-oauth-providers/keycloak.md deleted file mode 100644 index 881fbbff..00000000 --- a/docs/docs/reference/05-oauth-providers/keycloak.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: keycloak -title: Keycloak ---- - -## Documentation - -https://www.keycloak.org/docs/latest/server_admin/#_oidc_clients - -## Configuration - -:::tip -Create an openid-connect client in Keycloak with "confidential" as the "Access Type". -::: - -## Options - -The **Keycloak Provider** comes with a set of default options: - -- [Keycloak Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/keycloak.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import KeycloakProvider from "next-auth/providers/keycloak"; -... -providers: [ - KeycloakProvider({ - clientId: process.env.KEYCLOAK_ID, - clientSecret: process.env.KEYCLOAK_SECRET, - issuer: process.env.KEYCLOAK_ISSUER, - }) -] -... -``` - -:::note -`issuer` should include the realm – e.g. `https://my-keycloak-domain.com/realms/My_Realm` -::: diff --git a/docs/docs/reference/05-oauth-providers/line.md b/docs/docs/reference/05-oauth-providers/line.md deleted file mode 100644 index 41fb10fc..00000000 --- a/docs/docs/reference/05-oauth-providers/line.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: line -title: LINE ---- - -## Documentation - -https://developers.line.biz/en/docs/line-login/integrate-line-login/ - -## Configuration - -https://developers.line.biz/console/ - -## Options - -The **Line Provider** comes with a set of default options: - -- [Line Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/line.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import LineProvider from "next-auth/providers/line"; -... -providers: [ - LineProvider({ - clientId: process.env.LINE_CLIENT_ID, - clientSecret: process.env.LINE_CLIENT_SECRET - }) -] -... -``` - -## Instructions - -### Configuration - -Create a provider and a LINE login channel at `https://developers.line.biz/console/`. In the settings of the channel under LINE Login, activate web app and configure the following: - -- Callback URL - - http://localhost:3000/api/auth/callback/line - -:::tip -To retrieve email address, you need to apply for Email address permission. Open [Line Developer Console](https://developers.line.biz/console/), go to your Login Channel. Scroll down bottom to find **OpenID Connect** -> **Email address permission**. Click **Apply** and follow the instruction. -::: diff --git a/docs/docs/reference/05-oauth-providers/linkedin.md b/docs/docs/reference/05-oauth-providers/linkedin.md deleted file mode 100644 index 2efe3b81..00000000 --- a/docs/docs/reference/05-oauth-providers/linkedin.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: linkedin -title: LinkedIn ---- - -## Documentation - -https://docs.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow - -## Configuration - -https://www.linkedin.com/developers/apps/ - -From the Auth tab get the client ID and client secret. On the same tab, add redirect URLs such as http://localhost:3000/api/auth/callback/linkedin so LinkedIn can correctly redirect back to your application. Finally, head over to the Products tab and enable the "Sign In with LinkedIn" product. The LinkedIn team will review and approve your request before you can test it out. - -![image](https://user-images.githubusercontent.com/330396/114429603-68195600-9b72-11eb-8311-62e58383c42b.png) - -## Options - -The **LinkedIn Provider** comes with a set of default options: - -- [LinkedIn Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/linkedin.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import LinkedInProvider from "next-auth/providers/linkedin"; -... -providers: [ - LinkedInProvider({ - clientId: process.env.LINKEDIN_CLIENT_ID, - clientSecret: process.env.LINKEDIN_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/mailchimp.md b/docs/docs/reference/05-oauth-providers/mailchimp.md deleted file mode 100644 index 833279ff..00000000 --- a/docs/docs/reference/05-oauth-providers/mailchimp.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: mailchimp -title: Mailchimp ---- - -## Documentation - -https://mailchimp.com/developer/marketing/guides/access-user-data-oauth-2/ - -## Configuration - -https://admin.mailchimp.com/account/oauth2/client/ - -## Options - -The **Mailchimp Provider** comes with a set of default options: - -- [Mailchimp Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/mailchimp.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import MailchimpProvider from "next-auth/providers/mailchimp"; -... -providers: [ - MailchimpProvider({ - clientId: process.env.MAILCHIMP_CLIENT_ID, - clientSecret: process.env.MAILCHIMP_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/mailru.md b/docs/docs/reference/05-oauth-providers/mailru.md deleted file mode 100644 index 306b91b5..00000000 --- a/docs/docs/reference/05-oauth-providers/mailru.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: mailru -title: Mail.ru ---- - -## Documentation - -https://o2.mail.ru/docs - -## Configuration - -https://o2.mail.ru/app/ - -## Options - -The **Mail.ru Provider** comes with a set of default options: - -- [Mail.ru Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/mailru.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import MailRuProvider from "next-auth/providers/mailru"; -... -providers: [ - MailRuProvider({ - clientId: process.env.MAILRU_CLIENT_ID, - clientSecret: process.env.MAILRU_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/mattermost.md b/docs/docs/reference/05-oauth-providers/mattermost.md deleted file mode 100644 index b10d6c86..00000000 --- a/docs/docs/reference/05-oauth-providers/mattermost.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -id: mattermost -title: Mattermost ---- - -## Documentation - -https://developers.mattermost.com/integrate/apps/authentication/oauth2 - -## Configuration - -http://my-cool-server.cloud.mattermost.com/mycoolteam/integrations/oauth2-apps - -## Options - -The **Mattermost provider** comes with a set of default options: - -- [Mattermost Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/mattermost.ts) - -You can override any of the options to suit your own use case. - -## Example - -```ts -import Mattermost from "@auth/core/providers/mattermost"; -... -providers: [ - Mattermost({ - // The base url of your Mattermost instance. e.g https://my-cool-server.cloud.mattermost.com - clientId: env.MATTERMOST_ID, - clientSecret: env.MATTERMOST_SECRET, - issuer: env.MATTERMOST_ISSUER, - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/medium.md b/docs/docs/reference/05-oauth-providers/medium.md deleted file mode 100644 index 6d2b7a4e..00000000 --- a/docs/docs/reference/05-oauth-providers/medium.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: medium -title: Medium ---- - -## Documentation - -https://github.com/Medium/medium-api-docs - -## Configuration - -https://medium.com/me/applications - -## Options - -The **Medium Provider** comes with a set of default options: - -- [Medium Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/medium.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import MediumProvider from "next-auth/providers/medium"; -... -providers: [ - MediumProvider({ - clientId: process.env.MEDIUM_CLIENT_ID, - clientSecret: process.env.MEDIUM_CLIENT_SECRET - }) -} -... -``` - -:::warning -Email address is not returned by the Medium API. -::: diff --git a/docs/docs/reference/05-oauth-providers/naver.md b/docs/docs/reference/05-oauth-providers/naver.md deleted file mode 100644 index 8e9e39eb..00000000 --- a/docs/docs/reference/05-oauth-providers/naver.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: naver -title: Naver ---- - -## Documentation - -https://developers.naver.com/docs/login/overview/overview.md - -## Configuration - -https://developers.naver.com/docs/login/api/api.md - -## Options - -The **Naver Provider** comes with a set of default options: - -- [Naver Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/naver.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import NaverProvider from "next-auth/providers/naver"; -... -providers: [ - NaverProvider({ - clientId: process.env.NAVER_CLIENT_ID, - clientSecret: process.env.NAVER_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/netlify.md b/docs/docs/reference/05-oauth-providers/netlify.md deleted file mode 100644 index eb55b639..00000000 --- a/docs/docs/reference/05-oauth-providers/netlify.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: netlify -title: Netlify ---- - -## Documentation - -https://www.netlify.com/blog/2016/10/10/integrating-with-netlify-oauth2/ - -## Configuration - -https://github.com/netlify/netlify-oauth-example - -## Options - -The **Netlify Provider** comes with a set of default options: - -- [Netlify Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/netlify.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import NetlifyProvider from "next-auth/providers/netlify"; -... -providers: [ - NetlifyProvider({ - clientId: process.env.NETLIFY_CLIENT_ID, - clientSecret: process.env.NETLIFY_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/okta.md b/docs/docs/reference/05-oauth-providers/okta.md deleted file mode 100644 index 4f7bec98..00000000 --- a/docs/docs/reference/05-oauth-providers/okta.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: okta -title: Okta ---- - -## Documentation - -https://developer.okta.com/docs/reference/api/oidc - -## Options - -The **Okta Provider** comes with a set of default options: - -- [Okta Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/okta.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import OktaProvider from "next-auth/providers/okta"; -... -providers: [ - OktaProvider({ - clientId: process.env.OKTA_CLIENT_ID, - clientSecret: process.env.OKTA_CLIENT_SECRET, - issuer: process.env.OKTA_ISSUER - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/onelogin.md b/docs/docs/reference/05-oauth-providers/onelogin.md deleted file mode 100644 index 236e6266..00000000 --- a/docs/docs/reference/05-oauth-providers/onelogin.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: onelogin -title: OneLogin ---- - -## Documentation - -https://developers.onelogin.com/openid-connect - -## Configuration - -https://developers.onelogin.com/openid-connect/connect-to-onelogin - -## Options - -The **OneLogin Provider** comes with a set of default options: - -- [OneLogin Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/onelogin.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import OneLoginProvider from "next-auth/providers/onelogin"; -... -providers: [ - OneLoginProvider({ - clientId: process.env.ONELOGIN_CLIENT_ID, - clientSecret: process.env.ONELOGIN_CLIENT_SECRET, - issuer: process.env.ONELOGIN_ISSUER - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/osso.md b/docs/docs/reference/05-oauth-providers/osso.md deleted file mode 100644 index aaa4713e..00000000 --- a/docs/docs/reference/05-oauth-providers/osso.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: osso -title: Osso ---- - -## Documentation - -Osso is an open source service that handles SAML authentication against Identity Providers, normalizes profiles, and makes those profiles available to you in an OAuth 2.0 code grant flow. - -If you don't yet have an Osso instance, you can use [Osso's Demo App](https://demo.ossoapp.com) for your testing purposes. For documentation on deploying an Osso instance, see https://ossoapp.com/docs/deploy/overview/ - -## Configuration - -You can configure your OAuth Clients on your Osso Admin UI, i.e. https://demo.ossoapp.com/admin/config - you'll need to get a Client ID and Secret and allow-list your redirect URIs. - -[SAML SSO differs a bit from OAuth](https://ossoapp.com/blog/saml-vs-oauth) - for every tenant who wants to sign in to your application using SAML, you and your customer need to perform a multi-step configuration in Osso's Admin UI and the admin dashboard of the tenant's Identity Provider. Osso provides documentation for providers like Okta and OneLogin, cloud-based IDPs who also offer a developer account that's useful for testing. Osso also provides a [Mock IDP](https://idp.ossoapp.com) that you can use for testing without needing to sign up for an Identity Provider service. - -See Osso's complete configuration and testing documentation at https://ossoapp.com/docs/configure/overview - -## Options - -The **Osso Provider** comes with a set of default options: - -- [Osso Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/osso.js) - -You can override any of the options to suit your own use case. - -## Example - -A full example application is available at https://github.com/enterprise-oss/osso-next-auth-example and https://nextjs-demo.ossoapp.com - -```js -import OssoProvider from "next-auth/providers/osso"; -... -providers: [ - OssoProvider({ - clientId: process.env.OSSO_CLIENT_ID, - clientSecret: process.env.OSSO_CLIENT_SECRET, - issuer: process.env.OSSO_ISSUER - }) -} -... -``` - -:::note -`issuer` should be the fully qualified domain – e.g. `demo.ossoapp.com` -::: diff --git a/docs/docs/reference/05-oauth-providers/osu.md b/docs/docs/reference/05-oauth-providers/osu.md deleted file mode 100644 index 97b71ecf..00000000 --- a/docs/docs/reference/05-oauth-providers/osu.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: osu -title: Osu! ---- - -## Documentation - -https://osu.ppy.sh/docs/index.html#authentication - -## Configuration - -https://osu.ppy.sh/home/account/edit#new-oauth-application - -## Options - -The **Osu Provider** comes with a set of default options: - -- [Osu Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/osu.ts) - -You can override any of the options to suit your own use case. - -:::note -Osu! does **not** provide a user email! -::: - -## Example - -```js -import OsuProvider from "next-auth/providers/osu"; -... -providers: [ - OsuProvider({ - clientId: process.env.OSU_CLIENT_ID, - clientSecret: process.env.OSU_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/patreon.md b/docs/docs/reference/05-oauth-providers/patreon.md deleted file mode 100644 index b36758ee..00000000 --- a/docs/docs/reference/05-oauth-providers/patreon.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -id: patreon -title: Patreon ---- - -## Documentation - -https://docs.patreon.com/#apiv2-oauth - -## Configuration - -:::tip -Create a API v2 client on [Patreon Platform](https://www.patreon.com/portal/registration/register-clients) -::: - -## Options - -The **Patreon Provider** comes with a set of default options: - -- [Patreon Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/patreon.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import PatreonProvider from "next-auth/providers/patreon"; -... -providers: [ - PatreonProvider({ - clientId: process.env.PATREON_ID, - clientSecret: process.env.PATREON_SECRET, - }) -] -... -``` - -:::note -Make sure you use the scopes defined in [ApiV2](https://docs.patreon.com/#scopes) -::: diff --git a/docs/docs/reference/05-oauth-providers/pipedrive.md b/docs/docs/reference/05-oauth-providers/pipedrive.md deleted file mode 100644 index 74cda409..00000000 --- a/docs/docs/reference/05-oauth-providers/pipedrive.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: pipedrive -title: Pipedrive ---- - -## Documentation - -https://pipedrive.readme.io/docs/marketplace-oauth-authorization - -## Options - -The **Pipedrive Provider** comes with a set of default options: - -- [Pipedrive Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/pipedrive.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import PipedriveProvider from "next-auth/providers/pipedrive"; -... -providers: [ - PipedriveProvider({ - clientId: process.env.PIPEDRIVE_CLIENT_ID, - clientSecret: process.env.PIPEDRIVE_CLIENT_SECRET, - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/reddit.md b/docs/docs/reference/05-oauth-providers/reddit.md deleted file mode 100644 index a203e113..00000000 --- a/docs/docs/reference/05-oauth-providers/reddit.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -id: reddit -title: Reddit ---- - -## Documentation - -https://www.reddit.com/dev/api/ - -## Configuration - -https://www.reddit.com/prefs/apps/ - -## Options - -The **Reddit Provider** comes with a set of default options: - -- [Reddit Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/reddit.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import RedditProvider from "next-auth/providers/reddit"; -... -providers: [ - RedditProvider({ - clientId: process.env.REDDIT_CLIENT_ID, - clientSecret: process.env.REDDIT_CLIENT_SECRET - }) -] -... -``` - -:::warning -Reddit requires authorization every time you go through their page. -::: - -:::warning -Only allows one callback URL per Client ID / Client Secret. -::: - -:::tip -This Provider template only has a one hour access token to it and only has the "identity" scope. If you want to get a refresh token as well you must follow this: - -```js -providers: [ - { - id: "reddit", - name: "Reddit", - clientId: process.env.REDDIT_CLIENT_ID, - clientSecret: process.env.REDDIT_CLIENT_SECRET, - scope: "identity mysubreddits read", //Check Reddit API Documentation for more. The identity scope is required. - type: "oauth", - version: "2.0", - params: { grant_type: "authorization_code" }, - accessTokenUrl: " https://www.reddit.com/api/v1/access_token", - authorizationUrl: - "https://www.reddit.com/api/v1/authorize?response_type=code&duration=permanent", - profileUrl: "https://oauth.reddit.com/api/v1/me", - profile: (profile) => { - return { - id: profile.id, - name: profile.name, - email: null, - } - }, - }, -] -``` - -::: diff --git a/docs/docs/reference/05-oauth-providers/salesforce.md b/docs/docs/reference/05-oauth-providers/salesforce.md deleted file mode 100644 index d6507571..00000000 --- a/docs/docs/reference/05-oauth-providers/salesforce.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: salesforce -title: Salesforce ---- - -## Documentation - -https://help.salesforce.com/articleView?id=remoteaccess_authenticate.htm&type=5 - -## Options - -The **Salesforce Provider** comes with a set of default options: - -- [Salesforce Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/salesforce.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import SalesforceProvider from "next-auth/providers/salesforce"; -... -providers: [ - SalesforceProvider({ - clientId: process.env.SALESFORCE_CLIENT_ID, - clientSecret: process.env.SALESFORCE_CLIENT_SECRET, - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/slack.md b/docs/docs/reference/05-oauth-providers/slack.md deleted file mode 100644 index 41cd6317..00000000 --- a/docs/docs/reference/05-oauth-providers/slack.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: slack -title: Slack ---- - -## Documentation - -https://api.slack.com/authentication -https://api.slack.com/docs/sign-in-with-slack - -## Configuration - -https://api.slack.com/apps - -:::warning -Slack requires that the redirect URL of your app uses `https`, even for local development. An easy workaround for this is using a service like [`ngrok`](https://ngrok.com) that creates a secure tunnel to your app, using `https`. Remember to set the url as `NEXTAUTH_URL` as well. -::: - -![](https://i.imgur.com/ydYKTLD.png) - -## Options - -The **Slack Provider** comes with a set of default options: - -- [Slack Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/slack.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import SlackProvider from "next-auth/providers/slack"; -... -providers: [ - SlackProvider({ - clientId: process.env.SLACK_CLIENT_ID, - clientSecret: process.env.SLACK_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/spotify.md b/docs/docs/reference/05-oauth-providers/spotify.md deleted file mode 100644 index 1462bb57..00000000 --- a/docs/docs/reference/05-oauth-providers/spotify.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: spotify -title: Spotify ---- - -## Documentation - -https://developer.spotify.com/documentation/general/guides/authorization-guide - -## Configuration - -https://developer.spotify.com/dashboard/applications - -## Options - -The **Spotify Provider** comes with a set of default options: - -- [Spotify Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/spotify.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import SpotifyProvider from "next-auth/providers/spotify"; -... -providers: [ - SpotifyProvider({ - clientId: process.env.SPOTIFY_CLIENT_ID, - clientSecret: process.env.SPOTIFY_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/strava.md b/docs/docs/reference/05-oauth-providers/strava.md deleted file mode 100644 index 2ce9f324..00000000 --- a/docs/docs/reference/05-oauth-providers/strava.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: strava -title: Strava ---- - -## Documentation - -http://developers.strava.com/docs/reference/ - -## Options - -The **Strava Provider** comes with a set of default options: - -- [Strava Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/strava.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import StravaProvider from "next-auth/providers/strava"; -... -providers: [ - StravaProvider({ - clientId: process.env.STRAVA_CLIENT_ID, - clientSecret: process.env.STRAVA_CLIENT_SECRET, - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/todoist.md b/docs/docs/reference/05-oauth-providers/todoist.md deleted file mode 100644 index 3fab7cff..00000000 --- a/docs/docs/reference/05-oauth-providers/todoist.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: todoist -title: Todoist ---- - -## Documentation - -https://developer.todoist.com/guides/#oauth - -## Configuration - -https://developer.todoist.com/appconsole.html - -## Options - -The **Todoist Provider** comes with a set of default options: - -- [Todoist Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/todoist.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import TodoistProvider from "next-auth/providers/todoist"; - -... -providers: [ - TodoistProvider({ - clientId: process.env.TODOIST_ID, - clientSecret: process.env.TODOIST_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/trakt.md b/docs/docs/reference/05-oauth-providers/trakt.md deleted file mode 100644 index d6f54fd3..00000000 --- a/docs/docs/reference/05-oauth-providers/trakt.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: trakt -title: Trakt ---- - -## Documentation - -https://trakt.docs.apiary.io/#reference/authentication-oauth - -## Configuration - -If you're using the api in production by calling [api.trakt.tv](https://api.trakt.tv). Follow the example below. If you wish to develop on Trakt's sandbox environment by calling [api-staging.trakt.tv](https://api-staging.trakt.tv). Use the default options with the changed the URLs. - -Start by creating an OAuth app on Trakt for [production](https://trakt.tv/oauth/applications/new) or [development](https://staging.trakt.tv/oauth/applications/new). Then set the Client ID and Client Secret as `TRAKT_ID` and `TRAKT_SECRET` in `.env`. - -## Options - -The **Trakt Provider** comes with a set of default options: - -- [Trakt Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/trakt.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -providers: [ - TraktProvider({ - clientId: process.env.TRAKT_ID, - clientSecret: process.env.TRAKT_SECRET, - }), -] -``` - -:::warning -Trakt does not allow hotlinking images. Even the authenticated user's profile picture. -::: - -:::warning -Trakt does not supply the authenticated user's email. -::: diff --git a/docs/docs/reference/05-oauth-providers/twitch.md b/docs/docs/reference/05-oauth-providers/twitch.md deleted file mode 100644 index 17ec61d0..00000000 --- a/docs/docs/reference/05-oauth-providers/twitch.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -id: twitch -title: Twitch ---- - -## Documentation - -https://dev.twitch.tv/docs/authentication - -## Configuration - -https://dev.twitch.tv/console/apps - -Add the following redirect URL into the console `http:///api/auth/callback/twitch` - -## Options - -The **Twitch Provider** comes with a set of default options: - -- [Twitch Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/twitch.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import TwitchProvider from "next-auth/providers/twitch"; -... -providers: [ - TwitchProvider({ - clientId: process.env.TWITCH_CLIENT_ID, - clientSecret: process.env.TWITCH_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/twitter.md b/docs/docs/reference/05-oauth-providers/twitter.md deleted file mode 100644 index 64a04b3d..00000000 --- a/docs/docs/reference/05-oauth-providers/twitter.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: twitter -title: Twitter ---- - -:::note -Twitter is currently the only built-in provider using the OAuth 1.0 spec. This means that you won't receive an `access_token` or `refresh_token`, but an `oauth_token` and `oauth_token_secret` respectively. Remember to add these to your database schema, in case if you are using an [Adapter](/reference/adapters/overview). -::: - -## Documentation - -https://developer.twitter.com - -## Configuration - -https://developer.twitter.com/en/apps - -## Options - -The **Twitter Provider** comes with a set of default options: - -- [Twitter Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/twitter.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import TwitterProvider from "next-auth/providers/twitter"; -... -providers: [ - TwitterProvider({ - clientId: process.env.TWITTER_CLIENT_ID, - clientSecret: process.env.TWITTER_CLIENT_SECRET - }) -] -... -``` - -:::tip -You must enable the _"Request email address from users"_ option in your app permissions if you want to obtain the users email address. -::: - -![twitter](https://user-images.githubusercontent.com/55143799/168702338-a95912a7-b689-4680-aa2c-6306fe3c2ec7.jpeg) - -## OAuth 2.0 - -Twitter supports OAuth 2, which is currently opt-in. To enable it, simply add `version: "2.0"` to your Provider configuration: - -```js -TwitterProvider({ - clientId: process.env.TWITTER_ID, - clientSecret: process.env.TWITTER_SECRET, - version: "2.0", // opt-in to Twitter OAuth 2.0 -}) -``` - -Keep in mind that although this change is easy, it changes how and with which of [Twitter APIs](https://developer.twitter.com/en/docs/api-reference-index) you can interact with. Read the official [Twitter OAuth 2 documentation](https://developer.twitter.com/en/docs/authentication/oauth-2-0) for more details. - -:::note -Email is currently not supported by Twitter OAuth 2.0. -::: diff --git a/docs/docs/reference/05-oauth-providers/united-effects.md b/docs/docs/reference/05-oauth-providers/united-effects.md deleted file mode 100644 index f39fb5a9..00000000 --- a/docs/docs/reference/05-oauth-providers/united-effects.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -id: united-effects -title: United Effects ---- - -## Documentation - -https://docs.unitedeffects.com/integrations/nextauthjs - -## Configuration - -https://core.unitedeffects.com - -## Options - -The **United Effects Provider** comes with a set of default options: - -- [United Effects Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/united-effects.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import UnitedEffectsProvider from "next-auth/providers/united-effects"; -... -providers: [ - UnitedEffectsProvider({ - clientId: process.env.UNITED_EFFECTS_CLIENT_ID, - clientSecret: process.env.UNITED_EFFECTS_CLIENT_SECRET, - issuer: process.env.UNITED_EFFECTS_ISSUER - }) -] -... -``` - -:::note -`issuer` should be the fully qualified URL including your Auth Group ID – e.g. `https://auth.unitedeffects.com/YQpbQV5dbW-224dCovz-3` -::: - -:::warning -The United Effects API does not return the user name or image by design, so this provider will return null for both. United Effects prioritizes user personal information security above all and has built a secured profile access request system separate from the provider API. -::: diff --git a/docs/docs/reference/05-oauth-providers/vk.md b/docs/docs/reference/05-oauth-providers/vk.md deleted file mode 100644 index bad497c5..00000000 --- a/docs/docs/reference/05-oauth-providers/vk.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -id: vk -title: VK ---- - -## Documentation - -https://vk.com/dev/first_guide - -## Configuration - -https://vk.com/apps?act=manage - -## Options - -The **VK Provider** comes with a set of default options: - -- [VK Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/vk.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import VkProvider from "next-auth/providers/vk"; -... -providers: [ - VkProvider({ - clientId: process.env.VK_CLIENT_ID, - clientSecret: process.env.VK_CLIENT_SECRET - }) -] -... -``` - -:::note -By default the provider uses `5.126` version of the API. See https://vk.com/dev/versions for more info. -::: - -If you want to use a different version, you can pass it to provider's options object: - -```js -// pages/api/auth/[...nextauth].js - -const apiVersion = "5.126" -... -providers: [ - VkProvider({ - accessTokenUrl: `https://oauth.vk.com/access_token?v=${apiVersion}`, - requestTokenUrl: `https://oauth.vk.com/access_token?v=${apiVersion}`, - authorizationUrl: - `https://oauth.vk.com/authorize?response_type=code&v=${apiVersion}`, - profileUrl: `https://api.vk.com/method/users.get?fields=photo_100&v=${apiVersion}`, - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/wordpress.md b/docs/docs/reference/05-oauth-providers/wordpress.md deleted file mode 100644 index ba213291..00000000 --- a/docs/docs/reference/05-oauth-providers/wordpress.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: wordpress -title: WordPress.com ---- - -## Documentation - -https://developer.wordpress.com/docs/oauth2/ - -## Configuration - -https://developer.wordpress.com/apps/ - -## Options - -The **Wordpress Provider** comes with a set of default options: - -- [Wordpress Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/wordpress.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import WordpressProvider from "next-auth/providers/wordpress"; -... -providers: [ - WordpressProvider({ - clientId: process.env.WORDPRESS_CLIENT_ID, - clientSecret: process.env.WORDPRESS_CLIENT_SECRET - }) -} -... -``` - -:::tip -Register your application to obtain Client ID and Client Secret at https://developer.wordpress.com/apps/ Select Type as Web and set Redirect URL to `http://example.com/api/auth/callback/wordpress` where example.com is your site domain. -::: diff --git a/docs/docs/reference/05-oauth-providers/workos.md b/docs/docs/reference/05-oauth-providers/workos.md deleted file mode 100644 index 08038592..00000000 --- a/docs/docs/reference/05-oauth-providers/workos.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -id: workos -title: WorkOS ---- - -## Documentation - -https://workos.com/docs/sso/guide - -## Configuration - -https://dashboard.workos.com - -## Options - -The **WorkOS Provider** comes with a set of default options: - -- [WorkOS Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/workos.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import WorkOSProvider from "next-auth/providers/workos"; -... -providers: [ - WorkOSProvider({ - clientId: process.env.WORKOS_CLIENT_ID, - clientSecret: process.env.WORKOS_API_KEY, - }), -], -... -``` - -WorkOS is not an identity provider itself, but, rather, a bridge to multiple single sign-on (SSO) providers. As a result, we need to make some additional changes to authenticate users using WorkOS. - -In order to sign a user in using WorkOS, we need to specify which WorkOS Connection to use. A common way to do this is to collect the user's email address and extract the domain. - -This can be done using a custom login page. - -To add a custom login page, you can use the `pages` option: - -```javascript title="pages/api/auth/[...nextauth].js" -... - pages: { - signIn: "/auth/signin", - } -``` - -We can then add a custom login page that displays an input where the user can enter their email address. We then extract the domain from the user's email address and pass it to the `authorizationParams` parameter on the `signIn` function: - -```jsx title="pages/auth/signin.js" -import { useState } from "react" -import { getProviders, signIn } from "next-auth/react" - -export default function SignIn({ providers }) { - const [email, setEmail] = useState("") - - return ( - <> - {Object.values(providers).map((provider) => { - if (provider.id === "workos") { - return ( -
- setEmail(event.target.value)} - /> - -
- ) - } - - return ( -
- -
- ) - })} - - ) -} - -export async function getServerSideProps(context) { - const providers = await getProviders() - return { - props: { providers }, - } -} -``` diff --git a/docs/docs/reference/05-oauth-providers/yandex.md b/docs/docs/reference/05-oauth-providers/yandex.md deleted file mode 100644 index d5239718..00000000 --- a/docs/docs/reference/05-oauth-providers/yandex.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: yandex -title: Yandex ---- - -## Documentation - -https://tech.yandex.com/oauth/doc/dg/concepts/about-docpage/ - -## Configuration - -https://oauth.yandex.com/client/new - -## Options - -The **Yandex Provider** comes with a set of default options: - -- [Yandex Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/yandex.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import YandexProvider from "next-auth/providers/yandex"; -... -providers: [ - YandexProvider({ - clientId: process.env.YANDEX_CLIENT_ID, - clientSecret: process.env.YANDEX_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/zoho.md b/docs/docs/reference/05-oauth-providers/zoho.md deleted file mode 100644 index 7199e23e..00000000 --- a/docs/docs/reference/05-oauth-providers/zoho.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: zoho -title: Zoho ---- - -## Documentation - -https://www.zoho.com/accounts/protocol/oauth/web-server-applications.html - -## Configuration - -https://api-console.zoho.com/ - -## Options - -The **Zoho Provider** comes with a set of default options: - -- [Zoho Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/zoho.js) - -You can override any of the options to suit your own use case. - -## Example - -```js -import ZohoProvider from "next-auth/providers/zoho"; -... -providers: [ - ZohoProvider({ - clientId: process.env.ZOHO_CLIENT_ID, - clientSecret: process.env.ZOHO_CLIENT_SECRET - }) -] -... -``` diff --git a/docs/docs/reference/05-oauth-providers/zoom.md b/docs/docs/reference/05-oauth-providers/zoom.md deleted file mode 100644 index c854b192..00000000 --- a/docs/docs/reference/05-oauth-providers/zoom.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: zoom -title: Zoom ---- - -## Documentation - -https://marketplace.zoom.us/docs/guides/auth/oauth - -## Configuration - -https://marketplace.zoom.us - -## Options - -The **Zoom Provider** comes with a set of default options: - -- [Zoom Provider options](https://github.com/nextauthjs/next-auth/blob/main/packages/next-auth/src/providers/zoom.ts) - -You can override any of the options to suit your own use case. - -## Example - -```js -import ZoomProvider from "next-auth/providers/zoom" -... -providers: [ - ZoomProvider({ - clientId: process.env.ZOOM_CLIENT_ID, - clientSecret: process.env.ZOOM_CLIENT_SECRET - }) -} -... -``` diff --git a/docs/docs/reference/08-rest-api.md b/docs/docs/reference/08-rest-api.md deleted file mode 100644 index 36ad502c..00000000 --- a/docs/docs/reference/08-rest-api.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -id: rest-api -title: REST API ---- - -Auth.js exposes a REST API that is used by the Auth.js client. - -### GET → `/api/auth/signin` - -Displays the built-in/unbranded sign-in page. - -### POST → `/api/auth/signin/:provider` - -Starts a provider-specific sign-in flow. - -The POST submission requires CSRF token from `/api/auth/csrf`. - -In case of an OAuth provider, calling this endpoint will initiate the Authorization Request to your Identity Provider. -Learn more about this in the [OAuth specification](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1). - -In case of using the Email provider, calling this endpoint will send a sign-in URL to the user's e-mail address. - -This endpoint is also used by the [`signIn`](/reference/utilities/#signin) method internally. - -### GET / POST → `/api/auth/callback/:provider` - -Handles returning requests from OAuth services during sign-in. - -For OAuth 2.0 providers that support the `checks: ["state"]` option, the state parameter is checked against the one that was generated when the sign in flow was started - this uses a hash of the CSRF token which MUST match for both the `POST` and `GET` calls during sign-in. - -Learn more about this in the [OAuth specification](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2). - -### GET → `/api/auth/signout` - -Displays the built-in/unbranded sign out page. - -### POST → `/api/auth/signout` - -Handles signing the user out - this is a `POST` submission to prevent malicious links from triggering signing a user out without their consent. The user session will be invalidated/removed from the cookie/database, depending on the flow you chose to [store sessions](/reference/configuration/auth-config#session). - -The `POST` submission requires CSRF token from `/api/auth/csrf`. - -This endpoint is also used by the [`signOut` utility](/reference/utilities/#signout) method internally. - -### GET → `/api/auth/session` - -Returns client-safe session object - or an empty object if there is no session. - -The contents of the session object that is returned are configurable with the [`session` callback](/reference/configuration/auth-config#callbacks). - -### GET → `/api/auth/csrf` - -Returns object containing CSRF token. In Auth.js, CSRF protection is present on all authentication routes. It uses the "double submit cookie method", which uses a signed HttpOnly, host-only cookie. - -The CSRF token returned by this endpoint must be passed as form variable named `csrfToken` in all `POST` submissions to any API endpoint. - -### GET → `/api/auth/providers` - -Returns a list of configured OAuth services and details (e.g. sign in and callback URLs) for each service. - -It is useful to dynamically generate custom sign up pages and to check what callback URLs are configured for each OAuth provider that is configured. - ---- - -:::note -The default base path is `/api/auth` but it is configurable by specifying a custom path in `NEXTAUTH_URL` - -e.g. - -`NEXTAUTH_URL=https://example.com/myapp/api/authentication` - -`/api/auth/signin` -> `/myapp/api/authentication/signin` -::: diff --git a/docs/docs/reference/04-nextjs/client.md b/docs/docs/reference/nextjs/client.md similarity index 100% rename from docs/docs/reference/04-nextjs/client.md rename to docs/docs/reference/nextjs/client.md diff --git a/docs/docs/reference/04-nextjs/index.md b/docs/docs/reference/nextjs/index.md similarity index 100% rename from docs/docs/reference/04-nextjs/index.md rename to docs/docs/reference/nextjs/index.md diff --git a/docs/docs/reference/04-solidstart/client.md b/docs/docs/reference/solidstart/client.md similarity index 100% rename from docs/docs/reference/04-solidstart/client.md rename to docs/docs/reference/solidstart/client.md diff --git a/docs/docs/reference/04-solidstart/index.md b/docs/docs/reference/solidstart/index.md similarity index 100% rename from docs/docs/reference/04-solidstart/index.md rename to docs/docs/reference/solidstart/index.md diff --git a/docs/docs/reference/04-solidstart/protected.md b/docs/docs/reference/solidstart/protected.md similarity index 100% rename from docs/docs/reference/04-solidstart/protected.md rename to docs/docs/reference/solidstart/protected.md diff --git a/docs/docs/reference/09-warnings.md b/docs/docs/reference/warnings.md similarity index 100% rename from docs/docs/reference/09-warnings.md rename to docs/docs/reference/warnings.md diff --git a/docs/scripts/generate-providers.mjs b/docs/scripts/generate-providers.mjs index 8e4ecfac..c816a8c8 100644 --- a/docs/scripts/generate-providers.mjs +++ b/docs/scripts/generate-providers.mjs @@ -1,17 +1,23 @@ import { join } from "path" import { readdirSync, readFileSync, writeFileSync } from "fs" -// TODO: generate from core package -const providersPath = join(process.cwd(), "/docs/reference/05-oauth-providers") +const providersPath = join(process.cwd(), "../packages/core/src/providers") const files = readdirSync(providersPath, "utf8") +const notOAuth = [ + "index.ts", + "oauth-types.ts", + "email.ts", + "credentials.ts", + "oauth.ts", +] + const result = files.reduce((acc, file) => { - if (file === "index.md" || file === "_category_.json") return acc + if (notOAuth.includes(file)) return acc const provider = readFileSync(join(providersPath, file), "utf8") - const { id, title } = provider.match( - /id: (?.+)\ntitle: (?.+)\n/ - ).groups + const { id } = provider.match(/id: "(?<id>.+)",/).groups + const { title } = provider.match(/name: "(?<title>.+)",/).groups acc[id] = title return acc }, {}) From 15943d66960d969a5e238310ea82f92578a4f9b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= <info@balazsorban.com> Date: Tue, 21 Mar 2023 01:02:20 +0100 Subject: [PATCH 46/80] docs: fix indent --- docs/docs/guides/providers/custom-provider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/providers/custom-provider.md b/docs/docs/guides/providers/custom-provider.md index a2a3bbd4..681eb9fd 100644 --- a/docs/docs/guides/providers/custom-provider.md +++ b/docs/docs/guides/providers/custom-provider.md @@ -92,7 +92,7 @@ GoogleProvider({ }) ``` -### Adding a new built-in provider +## Adding a new built-in provider If you think your custom provider might be useful to others, we encourage you to open a PR and add it to the built-in list. From 8f6108f230588a2ce5bae2aabee3d45d86b0b6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= <info@balazsorban.com> Date: Tue, 21 Mar 2023 18:54:10 +0100 Subject: [PATCH 47/80] docs: fix Mermaid rendering, lock gatsby playground versions --- apps/playgrounds/gatsby/package.json | 10 +- docs/docusaurus.config.js | 4 + docs/package.json | 13 +- docs/sidebars.js | 2 +- pnpm-lock.yaml | 2581 +++++--------------------- 5 files changed, 528 insertions(+), 2082 deletions(-) diff --git a/apps/playgrounds/gatsby/package.json b/apps/playgrounds/gatsby/package.json index b6830c12..ec328fc3 100644 --- a/apps/playgrounds/gatsby/package.json +++ b/apps/playgrounds/gatsby/package.json @@ -10,13 +10,13 @@ "clean": "gatsby clean" }, "dependencies": { - "dotenv": "^16.0.0", - "gatsby": "next", + "dotenv": "16.0.0", + "gatsby": "5.8.0-next.3", "next-auth": "workspace:*", - "react": "^18", - "react-dom": "^18" + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { - "vercel": "^23.1.2" + "vercel": "23.1.2" } } diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index a2b0b0ce..392360fb 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -36,6 +36,10 @@ function createTypeDocAdapterConfig(name) { /** @type {import("@docusaurus/types").Config} */ const docusaurusConfig = { + markdown: { + mermaid: true, + }, + themes: ["@docusaurus/theme-mermaid"], title: "Auth.js", tagline: "Authentication for the Web.", url: "https://authjs.dev", diff --git a/docs/package.json b/docs/package.json index 53f471a9..c1ea3ec4 100644 --- a/docs/package.json +++ b/docs/package.json @@ -27,12 +27,13 @@ "styled-components": "5.3.6" }, "devDependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/eslint-plugin": "2.2.0", - "@docusaurus/module-type-aliases": "2.2.0", - "@docusaurus/preset-classic": "2.2.0", - "@docusaurus/theme-common": "2.2.0", - "@docusaurus/types": "2.2.0", + "@docusaurus/core": "2.3.1", + "@docusaurus/eslint-plugin": "2.3.1", + "@docusaurus/module-type-aliases": "2.3.1", + "@docusaurus/preset-classic": "2.3.1", + "@docusaurus/theme-common": "2.3.1", + "@docusaurus/theme-mermaid": "2.3.1", + "@docusaurus/types": "2.3.1", "docusaurus-plugin-typedoc": "1.0.0-next.2", "typedoc": "^0.23.24", "typedoc-plugin-markdown": "4.0.0-next.2" diff --git a/docs/sidebars.js b/docs/sidebars.js index 3dc43fe7..969f840c 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -30,7 +30,7 @@ module.exports = { type: "category", label: "@auth/solid-start", link: { type: "doc", id: "reference/solidstart/index" }, - items: [{ type: "autogenerated", dirName: "reference/04-solidstart" }], + items: [{ type: "autogenerated", dirName: "reference/solidstart" }], }, { type: "category", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46a2a655..2bb06db1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,14 +125,14 @@ importers: apps/playgrounds/gatsby: specifiers: - dotenv: ^16.0.0 - gatsby: next + dotenv: 16.0.0 + gatsby: 5.8.0-next.3 next-auth: workspace:* - react: ^18 - react-dom: ^18 - vercel: ^23.1.2 + react: 18.2.0 + react-dom: 18.2.0 + vercel: 23.1.2 dependencies: - dotenv: 16.0.3 + dotenv: 16.0.0 gatsby: 5.8.0-next.3_biqbaboplfbrettd7655fr4n2y next-auth: link:../../../packages/next-auth react: 18.2.0 @@ -161,12 +161,13 @@ importers: docs: specifiers: - '@docusaurus/core': 2.2.0 - '@docusaurus/eslint-plugin': 2.2.0 - '@docusaurus/module-type-aliases': 2.2.0 - '@docusaurus/preset-classic': 2.2.0 - '@docusaurus/theme-common': 2.2.0 - '@docusaurus/types': 2.2.0 + '@docusaurus/core': 2.3.1 + '@docusaurus/eslint-plugin': 2.3.1 + '@docusaurus/module-type-aliases': 2.3.1 + '@docusaurus/preset-classic': 2.3.1 + '@docusaurus/theme-common': 2.3.1 + '@docusaurus/theme-mermaid': 2.3.1 + '@docusaurus/types': 2.3.1 '@mdx-js/react': 1.6.22 '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 classnames: ^2.3.2 @@ -192,12 +193,13 @@ importers: react-marquee-slider: 1.1.5_styled-components@5.3.6 styled-components: 5.3.6_biqbaboplfbrettd7655fr4n2y devDependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/eslint-plugin': 2.2.0 - '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/preset-classic': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/eslint-plugin': 2.3.1 + '@docusaurus/module-type-aliases': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/preset-classic': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/theme-mermaid': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y docusaurus-plugin-typedoc: 1.0.0-next.2_kb65gbyd32jlgdze2tbrhv364a typedoc: 0.23.24 typedoc-plugin-markdown: 4.0.0-next.2_typedoc@0.23.24 @@ -1868,29 +1870,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/core/7.20.2: - resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.2 - '@babel/helper-module-transforms': 7.20.11 - '@babel/helpers': 7.20.7 - '@babel/parser': 7.20.15 - '@babel/template': 7.20.7 - '@babel/traverse': 7.20.13 - '@babel/types': 7.20.7 - convert-source-map: 1.8.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/eslint-parser/7.19.1_go3kp2l7mdrkdyt3xfyeu7ppfa: resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -1922,15 +1901,6 @@ packages: '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 - /@babel/generator/7.20.3: - resolution: {integrity: sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.20.7 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: true - /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} @@ -2009,20 +1979,6 @@ packages: lru-cache: 5.1.1 semver: 6.3.0 - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.2: - resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.20.10 - '@babel/core': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 - lru-cache: 5.1.1 - semver: 6.3.0 - dev: true - /@babel/helper-create-class-features-plugin/7.20.2: resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==} engines: {node: '>=6.9.0'} @@ -2075,24 +2031,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.20.7 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-create-regexp-features-plugin/7.19.0: resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} engines: {node: '>=6.9.0'} @@ -2124,17 +2062,6 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.2.1 - /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.20.2: - resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.2.1 - dev: true - /@babel/helper-define-polyfill-provider/0.3.3: resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: @@ -2181,22 +2108,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.2: - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-environment-visitor/7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} @@ -2339,21 +2250,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.20.7 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-replace-supers/7.20.7: resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} @@ -2485,16 +2381,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.17.12: resolution: {integrity: sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==} engines: {node: '>=6.9.0'} @@ -2529,18 +2415,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-async-generator-functions/7.17.12: resolution: {integrity: sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==} engines: {node: '>=6.9.0'} @@ -2582,21 +2456,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions/7.20.1_@babel+core@7.20.2: - resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-class-properties/7.17.12: resolution: {integrity: sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==} engines: {node: '>=6.9.0'} @@ -2634,19 +2493,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-class-static-block/7.18.0: resolution: {integrity: sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==} engines: {node: '>=6.9.0'} @@ -2687,20 +2533,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-dynamic-import/7.16.7: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} @@ -2732,17 +2564,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-export-namespace-from/7.17.12: resolution: {integrity: sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==} engines: {node: '>=6.9.0'} @@ -2774,17 +2595,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-json-strings/7.17.12: resolution: {integrity: sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==} engines: {node: '>=6.9.0'} @@ -2816,17 +2626,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.17.12: resolution: {integrity: sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==} engines: {node: '>=6.9.0'} @@ -2858,17 +2657,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.17.12: resolution: {integrity: sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==} engines: {node: '>=6.9.0'} @@ -2900,17 +2688,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-numeric-separator/7.16.7: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} @@ -2942,17 +2719,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} peerDependencies: @@ -3004,20 +2770,6 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.12 - /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.20.10 - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-optional-catch-binding/7.16.7: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} engines: {node: '>=6.9.0'} @@ -3049,17 +2801,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-optional-chaining/7.17.12: resolution: {integrity: sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==} engines: {node: '>=6.9.0'} @@ -3117,18 +2858,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 - /@babel/plugin-proposal-optional-chaining/7.20.7_@babel+core@7.20.2: - resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-private-methods/7.17.12: resolution: {integrity: sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==} engines: {node: '>=6.9.0'} @@ -3166,19 +2895,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-private-property-in-object/7.17.12: resolution: {integrity: sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==} engines: {node: '>=6.9.0'} @@ -3222,21 +2938,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-unicode-property-regex/7.17.12: resolution: {integrity: sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==} engines: {node: '>=4'} @@ -3289,17 +2990,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-async-generators/7.8.4: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -3325,15 +3015,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.2: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.12: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -3368,15 +3049,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.2: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-class-static-block/7.14.5: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -3405,16 +3077,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.2: - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -3440,15 +3102,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -3474,15 +3127,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-flow/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} engines: {node: '>=6.9.0'} @@ -3521,16 +3165,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.2: - resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.12: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -3565,15 +3199,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} peerDependencies: @@ -3602,16 +3227,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -3637,15 +3252,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.2: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -3671,15 +3277,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -3705,15 +3302,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.2: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -3748,15 +3336,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -3782,15 +3361,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -3816,15 +3386,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -3853,16 +3414,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.2: - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-top-level-await/7.14.5: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -3891,16 +3442,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.2: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.18.5: resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} @@ -3920,16 +3461,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.2: - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-arrow-functions/7.17.12: resolution: {integrity: sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==} engines: {node: '>=6.9.0'} @@ -3958,16 +3489,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-async-to-generator/7.17.12: resolution: {integrity: sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==} engines: {node: '>=6.9.0'} @@ -4008,20 +3529,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-block-scoped-functions/7.16.7: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} engines: {node: '>=6.9.0'} @@ -4050,16 +3557,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-block-scoping/7.18.4: resolution: {integrity: sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==} engines: {node: '>=6.9.0'} @@ -4088,16 +3585,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-block-scoping/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-classes/7.18.4: resolution: {integrity: sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==} engines: {node: '>=6.9.0'} @@ -4154,26 +3641,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes/7.20.7_@babel+core@7.20.2: - resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.2 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-computed-properties/7.17.12: resolution: {integrity: sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==} engines: {node: '>=6.9.0'} @@ -4202,16 +3669,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-destructuring/7.18.0: resolution: {integrity: sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==} engines: {node: '>=6.9.0'} @@ -4240,16 +3697,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-destructuring/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-dotall-regex/7.16.7: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} engines: {node: '>=6.9.0'} @@ -4302,17 +3749,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-duplicate-keys/7.17.12: resolution: {integrity: sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==} engines: {node: '>=6.9.0'} @@ -4341,16 +3777,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-exponentiation-operator/7.16.7: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} engines: {node: '>=6.9.0'} @@ -4382,17 +3808,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-flow-strip-types/7.19.0_@babel+core@7.20.12: resolution: {integrity: sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==} engines: {node: '>=6.9.0'} @@ -4432,16 +3847,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.2: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-function-name/7.16.7: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} engines: {node: '>=6.9.0'} @@ -4476,18 +3881,6 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.2 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-literals/7.17.12: resolution: {integrity: sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==} engines: {node: '>=6.9.0'} @@ -4516,16 +3909,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-member-expression-literals/7.16.7: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} engines: {node: '>=6.9.0'} @@ -4554,16 +3937,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-modules-amd/7.18.0: resolution: {integrity: sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==} engines: {node: '>=6.9.0'} @@ -4603,19 +3976,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-amd/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-transforms': 7.20.11 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-commonjs/7.18.2: resolution: {integrity: sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==} engines: {node: '>=6.9.0'} @@ -4658,20 +4018,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-transforms': 7.20.11 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-systemjs/7.18.5: resolution: {integrity: sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q==} engines: {node: '>=6.9.0'} @@ -4717,21 +4063,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.11 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-identifier': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-umd/7.18.0: resolution: {integrity: sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==} engines: {node: '>=6.9.0'} @@ -4769,19 +4100,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-transforms': 7.20.11 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.17.12: resolution: {integrity: sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==} engines: {node: '>=6.9.0'} @@ -4813,17 +4131,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.20.2: - resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-new-target/7.18.5: resolution: {integrity: sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg==} engines: {node: '>=6.9.0'} @@ -4852,16 +4159,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-object-super/7.16.7: resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} engines: {node: '>=6.9.0'} @@ -4899,19 +4196,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-parameters/7.17.12: resolution: {integrity: sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==} engines: {node: '>=6.9.0'} @@ -4969,16 +4253,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.20.2: - resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-property-literals/7.16.7: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} engines: {node: '>=6.9.0'} @@ -5007,16 +4281,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-react-constant-elements/7.17.12_@babel+core@7.20.12: resolution: {integrity: sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw==} engines: {node: '>=6.9.0'} @@ -5046,16 +4310,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.18.5: resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} engines: {node: '>=6.9.0'} @@ -5075,16 +4329,6 @@ packages: '@babel/core': 7.20.12 '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.12 - /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.2 - dev: true - /@babel/plugin-transform-react-jsx/7.17.12_@babel+core@7.18.5: resolution: {integrity: sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==} engines: {node: '>=6.9.0'} @@ -5126,20 +4370,6 @@ packages: '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 '@babel/types': 7.20.7 - /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.2: - resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.2 - '@babel/types': 7.20.7 - dev: true - /@babel/plugin-transform-react-pure-annotations/7.18.0_@babel+core@7.18.5: resolution: {integrity: sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ==} engines: {node: '>=6.9.0'} @@ -5161,17 +4391,6 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-regenerator/7.18.0: resolution: {integrity: sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==} engines: {node: '>=6.9.0'} @@ -5203,17 +4422,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.0 - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - regenerator-transform: 0.15.0 - dev: true - /@babel/plugin-transform-reserved-words/7.17.12: resolution: {integrity: sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==} engines: {node: '>=6.9.0'} @@ -5242,16 +4450,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-runtime/7.18.5: resolution: {integrity: sha512-Q17hHxXr2fplrE+5BSC1j1Fo5cOA8YeP8XW3/1paI8MzF/faZGh0MaH1KC4jLAvqLPamQWHB5/B7KqSLY1kuHA==} engines: {node: '>=6.9.0'} @@ -5300,24 +4498,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false - - /@babel/plugin-transform-runtime/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.2 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.2 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true /@babel/plugin-transform-shorthand-properties/7.16.7: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} @@ -5347,16 +4527,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-spread/7.17.12: resolution: {integrity: sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==} engines: {node: '>=6.9.0'} @@ -5388,17 +4558,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.20.2: - resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - dev: true - /@babel/plugin-transform-sticky-regex/7.16.7: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} engines: {node: '>=6.9.0'} @@ -5427,16 +4586,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-template-literals/7.18.2: resolution: {integrity: sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==} engines: {node: '>=6.9.0'} @@ -5465,16 +4614,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-typeof-symbol/7.17.12: resolution: {integrity: sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==} engines: {node: '>=6.9.0'} @@ -5503,16 +4642,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-typescript/7.18.4_@babel+core@7.18.5: resolution: {integrity: sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==} engines: {node: '>=6.9.0'} @@ -5540,20 +4669,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-unicode-escapes/7.16.7: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} @@ -5582,16 +4697,6 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.2: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-unicode-regex/7.16.7: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} engines: {node: '>=6.9.0'} @@ -5623,17 +4728,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.12 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/preset-env/7.18.2: resolution: {integrity: sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==} engines: {node: '>=6.9.0'} @@ -5890,92 +4984,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-env/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.20.10 - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-proposal-async-generator-functions': 7.20.1_@babel+core@7.20.2 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-object-rest-spread': 7.20.2_@babel+core@7.20.2 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.2 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-block-scoping': 7.20.2_@babel+core@7.20.2 - '@babel/plugin-transform-classes': 7.20.7_@babel+core@7.20.2 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-destructuring': 7.20.2_@babel+core@7.20.2 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.2 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-amd': 7.19.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-commonjs': 7.19.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-systemjs': 7.19.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.20.2 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.20.2 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.2 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.2 - '@babel/preset-modules': 0.1.5_@babel+core@7.20.2 - '@babel/types': 7.20.7 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.2 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.2 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.2 - core-js-compat: 3.26.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/preset-modules/0.1.5: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: @@ -6013,19 +5021,6 @@ packages: '@babel/types': 7.20.7 esutils: 2.0.3 - /@babel/preset-modules/0.1.5_@babel+core@7.20.2: - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2 - '@babel/types': 7.20.7 - esutils: 2.0.3 - dev: true - /@babel/preset-react/7.17.12_@babel+core@7.18.5: resolution: {integrity: sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==} engines: {node: '>=6.9.0'} @@ -6055,21 +5050,6 @@ packages: '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.12 '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.12 - /@babel/preset-react/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.2 - '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.2 - dev: true - /@babel/preset-typescript/7.17.12_@babel+core@7.18.5: resolution: {integrity: sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==} engines: {node: '>=6.9.0'} @@ -6097,20 +5077,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-typescript/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/runtime-corejs3/7.20.1: resolution: {integrity: sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==} engines: {node: '>=6.9.0'} @@ -6178,24 +5144,6 @@ packages: - supports-color dev: true - /@babel/traverse/7.20.1: - resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.20.14 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.20.15 - '@babel/types': 7.20.7 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/traverse/7.20.13: resolution: {integrity: sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==} engines: {node: '>=6.9.0'} @@ -6265,7 +5213,6 @@ packages: /@braintree/sanitize-url/6.0.2: resolution: {integrity: sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==} - dev: false /@builder.io/partytown/0.7.5: resolution: {integrity: sha512-Zbr2Eo0AQ4yzmQr/36/h+6LKjmdVBB3Q5cGzO6rtlIKB/IOpbQVUZW+XAnhpJmJr9sIF97OZjgbhG9k7Sjn4yw==} @@ -6336,35 +5283,35 @@ packages: - '@algolia/client-search' dev: true - /@docusaurus/core/2.2.0_if65ga6ul5jnw5c4373drfty5m: - resolution: {integrity: sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==} + /@docusaurus/core/2.3.1_pmmuy6rkkayfggimpcjiffhloy: + resolution: {integrity: sha512-0Jd4jtizqnRAr7svWaBbbrCCN8mzBNd2xFLoT/IM7bGfFie5y58oz97KzXliwiLY3zWjqMXjQcuP1a5VgCv2JA==} engines: {node: '>=16.14'} hasBin: true peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@babel/core': 7.20.2 - '@babel/generator': 7.20.3 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.20.2 - '@babel/preset-env': 7.20.2_@babel+core@7.20.2 - '@babel/preset-react': 7.18.6_@babel+core@7.20.2 - '@babel/preset-typescript': 7.18.6_@babel+core@7.20.2 - '@babel/runtime': 7.20.1 + '@babel/core': 7.20.12 + '@babel/generator': 7.20.14 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.20.12 + '@babel/preset-env': 7.20.2_@babel+core@7.20.12 + '@babel/preset-react': 7.18.6_@babel+core@7.20.12 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.12 + '@babel/runtime': 7.20.13 '@babel/runtime-corejs3': 7.20.1 - '@babel/traverse': 7.20.1 - '@docusaurus/cssnano-preset': 2.2.0 - '@docusaurus/logger': 2.2.0 - '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m + '@babel/traverse': 7.20.13 + '@docusaurus/cssnano-preset': 2.3.1 + '@docusaurus/logger': 2.3.1 + '@docusaurus/mdx-loader': 2.3.1_pmmuy6rkkayfggimpcjiffhloy '@docusaurus/react-loadable': 5.5.2_react@18.2.0 - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-common': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.2.1 - autoprefixer: 10.4.13_postcss@8.4.20 - babel-loader: 8.2.5_jzdsusohi23wobhstm6lj7n7ui + autoprefixer: 10.4.13_postcss@8.4.21 + babel-loader: 8.3.0_la66t7xldg4uecmyawueag5wkm babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -6373,50 +5320,50 @@ packages: cli-table3: 0.6.2 combine-promises: 1.1.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0_webpack@5.73.0 + copy-webpack-plugin: 11.0.0_webpack@5.75.0 core-js: 3.26.0 - css-loader: 6.7.1_webpack@5.73.0 - css-minimizer-webpack-plugin: 4.0.0_ym7haxui4mhsv4z74sxfalk3f4 - cssnano: 5.1.12_postcss@8.4.20 + css-loader: 6.7.1_webpack@5.75.0 + css-minimizer-webpack-plugin: 4.0.0_zut7kw46oefpa7zgeqrbpwozya + cssnano: 5.1.14_postcss@8.4.21 del: 6.1.1 - detect-port: 1.3.0 + detect-port: 1.5.1 escape-html: 1.0.3 - eta: 1.12.3 - file-loader: 6.2.0_webpack@5.73.0 + eta: 2.0.1 + file-loader: 6.2.0_webpack@5.75.0 fs-extra: 10.1.0 html-minifier-terser: 6.1.0 html-tags: 3.2.0 - html-webpack-plugin: 5.5.0_webpack@5.73.0 + html-webpack-plugin: 5.5.0_webpack@5.75.0 import-fresh: 3.3.0 leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.6.1_webpack@5.73.0 - postcss: 8.4.20 - postcss-loader: 7.0.0_n5hdb4sd74eqt3xtblrzrc6vly + mini-css-extract-plugin: 2.6.1_webpack@5.75.0 + postcss: 8.4.21 + postcss-loader: 7.0.0_6jdsrmfenkuhhw3gx4zvjlznce prompts: 2.4.2 react: 18.2.0 - react-dev-utils: 12.0.1_webpack@5.73.0 + react-dev-utils: 12.0.1_webpack@5.75.0 react-dom: 18.2.0_react@18.2.0 react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0 - react-loadable-ssr-addon-v5-slorber: 1.0.1_pobh4rnr4unizsdzh3gmmsgqtu + react-loadable-ssr-addon-v5-slorber: 1.0.1_pwfl7zyferpbeh35vaepqxwaky react-router: 5.3.3_react@18.2.0 react-router-config: 5.1.1_4gumyfmpzq3vvokmq4lwan2qpu react-router-dom: 5.3.3_react@18.2.0 rtl-detect: 1.0.4 - semver: 7.3.7 + semver: 7.3.8 serve-handler: 6.1.3 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.3_webpack@5.73.0 - tslib: 2.4.0 + terser-webpack-plugin: 5.3.6_webpack@5.75.0 + tslib: 2.4.1 update-notifier: 5.1.0 - url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm + url-loader: 4.1.1_p5dl6emkcwslbw72e37w4ug7em wait-on: 6.0.1 - webpack: 5.73.0 + webpack: 5.75.0 webpack-bundle-analyzer: 4.5.0 - webpack-dev-server: 4.11.1_webpack@5.73.0 + webpack-dev-server: 4.11.1_webpack@5.75.0 webpack-merge: 5.8.0 - webpackbar: 5.0.2_webpack@5.73.0 + webpackbar: 5.0.2_webpack@5.75.0 transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' @@ -6434,39 +5381,39 @@ packages: - webpack-cli dev: true - /@docusaurus/cssnano-preset/2.2.0: - resolution: {integrity: sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg==} + /@docusaurus/cssnano-preset/2.3.1: + resolution: {integrity: sha512-7mIhAROES6CY1GmCjR4CZkUfjTL6B3u6rKHK0ChQl2d1IevYXq/k/vFgvOrJfcKxiObpMnE9+X6R2Wt1KqxC6w==} engines: {node: '>=16.14'} dependencies: - cssnano-preset-advanced: 5.3.8_postcss@8.4.19 - postcss: 8.4.19 - postcss-sort-media-queries: 4.2.1_postcss@8.4.19 + cssnano-preset-advanced: 5.3.8_postcss@8.4.21 + postcss: 8.4.21 + postcss-sort-media-queries: 4.2.1_postcss@8.4.21 tslib: 2.4.1 dev: true - /@docusaurus/eslint-plugin/2.2.0: - resolution: {integrity: sha512-bz50+EZr8IMIKaupBGXxHrfYCPcNtnzh9FLbxQrlCzesSyUnlKwMOdhH0i+uTrjpZC3OPo0NSf9cz6bBabN/wg==} + /@docusaurus/eslint-plugin/2.3.1: + resolution: {integrity: sha512-xezO8YncV1EJi2+6ScBWHCjbgQfDpUQApd9T/Hw03rhwEV/WAk9oxbymsehLRvAG1k0/blB8Pb4PEo81qrdl3Q==} engines: {node: '>=16.14'} peerDependencies: eslint: '>=6' dependencies: - '@typescript-eslint/utils': 5.45.1 + '@typescript-eslint/utils': 5.47.0 tslib: 2.4.1 transitivePeerDependencies: - supports-color - typescript dev: true - /@docusaurus/logger/2.2.0: - resolution: {integrity: sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A==} + /@docusaurus/logger/2.3.1: + resolution: {integrity: sha512-2lAV/olKKVr9qJhfHFCaqBIl8FgYjbUFwgUnX76+cULwQYss+42ZQ3grHGFvI0ocN2X55WcYe64ellQXz7suqg==} engines: {node: '>=16.14'} dependencies: chalk: 4.1.2 tslib: 2.4.1 dev: true - /@docusaurus/mdx-loader/2.2.0_if65ga6ul5jnw5c4373drfty5m: - resolution: {integrity: sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA==} + /@docusaurus/mdx-loader/2.3.1_pmmuy6rkkayfggimpcjiffhloy: + resolution: {integrity: sha512-Gzga7OsxQRpt3392K9lv/bW4jGppdLFJh3luKRknCKSAaZrmVkOQv2gvCn8LAOSZ3uRg5No7AgYs/vpL8K94lA==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 @@ -6474,8 +5421,8 @@ packages: dependencies: '@babel/parser': 7.20.15 '@babel/traverse': 7.20.13 - '@docusaurus/logger': 2.2.0 - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/logger': 2.3.1 + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 '@mdx-js/mdx': 1.6.22 escape-html: 1.0.3 file-loader: 6.2.0_webpack@5.75.0 @@ -6500,14 +5447,14 @@ packages: - webpack-cli dev: true - /@docusaurus/module-type-aliases/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ==} + /@docusaurus/module-type-aliases/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-6KkxfAVOJqIUynTRb/tphYCl+co3cP0PlHiMDbi+SzmYxMdgIrwYqH9yAnGSDoN6Jk2ZE/JY/Azs/8LPgKP48A==} peerDependencies: react: '*' react-dom: '*' dependencies: '@docusaurus/react-loadable': 5.5.2_react@18.2.0 - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y '@types/history': 4.7.11 '@types/react': 18.0.26 '@types/react-router-config': 5.0.6 @@ -6523,20 +5470,20 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-content-blog/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w==} + /@docusaurus/plugin-content-blog/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-f5LjqX+9WkiLyGiQ41x/KGSJ/9bOjSD8lsVhPvYeUYHCtYpuiDKfhZE07O4EqpHkBx4NQdtQDbp+aptgHSTuiw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/logger': 2.2.0 - '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/logger': 2.3.1 + '@docusaurus/mdx-loader': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-common': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 10.1.0 @@ -6564,20 +5511,20 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-content-docs/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw==} + /@docusaurus/plugin-content-docs/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-DxztTOBEruv7qFxqUtbsqXeNcHqcVEIEe+NQoI1oi2DBmKBhW/o0MIal8lt+9gvmpx3oYtlwmLOOGepxZgJGkw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/logger': 2.2.0 - '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/logger': 2.3.1 + '@docusaurus/mdx-loader': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/module-type-aliases': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 '@types/react-router-config': 5.0.6 combine-promises: 1.1.0 fs-extra: 10.1.0 @@ -6605,18 +5552,18 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-content-pages/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g==} + /@docusaurus/plugin-content-pages/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-E80UL6hvKm5VVw8Ka8YaVDtO6kWWDVUK4fffGvkpQ/AJQDOg99LwOXKujPoICC22nUFTsZ2Hp70XvpezCsFQaA==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/mdx-loader': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 fs-extra: 10.1.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -6638,16 +5585,16 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-debug/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow==} + /@docusaurus/plugin-debug/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-Ujpml1Ppg4geB/2hyu2diWnO49az9U2bxM9Shen7b6qVcyFisNJTkVG2ocvLC7wM1efTJcUhBO6zAku2vKJGMw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 fs-extra: 10.1.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -6671,16 +5618,16 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-google-analytics/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg==} + /@docusaurus/plugin-google-analytics/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-OHip0GQxKOFU8n7gkt3TM4HOYTXPCFDjqKbMClDD3KaDnyTuMp/Zvd9HSr770lLEscgPWIvzhJByRAClqsUWiQ==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 tslib: 2.4.1 @@ -6700,16 +5647,16 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-google-gtag/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ==} + /@docusaurus/plugin-google-gtag/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-uXtDhfu4+Hm+oqWUySr3DNI5cWC/rmP6XJyAk83Heor3dFjZqDwCbkX8yWPywkRiWev3Dk/rVF8lEn0vIGVocA==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 tslib: 2.4.1 @@ -6729,19 +5676,48 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-sitemap/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg==} + /@docusaurus/plugin-google-tag-manager/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-Ww2BPEYSqg8q8tJdLYPFFM3FMDBCVhEM4UUqKzJaiRMx3NEoly3qqDRAoRDGdIhlC//Rf0iJV9cWAoq2m6k3sw==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/logger': 2.2.0 - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - bufferutil + - csso + - debug + - esbuild + - eslint + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: true + + /@docusaurus/plugin-sitemap/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-8Yxile/v6QGYV9vgFiYL+8d2N4z4Er3pSHsrD08c5XI8bUXxTppMwjarDUTH/TRTfgAWotRbhJ6WZLyajLpozA==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/logger': 2.3.1 + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-common': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 fs-extra: 10.1.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -6763,25 +5739,26 @@ packages: - webpack-cli dev: true - /@docusaurus/preset-classic/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg==} + /@docusaurus/preset-classic/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-OQ5W0AHyfdUk0IldwJ3BlnZ1EqoJuu2L2BMhqLbqwNWdkmzmSUvlFLH1Pe7CZSQgB2YUUC/DnmjbPKk/qQD0lQ==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-debug': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-google-analytics': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-google-gtag': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-sitemap': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/theme-classic': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/theme-search-algolia': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/plugin-content-blog': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-docs': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-pages': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-debug': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-google-analytics': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-google-gtag': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-google-tag-manager': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-sitemap': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-classic': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/theme-search-algolia': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 transitivePeerDependencies: @@ -6813,32 +5790,32 @@ packages: react: 18.2.0 dev: true - /@docusaurus/theme-classic/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg==} + /@docusaurus/theme-classic/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-SelSIDvyttb7ZYHj8vEUhqykhAqfOPKk+uP0z85jH72IMC58e7O8DIlcAeBv+CWsLbNIl9/Hcg71X0jazuxJug==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/theme-translations': 2.2.0 - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/mdx-loader': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/module-type-aliases': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-blog': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-docs': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-pages': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/theme-translations': 2.3.1 + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-common': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 '@mdx-js/react': 1.6.22_react@18.2.0 clsx: 1.2.1 copy-text-to-clipboard: 3.0.1 infima: 0.2.0-alpha.42 lodash: 4.17.21 nprogress: 0.2.0 - postcss: 8.4.19 + postcss: 8.4.21 prism-react-renderer: 1.3.5_react@18.2.0 prismjs: 1.28.0 react: 18.2.0 @@ -6863,19 +5840,19 @@ packages: - webpack-cli dev: true - /@docusaurus/theme-common/2.2.0_if65ga6ul5jnw5c4373drfty5m: - resolution: {integrity: sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw==} + /@docusaurus/theme-common/2.3.1_pmmuy6rkkayfggimpcjiffhloy: + resolution: {integrity: sha512-RYmYl2OR2biO+yhmW1aS5FyEvnrItPINa+0U2dMxcHpah8reSCjQ9eJGRmAgkZFchV1+aIQzXOI1K7LCW38O0g==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: - '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/mdx-loader': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/module-type-aliases': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-blog': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-docs': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/plugin-content-pages': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 '@types/history': 4.7.11 '@types/react': 18.0.26 '@types/react-router-config': 5.0.6 @@ -6884,7 +5861,8 @@ packages: prism-react-renderer: 1.3.5_react@18.2.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - tslib: 2.4.0 + tslib: 2.4.1 + use-sync-external-store: 1.2.0_react@18.2.0 utility-types: 3.10.0 transitivePeerDependencies: - '@docusaurus/types' @@ -6903,25 +5881,58 @@ packages: - webpack-cli dev: true - /@docusaurus/theme-search-algolia/2.2.0_if65ga6ul5jnw5c4373drfty5m: - resolution: {integrity: sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w==} + /@docusaurus/theme-mermaid/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-Hh1I4FSt+5qlrq6dBOgj/klv2Ijmzbn0ysa5XMDHeD6Fa3fK63vvf0KJMR6VzB9VHU8QjMqqAR+n9500/Kq4lw==} + engines: {node: '>=16.14'} + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + dependencies: + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/module-type-aliases': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 + '@mdx-js/react': 1.6.22_react@18.2.0 + mermaid: 9.4.3 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + tslib: 2.4.1 + transitivePeerDependencies: + - '@parcel/css' + - '@swc/core' + - bufferutil + - csso + - debug + - esbuild + - eslint + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + dev: true + + /@docusaurus/theme-search-algolia/2.3.1_pmmuy6rkkayfggimpcjiffhloy: + resolution: {integrity: sha512-JdHaRqRuH1X++g5fEMLnq7OtULSGQdrs9AbhcWRQ428ZB8/HOiaN6mj3hzHvcD3DFgu7koIVtWPQnvnN7iwzHA==} engines: {node: '>=16.14'} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 dependencies: '@docsearch/react': 3.3.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/logger': 2.2.0 - '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y - '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m - '@docusaurus/theme-translations': 2.2.0 - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 - '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/core': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/logger': 2.3.1 + '@docusaurus/plugin-content-docs': 2.3.1_biqbaboplfbrettd7655fr4n2y + '@docusaurus/theme-common': 2.3.1_pmmuy6rkkayfggimpcjiffhloy + '@docusaurus/theme-translations': 2.3.1 + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 + '@docusaurus/utils-validation': 2.3.1_@docusaurus+types@2.3.1 algoliasearch: 4.13.1 algoliasearch-helper: 3.11.1_algoliasearch@4.13.1 clsx: 1.2.1 - eta: 1.12.3 + eta: 2.0.1 fs-extra: 10.1.0 lodash: 4.17.21 react: 18.2.0 @@ -6947,16 +5958,16 @@ packages: - webpack-cli dev: true - /@docusaurus/theme-translations/2.2.0: - resolution: {integrity: sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w==} + /@docusaurus/theme-translations/2.3.1: + resolution: {integrity: sha512-BsBZzAewJabVhoGG1Ij2u4pMS3MPW6gZ6sS4pc+Y7czevRpzxoFNJXRtQDVGe7mOpv/MmRmqg4owDK+lcOTCVQ==} engines: {node: '>=16.14'} dependencies: fs-extra: 10.1.0 tslib: 2.4.1 dev: true - /@docusaurus/types/2.2.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw==} + /@docusaurus/types/2.3.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-PREbIRhTaNNY042qmfSE372Jb7djZt+oVTZkoqHJ8eff8vOIc2zqqDqBVc5BhOfpZGPTrE078yy/torUEZy08A==} peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 @@ -6964,12 +5975,12 @@ packages: '@types/history': 4.7.11 '@types/react': 18.0.26 commander: 5.1.0 - joi: 17.6.0 + joi: 17.7.0 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y utility-types: 3.10.0 - webpack: 5.73.0 + webpack: 5.75.0 webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' @@ -6978,8 +5989,8 @@ packages: - webpack-cli dev: true - /@docusaurus/utils-common/2.2.0_@docusaurus+types@2.2.0: - resolution: {integrity: sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA==} + /@docusaurus/utils-common/2.3.1_@docusaurus+types@2.3.1: + resolution: {integrity: sha512-pVlRpXkdNcxmKNxAaB1ya2hfCEvVsLDp2joeM6K6uv55Oc5nVIqgyYSgSNKZyMdw66NnvMfsu0RBylcwZQKo9A==} engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' @@ -6987,16 +5998,16 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y tslib: 2.4.1 dev: true - /@docusaurus/utils-validation/2.2.0_@docusaurus+types@2.2.0: - resolution: {integrity: sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg==} + /@docusaurus/utils-validation/2.3.1_@docusaurus+types@2.3.1: + resolution: {integrity: sha512-7n0208IG3k1HVTByMHlZoIDjjOFC8sbViHVXJx0r3Q+3Ezrx+VQ1RZ/zjNn6lT+QBCRCXlnlaoJ8ug4HIVgQ3w==} engines: {node: '>=16.14'} dependencies: - '@docusaurus/logger': 2.2.0 - '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0 + '@docusaurus/logger': 2.3.1 + '@docusaurus/utils': 2.3.1_@docusaurus+types@2.3.1 joi: 17.7.0 js-yaml: 4.1.0 tslib: 2.4.1 @@ -7009,8 +6020,8 @@ packages: - webpack-cli dev: true - /@docusaurus/utils/2.2.0_@docusaurus+types@2.2.0: - resolution: {integrity: sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA==} + /@docusaurus/utils/2.3.1_@docusaurus+types@2.3.1: + resolution: {integrity: sha512-9WcQROCV0MmrpOQDXDGhtGMd52DHpSFbKLfkyaYumzbTstrbA5pPOtiGtxK1nqUHkiIv8UwexS54p0Vod2I1lg==} engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' @@ -7018,9 +6029,10 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/logger': 2.2.0 - '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y + '@docusaurus/logger': 2.3.1 + '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y '@svgr/webpack': 6.2.1 + escape-string-regexp: 4.0.0 file-loader: 6.2.0_webpack@5.75.0 fs-extra: 10.1.0 github-slugger: 1.4.0 @@ -7843,7 +6855,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.3 - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@grpc/proto-loader/0.7.3: @@ -11032,13 +10044,13 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/cacheable-request/6.0.3: @@ -11071,14 +10083,14 @@ packages: /@types/connect-history-api-fallback/1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: - '@types/express-serve-static-core': 4.17.29 - '@types/node': 17.0.45 + '@types/express-serve-static-core': 4.17.31 + '@types/node': 18.11.10 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/cookie/0.4.1: @@ -11111,7 +10123,7 @@ packages: /@types/duplexify/3.6.1: resolution: {integrity: sha512-n0zoEj/fMdMOvqbHxmqnza/kXyoGgJmEpsXjpP+gEqE1Ye4yNqc7xWipKnUoMpWhMuzJQSfK2gMrwlElly7OGQ==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/eslint-scope/3.7.3: @@ -11139,14 +10151,6 @@ packages: /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - /@types/express-serve-static-core/4.17.29: - resolution: {integrity: sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==} - dependencies: - '@types/node': 17.0.45 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - dev: true - /@types/express-serve-static-core/4.17.31: resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: @@ -11155,15 +10159,6 @@ packages: '@types/range-parser': 1.2.4 dev: true - /@types/express/4.17.13: - resolution: {integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==} - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.29 - '@types/qs': 6.9.7 - '@types/serve-static': 1.13.10 - dev: true - /@types/express/4.17.15: resolution: {integrity: sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==} dependencies: @@ -11199,7 +10194,7 @@ packages: /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/hast/2.3.4: @@ -11292,7 +10287,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 /@types/linkify-it/3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} @@ -11610,7 +10605,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 /@types/retry/0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -11632,7 +10627,7 @@ packages: /@types/sax/1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/scheduler/0.16.2: @@ -11645,14 +10640,14 @@ packages: /@types/serve-index/1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: - '@types/express': 4.17.13 + '@types/express': 4.17.15 dev: true /@types/serve-static/1.13.10: resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==} dependencies: '@types/mime': 1.3.2 - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/set-cookie-parser/2.4.2: @@ -11678,7 +10673,7 @@ packages: /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/stack-utils/2.0.1: @@ -11688,7 +10683,7 @@ packages: /@types/stoppable/1.1.1: resolution: {integrity: sha512-b8N+fCADRIYYrGZOcmOR8ZNBOqhktWTB/bMUl5LvGtT201QKJZOOH5UsFyI3qtteM6ZAJbJqZoBcLqqxKIwjhw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/testing-library__jest-dom/5.14.5: @@ -11740,7 +10735,7 @@ packages: /@types/ws/8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 dev: true /@types/yargs-parser/21.0.0: @@ -11913,14 +10908,6 @@ packages: '@typescript-eslint/visitor-keys': 5.29.0 dev: true - /@typescript-eslint/scope-manager/5.45.1: - resolution: {integrity: sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.45.1 - '@typescript-eslint/visitor-keys': 5.45.1 - dev: true - /@typescript-eslint/scope-manager/5.47.0: resolution: {integrity: sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -11958,11 +10945,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types/5.45.1: - resolution: {integrity: sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types/5.47.0: resolution: {integrity: sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -12030,8 +11012,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.45.1: - resolution: {integrity: sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==} + /@typescript-eslint/typescript-estree/5.47.0: + resolution: {integrity: sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -12039,8 +11021,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.45.1 - '@typescript-eslint/visitor-keys': 5.45.1 + '@typescript-eslint/types': 5.47.0 + '@typescript-eslint/visitor-keys': 5.47.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -12089,17 +11071,17 @@ packages: - typescript dev: true - /@typescript-eslint/utils/5.45.1: - resolution: {integrity: sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==} + /@typescript-eslint/utils/5.47.0: + resolution: {integrity: sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.45.1 - '@typescript-eslint/types': 5.45.1 - '@typescript-eslint/typescript-estree': 5.45.1 + '@typescript-eslint/scope-manager': 5.47.0 + '@typescript-eslint/types': 5.47.0 + '@typescript-eslint/typescript-estree': 5.47.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0 semver: 7.3.8 @@ -12143,14 +11125,6 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@typescript-eslint/visitor-keys/5.45.1: - resolution: {integrity: sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.45.1 - eslint-visitor-keys: 3.3.0 - dev: true - /@typescript-eslint/visitor-keys/5.47.0: resolution: {integrity: sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -12228,7 +11202,7 @@ packages: /@vercel/node/1.12.1: resolution: {integrity: sha512-NcawIY05BvVkWlsowaxF2hl/hJg475U8JvT2FnGykFPMx31q1/FtqyTw/awSrKfOSRXR0InrbEIDIelmS9NzPA==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 ts-node: 8.9.1_typescript@4.3.4 typescript: 4.3.4 dev: true @@ -12681,8 +11655,10 @@ packages: indent-string: 4.0.0 dev: true - /ajv-formats/2.1.1: + /ajv-formats/2.1.1_ajv@8.11.0: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -13134,22 +12110,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /autoprefixer/10.4.13_postcss@8.4.20: - resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.21.4 - caniuse-lite: 1.0.30001431 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /autoprefixer/10.4.13_postcss@8.4.21: resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} @@ -13164,7 +12124,6 @@ packages: picocolors: 1.0.0 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /autoprefixer/10.4.7_postcss@8.4.14: resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} @@ -13305,21 +12264,6 @@ packages: resolution: {integrity: sha512-Mh1j/rw4xM9T3YICkw22aBQ78FhsHdsmlb9NEk4uVAFBOg+Ez9ZgXXHugoBPCZui3XLomk/7/JBBH4daJqTkQQ==} dev: false - /babel-loader/8.2.5_jzdsusohi23wobhstm6lj7n7ui: - resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.20.2 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.73.0 - dev: true - /babel-loader/8.3.0_la66t7xldg4uecmyawueag5wkm: resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} @@ -13333,7 +12277,6 @@ packages: make-dir: 3.1.0 schema-utils: 2.7.1 webpack: 5.75.0 - dev: false /babel-plugin-add-module-exports/1.0.4: resolution: {integrity: sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==} @@ -13477,19 +12420,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.2: - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.20.10 - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-corejs3/0.5.2: resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==} peerDependencies: @@ -13524,18 +12454,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.2: - resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 - core-js-compat: 3.26.0 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-regenerator/0.3.1: resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} peerDependencies: @@ -13567,17 +12485,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.2: - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-remove-graphql-queries/5.8.0-next.0_7pg6or64vhdsz7wls4jdrjahzm: resolution: {integrity: sha512-emjOEAt/rnb1eGC1ximT3/Rs1i6U6DT2K385uteLPsGsZ8s6fCPvmzm8TLjRM3iWT4LTVc9OBGghkFPCJ8C6Vg==} engines: {node: '>=18.0.0'} @@ -15030,7 +13937,7 @@ packages: engines: {node: '>=12'} dev: true - /copy-webpack-plugin/11.0.0_webpack@5.73.0: + /copy-webpack-plugin/11.0.0_webpack@5.75.0: resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -15042,7 +13949,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.0 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /core-js-compat/3.23.2: @@ -15086,6 +13993,18 @@ packages: object-assign: 4.1.1 vary: 1.1.2 + /cose-base/1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + dependencies: + layout-base: 1.0.2 + dev: true + + /cose-base/2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + dependencies: + layout-base: 2.0.1 + dev: true + /cosmiconfig/6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} @@ -15191,15 +14110,6 @@ packages: postcss: 8.4.19 dev: true - /css-declaration-sorter/6.3.1_postcss@8.4.20: - resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 - dependencies: - postcss: 8.4.20 - dev: true - /css-declaration-sorter/6.3.1_postcss@8.4.21: resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} engines: {node: ^10 || ^12 || >=14} @@ -15207,7 +14117,6 @@ packages: postcss: ^8.0.9 dependencies: postcss: 8.4.21 - dev: false /css-loader/5.2.7_webpack@5.75.0: resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} @@ -15228,21 +14137,21 @@ packages: webpack: 5.75.0 dev: false - /css-loader/6.7.1_webpack@5.73.0: + /css-loader/6.7.1_webpack@5.75.0: resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.19 - postcss: 8.4.19 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.19 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.19 - postcss-modules-scope: 3.0.0_postcss@8.4.19 - postcss-modules-values: 4.0.0_postcss@8.4.19 + icss-utils: 5.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.21 + postcss-modules-local-by-default: 4.0.0_postcss@8.4.21 + postcss-modules-scope: 3.0.0_postcss@8.4.21 + postcss-modules-values: 4.0.0_postcss@8.4.21 postcss-value-parser: 4.2.0 semver: 7.3.8 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /css-minimizer-webpack-plugin/2.0.0_webpack@5.75.0: @@ -15268,7 +14177,7 @@ packages: webpack: 5.75.0 dev: false - /css-minimizer-webpack-plugin/4.0.0_ym7haxui4mhsv4z74sxfalk3f4: + /css-minimizer-webpack-plugin/4.0.0_zut7kw46oefpa7zgeqrbpwozya: resolution: {integrity: sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -15288,13 +14197,13 @@ packages: optional: true dependencies: clean-css: 5.3.0 - cssnano: 5.1.14_postcss@8.4.19 + cssnano: 5.1.14_postcss@8.4.21 jest-worker: 27.5.1 - postcss: 8.4.19 + postcss: 8.4.21 schema-utils: 4.0.0 serialize-javascript: 6.0.0 source-map: 0.6.1 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /css-select/4.3.0: @@ -15351,19 +14260,19 @@ packages: engines: {node: '>=4'} hasBin: true - /cssnano-preset-advanced/5.3.8_postcss@8.4.19: + /cssnano-preset-advanced/5.3.8_postcss@8.4.21: resolution: {integrity: sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - autoprefixer: 10.4.13_postcss@8.4.19 - cssnano-preset-default: 5.2.13_postcss@8.4.19 - postcss: 8.4.19 - postcss-discard-unused: 5.1.0_postcss@8.4.19 - postcss-merge-idents: 5.1.1_postcss@8.4.19 - postcss-reduce-idents: 5.2.0_postcss@8.4.19 - postcss-zindex: 5.1.0_postcss@8.4.19 + autoprefixer: 10.4.13_postcss@8.4.21 + cssnano-preset-default: 5.2.13_postcss@8.4.21 + postcss: 8.4.21 + postcss-discard-unused: 5.1.0_postcss@8.4.21 + postcss-merge-idents: 5.1.1_postcss@8.4.21 + postcss-reduce-idents: 5.2.0_postcss@8.4.21 + postcss-zindex: 5.1.0_postcss@8.4.21 dev: true /cssnano-preset-default/5.2.12_postcss@8.4.14: @@ -15404,44 +14313,6 @@ packages: postcss-unique-selectors: 5.1.1_postcss@8.4.14 dev: true - /cssnano-preset-default/5.2.12_postcss@8.4.20: - resolution: {integrity: sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - css-declaration-sorter: 6.3.1_postcss@8.4.20 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 - postcss-calc: 8.2.4_postcss@8.4.20 - postcss-colormin: 5.3.0_postcss@8.4.20 - postcss-convert-values: 5.1.3_postcss@8.4.20 - postcss-discard-comments: 5.1.2_postcss@8.4.20 - postcss-discard-duplicates: 5.1.0_postcss@8.4.20 - postcss-discard-empty: 5.1.1_postcss@8.4.20 - postcss-discard-overridden: 5.1.0_postcss@8.4.20 - postcss-merge-longhand: 5.1.7_postcss@8.4.20 - postcss-merge-rules: 5.1.3_postcss@8.4.20 - postcss-minify-font-values: 5.1.0_postcss@8.4.20 - postcss-minify-gradients: 5.1.1_postcss@8.4.20 - postcss-minify-params: 5.1.4_postcss@8.4.20 - postcss-minify-selectors: 5.2.1_postcss@8.4.20 - postcss-normalize-charset: 5.1.0_postcss@8.4.20 - postcss-normalize-display-values: 5.1.0_postcss@8.4.20 - postcss-normalize-positions: 5.1.1_postcss@8.4.20 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.20 - postcss-normalize-string: 5.1.0_postcss@8.4.20 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.20 - postcss-normalize-unicode: 5.1.1_postcss@8.4.20 - postcss-normalize-url: 5.1.0_postcss@8.4.20 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.20 - postcss-ordered-values: 5.1.3_postcss@8.4.20 - postcss-reduce-initial: 5.1.1_postcss@8.4.20 - postcss-reduce-transforms: 5.1.0_postcss@8.4.20 - postcss-svgo: 5.1.0_postcss@8.4.20 - postcss-unique-selectors: 5.1.1_postcss@8.4.20 - dev: true - /cssnano-preset-default/5.2.13_postcss@8.4.19: resolution: {integrity: sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -15516,7 +14387,6 @@ packages: postcss-reduce-transforms: 5.1.0_postcss@8.4.21 postcss-svgo: 5.1.0_postcss@8.4.21 postcss-unique-selectors: 5.1.1_postcss@8.4.21 - dev: false /cssnano-utils/3.1.0_postcss@8.4.14: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} @@ -15536,15 +14406,6 @@ packages: postcss: 8.4.19 dev: true - /cssnano-utils/3.1.0_postcss@8.4.20: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - dev: true - /cssnano-utils/3.1.0_postcss@8.4.21: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -15552,7 +14413,6 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.21 - dev: false /cssnano/5.1.12_postcss@8.4.14: resolution: {integrity: sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==} @@ -15566,18 +14426,6 @@ packages: yaml: 1.10.2 dev: true - /cssnano/5.1.12_postcss@8.4.20: - resolution: {integrity: sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-preset-default: 5.2.12_postcss@8.4.20 - lilconfig: 2.0.5 - postcss: 8.4.20 - yaml: 1.10.2 - dev: true - /cssnano/5.1.14_postcss@8.4.19: resolution: {integrity: sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==} engines: {node: ^10 || ^12 || >=14.0} @@ -15600,7 +14448,6 @@ packages: lilconfig: 2.0.6 postcss: 8.4.21 yaml: 1.10.2 - dev: false /csso/4.2.0: resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} @@ -15666,6 +14513,32 @@ packages: - jest dev: false + /cytoscape-cose-bilkent/4.1.0_cytoscape@3.23.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 1.0.3 + cytoscape: 3.23.0 + dev: true + + /cytoscape-fcose/2.2.0_cytoscape@3.23.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 2.2.0 + cytoscape: 3.23.0 + dev: true + + /cytoscape/3.23.0: + resolution: {integrity: sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==} + engines: {node: '>=0.10'} + dependencies: + heap: 0.2.7 + lodash: 4.17.21 + dev: true + /d/1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -15681,7 +14554,6 @@ packages: engines: {node: '>=12'} dependencies: internmap: 2.0.3 - dev: false /d3-axis/1.0.12: resolution: {integrity: sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==} @@ -15690,7 +14562,6 @@ packages: /d3-axis/3.0.0: resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} engines: {node: '>=12'} - dev: false /d3-brush/1.1.6: resolution: {integrity: sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==} @@ -15711,7 +14582,6 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1_d3-selection@3.0.0 - dev: false /d3-chord/1.0.6: resolution: {integrity: sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==} @@ -15725,7 +14595,6 @@ packages: engines: {node: '>=12'} dependencies: d3-path: 3.1.0 - dev: false /d3-collection/1.0.7: resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} @@ -15738,7 +14607,6 @@ packages: /d3-color/3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} - dev: false /d3-contour/1.3.2: resolution: {integrity: sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==} @@ -15751,14 +14619,12 @@ packages: engines: {node: '>=12'} dependencies: d3-array: 3.2.1 - dev: false /d3-delaunay/6.0.2: resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} engines: {node: '>=12'} dependencies: delaunator: 5.0.0 - dev: false /d3-dispatch/1.0.6: resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} @@ -15767,7 +14633,6 @@ packages: /d3-dispatch/3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} - dev: false /d3-drag/1.2.5: resolution: {integrity: sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==} @@ -15782,7 +14647,6 @@ packages: dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 - dev: false /d3-dsv/1.2.0: resolution: {integrity: sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==} @@ -15801,7 +14665,6 @@ packages: commander: 7.2.0 iconv-lite: 0.6.3 rw: 1.3.3 - dev: false /d3-ease/1.0.7: resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} @@ -15810,7 +14673,6 @@ packages: /d3-ease/3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} - dev: false /d3-fetch/1.2.0: resolution: {integrity: sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==} @@ -15823,7 +14685,6 @@ packages: engines: {node: '>=12'} dependencies: d3-dsv: 3.0.1 - dev: false /d3-force/1.2.1: resolution: {integrity: sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==} @@ -15841,7 +14702,6 @@ packages: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 - dev: false /d3-format/1.4.5: resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} @@ -15850,7 +14710,6 @@ packages: /d3-format/3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} - dev: false /d3-geo/1.12.1: resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} @@ -15863,7 +14722,6 @@ packages: engines: {node: '>=12'} dependencies: d3-array: 3.2.1 - dev: false /d3-hierarchy/1.1.9: resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} @@ -15872,7 +14730,6 @@ packages: /d3-hierarchy/3.1.2: resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} engines: {node: '>=12'} - dev: false /d3-interpolate/1.4.0: resolution: {integrity: sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==} @@ -15885,7 +14742,6 @@ packages: engines: {node: '>=12'} dependencies: d3-color: 3.1.0 - dev: false /d3-path/1.0.9: resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} @@ -15894,7 +14750,6 @@ packages: /d3-path/3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} - dev: false /d3-polygon/1.0.6: resolution: {integrity: sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==} @@ -15903,7 +14758,6 @@ packages: /d3-polygon/3.0.1: resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} engines: {node: '>=12'} - dev: false /d3-quadtree/1.0.7: resolution: {integrity: sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==} @@ -15912,7 +14766,6 @@ packages: /d3-quadtree/3.0.1: resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} engines: {node: '>=12'} - dev: false /d3-random/1.1.2: resolution: {integrity: sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==} @@ -15921,7 +14774,6 @@ packages: /d3-random/3.0.1: resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} engines: {node: '>=12'} - dev: false /d3-scale-chromatic/1.5.0: resolution: {integrity: sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==} @@ -15936,7 +14788,6 @@ packages: dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 - dev: false /d3-scale/2.2.2: resolution: {integrity: sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==} @@ -15958,7 +14809,6 @@ packages: d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false /d3-selection/1.4.2: resolution: {integrity: sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==} @@ -15967,7 +14817,6 @@ packages: /d3-selection/3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} - dev: false /d3-shape/1.3.7: resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} @@ -15980,7 +14829,6 @@ packages: engines: {node: '>=12'} dependencies: d3-path: 3.1.0 - dev: false /d3-time-format/2.3.0: resolution: {integrity: sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==} @@ -15993,7 +14841,6 @@ packages: engines: {node: '>=12'} dependencies: d3-time: 3.1.0 - dev: false /d3-time/1.1.0: resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} @@ -16004,7 +14851,6 @@ packages: engines: {node: '>=12'} dependencies: d3-array: 3.2.1 - dev: false /d3-timer/1.0.10: resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} @@ -16013,7 +14859,6 @@ packages: /d3-timer/3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} - dev: false /d3-transition/1.3.2: resolution: {integrity: sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==} @@ -16038,7 +14883,6 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 - dev: false /d3-voronoi/1.1.4: resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} @@ -16063,7 +14907,6 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1_d3-selection@3.0.0 - dev: false /d3/5.16.0: resolution: {integrity: sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==} @@ -16135,7 +14978,49 @@ packages: d3-timer: 3.0.1 d3-transition: 3.0.1_d3-selection@3.0.0 d3-zoom: 3.0.0 - dev: false + + /d3/7.8.2: + resolution: {integrity: sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.1 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.0 + d3-delaunay: 6.0.2 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.0.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.0.0 + d3-selection: 3.0.0 + d3-shape: 3.1.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1_d3-selection@3.0.0 + d3-zoom: 3.0.0 + dev: true + + /dagre-d3-es/7.0.9: + resolution: {integrity: sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==} + dependencies: + d3: 7.8.2 + lodash-es: 4.17.21 + dev: true /dagre-d3/0.6.4: resolution: {integrity: sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==} @@ -16206,6 +15091,10 @@ packages: engines: {node: '>0.4.0'} dev: true + /dayjs/1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + dev: true + /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -16442,7 +15331,6 @@ packages: resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} dependencies: robust-predicates: 3.0.1 - dev: false /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -16523,17 +15411,6 @@ packages: transitivePeerDependencies: - supports-color - /detect-port/1.3.0: - resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} - engines: {node: '>= 4.2.1'} - hasBin: true - dependencies: - address: 1.2.2 - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - dev: true - /detect-port/1.5.1: resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} hasBin: true @@ -16542,7 +15419,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false /devalue/4.2.0: resolution: {integrity: sha512-mbjoAaCL2qogBKgeFxFPOXAUsZchircF+B/79LD4sHH0+NHfYm8gZpQrskKDn5gENGt35+5OI1GUF7hLVnkPDw==} @@ -16722,6 +15598,10 @@ packages: resolution: {integrity: sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg==} dev: false + /dompurify/2.4.3: + resolution: {integrity: sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==} + dev: true + /domutils/1.7.0: resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} dependencies: @@ -16772,6 +15652,11 @@ packages: engines: {node: '>=10'} dev: true + /dotenv/16.0.0: + resolution: {integrity: sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==} + engines: {node: '>=12'} + dev: false + /dotenv/16.0.1: resolution: {integrity: sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==} engines: {node: '>=12'} @@ -16780,6 +15665,7 @@ packages: /dotenv/16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} + dev: true /dotenv/7.0.0: resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} @@ -16864,6 +15750,10 @@ packages: /electron-to-chromium/1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + /elkjs/0.8.2: + resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==} + dev: true + /emittery/0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} @@ -18348,8 +17238,8 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - /eta/1.12.3: - resolution: {integrity: sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==} + /eta/2.0.1: + resolution: {integrity: sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==} engines: {node: '>=6.0.0'} dev: true @@ -18361,7 +17251,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 require-like: 0.1.2 dev: true @@ -18435,7 +17325,7 @@ packages: dependencies: '@apidevtools/json-schema-ref-parser': 9.0.9 ajv: 8.11.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1_ajv@8.11.0 body-parser: 1.20.1 content-type: 1.0.4 deep-freeze: 0.0.1 @@ -18816,17 +17706,6 @@ packages: dependencies: flat-cache: 3.0.4 - /file-loader/6.2.0_webpack@5.73.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.1.1 - webpack: 5.73.0 - dev: true - /file-loader/6.2.0_webpack@5.75.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} @@ -19139,7 +18018,7 @@ packages: webpack: 5.75.0 dev: false - /fork-ts-checker-webpack-plugin/6.5.2_webpack@5.73.0: + /fork-ts-checker-webpack-plugin/6.5.2_webpack@5.75.0: resolution: {integrity: sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -19166,7 +18045,7 @@ packages: schema-utils: 2.7.0 semver: 7.3.8 tapable: 1.1.3 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /form-data-encoder/2.1.4: @@ -20646,6 +19525,10 @@ packages: engines: {node: '>=10.0.0'} dev: true + /heap/0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + /highlight.js/10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true @@ -20763,7 +19646,7 @@ packages: resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} dev: true - /html-webpack-plugin/5.5.0_webpack@5.73.0: + /html-webpack-plugin/5.5.0_webpack@5.75.0: resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: @@ -20774,7 +19657,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /htmlparser2/3.10.1: @@ -20858,7 +19741,7 @@ packages: - supports-color dev: true - /http-proxy-middleware/2.0.6_@types+express@4.17.13: + /http-proxy-middleware/2.0.6_@types+express@4.17.15: resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -20867,7 +19750,7 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.13 + '@types/express': 4.17.15 '@types/http-proxy': 1.17.9 http-proxy: 1.18.1 is-glob: 4.0.3 @@ -20882,7 +19765,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -20965,15 +19848,6 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils/5.1.0_postcss@8.4.19: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.19 - dev: true - /icss-utils/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -20981,7 +19855,6 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.21 - dev: false /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -21176,7 +20049,6 @@ packages: /internmap/2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - dev: false /interpret/1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -23231,7 +22103,7 @@ packages: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.11.10 graceful-fs: 4.2.10 dev: true @@ -23678,16 +22550,6 @@ packages: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} dev: true - /joi/17.6.0: - resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.0 - '@sideway/pinpoint': 2.0.0 - dev: true - /joi/17.7.0: resolution: {integrity: sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==} dependencies: @@ -24091,6 +22953,10 @@ packages: resolution: {integrity: sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==} dev: false + /khroma/2.0.0: + resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} + dev: true + /kind-of/6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -24202,6 +23068,14 @@ packages: package-json: 8.1.0 dev: false + /layout-base/1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + dev: true + + /layout-base/2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + dev: true + /lazystream/1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -24477,6 +23351,10 @@ packages: resolution: {integrity: sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==} dev: false + /lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true + /lodash._objecttypes/2.4.1: resolution: {integrity: sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==} dev: true @@ -25100,6 +23978,27 @@ packages: - jest dev: false + /mermaid/9.4.3: + resolution: {integrity: sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==} + dependencies: + '@braintree/sanitize-url': 6.0.2 + cytoscape: 3.23.0 + cytoscape-cose-bilkent: 4.1.0_cytoscape@3.23.0 + cytoscape-fcose: 2.2.0_cytoscape@3.23.0 + d3: 7.7.0 + dagre-d3-es: 7.0.9 + dayjs: 1.11.7 + dompurify: 2.4.3 + elkjs: 0.8.2 + khroma: 2.0.0 + lodash-es: 4.17.21 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.1.3 + ts-dedent: 2.2.0 + uuid: 9.0.0 + web-worker: 1.2.0 + dev: true + /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -25212,14 +24111,14 @@ packages: webpack-sources: 1.4.3 dev: false - /mini-css-extract-plugin/2.6.1_webpack@5.73.0: + /mini-css-extract-plugin/2.6.1_webpack@5.75.0: resolution: {integrity: sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /minimalistic-assert/1.0.1: @@ -26015,6 +24914,10 @@ packages: engines: {node: '>=6.0.0'} dev: false + /non-layered-tidy-tree-layout/2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + dev: true + /nopt/5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -26987,16 +25890,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-calc/8.2.4_postcss@8.4.20: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 - dependencies: - postcss: 8.4.20 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - dev: true - /postcss-calc/8.2.4_postcss@8.4.21: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: @@ -27005,7 +25898,6 @@ packages: postcss: 8.4.21 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 - dev: false /postcss-cli/9.1.0_postcss@8.4.14: resolution: {integrity: sha512-zvDN2ADbWfza42sAnj+O2uUWyL0eRL1V+6giM2vi4SqTR3gTYy8XzcpfwccayF2szcUif0HMmXiEaDv9iEhcpw==} @@ -27057,19 +25949,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-colormin/5.3.0_postcss@8.4.20: - resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - colord: 2.9.2 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-colormin/5.3.0_postcss@8.4.21: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27081,7 +25960,6 @@ packages: colord: 2.9.2 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-convert-values/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} @@ -27105,17 +25983,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values/5.1.3_postcss@8.4.20: - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-convert-values/5.1.3_postcss@8.4.21: resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27125,7 +25992,6 @@ packages: browserslist: 4.21.4 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-discard-comments/5.1.2_postcss@8.4.14: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} @@ -27145,15 +26011,6 @@ packages: postcss: 8.4.19 dev: true - /postcss-discard-comments/5.1.2_postcss@8.4.20: - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - dev: true - /postcss-discard-comments/5.1.2_postcss@8.4.21: resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27161,7 +26018,6 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.21 - dev: false /postcss-discard-duplicates/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} @@ -27181,15 +26037,6 @@ packages: postcss: 8.4.19 dev: true - /postcss-discard-duplicates/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - dev: true - /postcss-discard-duplicates/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27197,7 +26044,6 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.21 - dev: false /postcss-discard-empty/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} @@ -27217,15 +26063,6 @@ packages: postcss: 8.4.19 dev: true - /postcss-discard-empty/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - dev: true - /postcss-discard-empty/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} @@ -27233,7 +26070,6 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.21 - dev: false /postcss-discard-overridden/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} @@ -27253,15 +26089,6 @@ packages: postcss: 8.4.19 dev: true - /postcss-discard-overridden/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - dev: true - /postcss-discard-overridden/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27269,15 +26096,14 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.21 - dev: false - /postcss-discard-unused/5.1.0_postcss@8.4.19: + /postcss-discard-unused/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.19 + postcss: 8.4.21 postcss-selector-parser: 6.0.10 dev: true @@ -27354,7 +26180,7 @@ packages: webpack: 5.75.0 dev: false - /postcss-loader/7.0.0_n5hdb4sd74eqt3xtblrzrc6vly: + /postcss-loader/7.0.0_6jdsrmfenkuhhw3gx4zvjlznce: resolution: {integrity: sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -27363,19 +26189,19 @@ packages: dependencies: cosmiconfig: 7.0.1 klona: 2.0.5 - postcss: 8.4.20 + postcss: 8.4.21 semver: 7.3.8 - webpack: 5.73.0 + webpack: 5.75.0 dev: true - /postcss-merge-idents/5.1.1_postcss@8.4.19: + /postcss-merge-idents/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.19 - postcss: 8.4.19 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true @@ -27401,17 +26227,6 @@ packages: stylehacks: 5.1.1_postcss@8.4.19 dev: true - /postcss-merge-longhand/5.1.7_postcss@8.4.20: - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - stylehacks: 5.1.1_postcss@8.4.20 - dev: true - /postcss-merge-longhand/5.1.7_postcss@8.4.21: resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -27421,7 +26236,6 @@ packages: postcss: 8.4.21 postcss-value-parser: 4.2.0 stylehacks: 5.1.1_postcss@8.4.21 - dev: false /postcss-merge-rules/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} @@ -27449,19 +26263,6 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-merge-rules/5.1.3_postcss@8.4.20: - resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 - postcss-selector-parser: 6.0.10 - dev: true - /postcss-merge-rules/5.1.3_postcss@8.4.21: resolution: {integrity: sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27473,7 +26274,6 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.21 postcss: 8.4.21 postcss-selector-parser: 6.0.10 - dev: false /postcss-minify-font-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} @@ -27495,16 +26295,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-font-values/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-minify-font-values/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27513,7 +26303,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-minify-gradients/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} @@ -27539,18 +26328,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - colord: 2.9.2 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-minify-gradients/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27561,7 +26338,6 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.21 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-minify-params/5.1.4_postcss@8.4.14: resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} @@ -27587,18 +26363,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params/5.1.4_postcss@8.4.20: - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-minify-params/5.1.4_postcss@8.4.21: resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} @@ -27609,7 +26373,6 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.21 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-minify-selectors/5.2.1_postcss@8.4.14: resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} @@ -27631,16 +26394,6 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-minify-selectors/5.2.1_postcss@8.4.20: - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-selector-parser: 6.0.10 - dev: true - /postcss-minify-selectors/5.2.1_postcss@8.4.21: resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27649,16 +26402,6 @@ packages: dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.10 - dev: false - - /postcss-modules-extract-imports/3.0.0_postcss@8.4.19: - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.19 - dev: true /postcss-modules-extract-imports/3.0.0_postcss@8.4.21: resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} @@ -27667,19 +26410,6 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.21 - dev: false - - /postcss-modules-local-by-default/4.0.0_postcss@8.4.19: - resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.19 - postcss: 8.4.19 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - dev: true /postcss-modules-local-by-default/4.0.0_postcss@8.4.21: resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} @@ -27691,17 +26421,6 @@ packages: postcss: 8.4.21 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 - dev: false - - /postcss-modules-scope/3.0.0_postcss@8.4.19: - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.19 - postcss-selector-parser: 6.0.10 - dev: true /postcss-modules-scope/3.0.0_postcss@8.4.21: resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} @@ -27711,17 +26430,6 @@ packages: dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.10 - dev: false - - /postcss-modules-values/4.0.0_postcss@8.4.19: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.19 - postcss: 8.4.19 - dev: true /postcss-modules-values/4.0.0_postcss@8.4.21: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} @@ -27731,7 +26439,6 @@ packages: dependencies: icss-utils: 5.1.0_postcss@8.4.21 postcss: 8.4.21 - dev: false /postcss-nested/5.0.6_postcss@8.4.14: resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.com/postcss-nested/-/postcss-nested-5.0.6.tgz} @@ -27771,15 +26478,6 @@ packages: postcss: 8.4.19 dev: true - /postcss-normalize-charset/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - dev: true - /postcss-normalize-charset/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27787,7 +26485,6 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.21 - dev: false /postcss-normalize-display-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} @@ -27809,16 +26506,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-display-values/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-display-values/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} @@ -27827,7 +26514,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-normalize-positions/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} @@ -27849,16 +26535,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-positions/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27867,7 +26543,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-normalize-repeat-style/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} @@ -27889,16 +26564,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} @@ -27907,7 +26572,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-normalize-string/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} @@ -27929,16 +26593,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-string/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} @@ -27947,7 +26601,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-normalize-timing-functions/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} @@ -27969,16 +26622,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} @@ -27987,7 +26630,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-normalize-unicode/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} @@ -28011,17 +26653,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-unicode/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} @@ -28031,7 +26662,6 @@ packages: browserslist: 4.21.4 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-normalize-url/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} @@ -28055,17 +26685,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - normalize-url: 6.1.0 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-url/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} @@ -28075,7 +26694,6 @@ packages: normalize-url: 6.1.0 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-normalize-whitespace/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} @@ -28097,16 +26715,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-whitespace/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} @@ -28115,7 +26723,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-ordered-values/5.1.3_postcss@8.4.14: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} @@ -28139,17 +26746,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-ordered-values/5.1.3_postcss@8.4.20: - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-utils: 3.1.0_postcss@8.4.20 - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-ordered-values/5.1.3_postcss@8.4.21: resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -28159,15 +26755,14 @@ packages: cssnano-utils: 3.1.0_postcss@8.4.21 postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false - /postcss-reduce-idents/5.2.0_postcss@8.4.19: + /postcss-reduce-idents/5.2.0_postcss@8.4.21: resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.19 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true @@ -28193,17 +26788,6 @@ packages: postcss: 8.4.19 dev: true - /postcss-reduce-initial/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - caniuse-api: 3.0.0 - postcss: 8.4.20 - dev: true - /postcss-reduce-initial/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==} engines: {node: ^10 || ^12 || >=14.0} @@ -28213,7 +26797,6 @@ packages: browserslist: 4.21.4 caniuse-api: 3.0.0 postcss: 8.4.21 - dev: false /postcss-reduce-transforms/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} @@ -28235,16 +26818,6 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-reduce-transforms/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - dev: true - /postcss-reduce-transforms/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} @@ -28253,7 +26826,6 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /postcss-reporter/7.0.5_postcss@8.4.14: resolution: {integrity: sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==} @@ -28273,13 +26845,13 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-sort-media-queries/4.2.1_postcss@8.4.19: + /postcss-sort-media-queries/4.2.1_postcss@8.4.21: resolution: {integrity: sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.4.4 dependencies: - postcss: 8.4.19 + postcss: 8.4.21 sort-css-media-queries: 2.0.4 dev: true @@ -28305,17 +26877,6 @@ packages: svgo: 2.8.0 dev: true - /postcss-svgo/5.1.0_postcss@8.4.20: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-value-parser: 4.2.0 - svgo: 2.8.0 - dev: true - /postcss-svgo/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} @@ -28325,7 +26886,6 @@ packages: postcss: 8.4.21 postcss-value-parser: 4.2.0 svgo: 2.8.0 - dev: false /postcss-unique-selectors/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} @@ -28347,16 +26907,6 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /postcss-unique-selectors/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.20 - postcss-selector-parser: 6.0.10 - dev: true - /postcss-unique-selectors/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} @@ -28365,7 +26915,6 @@ packages: dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.10 - dev: false /postcss-url/10.1.3_postcss@8.4.19: resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} @@ -28383,13 +26932,13 @@ packages: /postcss-value-parser/4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss-zindex/5.1.0_postcss@8.4.19: + /postcss-zindex/5.1.0_postcss@8.4.21: resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.19 + postcss: 8.4.21 dev: true /postcss/8.4.14: @@ -28425,7 +26974,6 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false /postgres-array/2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} @@ -28935,7 +27483,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 17.0.45 + '@types/node': 18.11.10 long: 5.2.1 dev: true @@ -29180,7 +27728,7 @@ packages: - vue-template-compiler dev: false - /react-dev-utils/12.0.1_webpack@5.73.0: + /react-dev-utils/12.0.1_webpack@5.75.0: resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -29199,7 +27747,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.2_webpack@5.73.0 + fork-ts-checker-webpack-plugin: 6.5.2_webpack@5.75.0 global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -29214,7 +27762,7 @@ packages: shell-quote: 1.7.3 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.73.0 + webpack: 5.75.0 transitivePeerDependencies: - eslint - supports-color @@ -29294,7 +27842,7 @@ packages: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: true - /react-loadable-ssr-addon-v5-slorber/1.0.1_pobh4rnr4unizsdzh3gmmsgqtu: + /react-loadable-ssr-addon-v5-slorber/1.0.1_pwfl7zyferpbeh35vaepqxwaky: resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} engines: {node: '>=10.13.0'} peerDependencies: @@ -29303,7 +27851,7 @@ packages: dependencies: '@babel/runtime': 7.20.13 react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /react-marquee-slider/1.1.5_styled-components@5.3.6: @@ -29917,7 +28465,6 @@ packages: /robust-predicates/3.0.1: resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} - dev: false /rollup-plugin-terser/7.0.2_rollup@2.79.1: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} @@ -30030,7 +28577,7 @@ packages: dependencies: find-up: 5.0.0 picocolors: 1.0.0 - postcss: 8.4.19 + postcss: 8.4.21 strip-json-comments: 3.1.1 dev: true @@ -30045,7 +28592,6 @@ packages: /rw/1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false /rxjs/6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} @@ -30157,7 +28703,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1_ajv@8.11.0 ajv-keywords: 5.1.0_ajv@8.11.0 dev: true @@ -31386,17 +29932,6 @@ packages: postcss-selector-parser: 6.0.10 dev: true - /stylehacks/5.1.1_postcss@8.4.20: - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.4 - postcss: 8.4.20 - postcss-selector-parser: 6.0.10 - dev: true - /stylehacks/5.1.1_postcss@8.4.21: resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} @@ -31406,11 +29941,9 @@ packages: browserslist: 4.21.4 postcss: 8.4.21 postcss-selector-parser: 6.0.10 - dev: false /stylis/4.1.3: resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} - dev: false /sublevel-pouchdb/8.0.1: resolution: {integrity: sha512-IPbDh2meYVOorQwYuRgKCXsfemfy4UtQ920pq/b01W71n1yls/8BvAJTTmJjkWQ2szIXNCTXzflCOscCQ03M1w==} @@ -31885,54 +30418,6 @@ packages: supports-hyperlinks: 2.2.0 dev: true - /terser-webpack-plugin/5.3.3_webpack@5.73.0: - resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - jest-worker: 27.5.1 - schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - terser: 5.16.1 - webpack: 5.73.0 - dev: true - - /terser-webpack-plugin/5.3.6_webpack@5.73.0: - resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - jest-worker: 27.5.1 - schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - terser: 5.16.1 - webpack: 5.73.0 - dev: true - /terser-webpack-plugin/5.3.6_webpack@5.75.0: resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} @@ -32241,6 +30726,11 @@ packages: resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} dev: false + /ts-dedent/2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + /ts-interface-checker/0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true @@ -32338,10 +30828,6 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: true - /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} @@ -33184,23 +31670,6 @@ packages: resolution: {integrity: sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw==} dev: true - /url-loader/4.1.1_ljnyroaqobwke7fusd7ro2cgzm: - resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - file-loader: '*' - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true - dependencies: - file-loader: 6.2.0_webpack@5.73.0 - loader-utils: 2.0.4 - mime-types: 2.1.35 - schema-utils: 3.1.1 - webpack: 5.73.0 - dev: true - /url-loader/4.1.1_p5dl6emkcwslbw72e37w4ug7em: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} @@ -33257,6 +31726,14 @@ packages: use-isomorphic-layout-effect: 1.1.2_react@18.2.0 dev: true + /use-sync-external-store/1.2.0_react@18.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: true + /utf-8-validate/5.0.9: resolution: {integrity: sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==} engines: {node: '>=6.14.2'} @@ -33848,6 +32325,10 @@ packages: engines: {node: '>= 8'} dev: true + /web-worker/1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + dev: true + /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -33904,7 +32385,7 @@ packages: webpack: 5.75.0 dev: false - /webpack-dev-middleware/5.3.3_webpack@5.73.0: + /webpack-dev-middleware/5.3.3_webpack@5.75.0: resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -33915,10 +32396,10 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.73.0 + webpack: 5.75.0 dev: true - /webpack-dev-server/4.11.1_webpack@5.73.0: + /webpack-dev-server/4.11.1_webpack@5.75.0: resolution: {integrity: sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==} engines: {node: '>= 12.13.0'} hasBin: true @@ -33931,7 +32412,7 @@ packages: dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.13 + '@types/express': 4.17.15 '@types/serve-index': 1.9.1 '@types/serve-static': 1.13.10 '@types/sockjs': 0.3.33 @@ -33946,7 +32427,7 @@ packages: express: 4.18.2 graceful-fs: 4.2.10 html-entities: 2.3.3 - http-proxy-middleware: 2.0.6_@types+express@4.17.13 + http-proxy-middleware: 2.0.6_@types+express@4.17.15 ipaddr.js: 2.0.1 open: 8.4.0 p-retry: 4.6.2 @@ -33956,8 +32437,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.73.0 - webpack-dev-middleware: 5.3.3_webpack@5.73.0 + webpack: 5.75.0 + webpack-dev-middleware: 5.3.3_webpack@5.75.0 ws: 8.11.0 transitivePeerDependencies: - bufferutil @@ -33991,46 +32472,6 @@ packages: /webpack-virtual-modules/0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - /webpack/5.73.0: - resolution: {integrity: sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.3 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.1 - acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.12.0 - es-module-lexer: 0.9.3 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.1.1 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.6_webpack@5.73.0 - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - /webpack/5.75.0: resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} @@ -34070,7 +32511,7 @@ packages: - esbuild - uglify-js - /webpackbar/5.0.2_webpack@5.73.0: + /webpackbar/5.0.2_webpack@5.75.0: resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} engines: {node: '>=12'} peerDependencies: @@ -34080,7 +32521,7 @@ packages: consola: 2.15.3 pretty-time: 1.1.0 std-env: 3.3.1 - webpack: 5.73.0 + webpack: 5.75.0 dev: true /websocket-driver/0.7.4: From 1d9b9ba47c12b815623c0fadd980c50cb1d04322 Mon Sep 17 00:00:00 2001 From: Lluis Agusti <hi@llu.lu> Date: Wed, 22 Mar 2023 03:26:52 +0900 Subject: [PATCH 48/80] docs(adapters): source content + overview (#7023) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(adapters): source content + overview * Apply suggestions from code review * add adapter packages as docs dependencies * clean up docusaurus config * clean up database overview * fix some links --------- Co-authored-by: Balázs Orbán <info@balazsorban.com> --- .../docs/reference/06-adapters/00-overview.md | 10 - docs/docs/reference/06-adapters/mikro-orm.md | 113 ------ docs/docs/reference/06-adapters/neo4j.md | 115 ------- docs/docs/reference/06-adapters/sequelize.md | 86 ----- docs/docs/reference/06-adapters/supabase.md | 309 ----------------- .../reference/06-adapters/upstash-redis.md | 67 ---- docs/docs/reference/06-adapters/xata.md | 239 ------------- .../{06-adapters => adapters}/_category_.json | 0 .../01-models.md => adapters/index.md} | 87 ++++- docs/docusaurus.config.js | 94 ++--- docs/sidebars.js | 18 +- docs/src/css/adapters.css | 39 +++ docs/src/css/index.css | 3 +- docs/static/img/adapters/dgraph.png | Bin 0 -> 7954 bytes docs/static/img/adapters/fauna.png | Bin 0 -> 4788 bytes docs/static/img/adapters/fauna.svg | 10 +- docs/static/img/adapters/mikro-orm.png | Bin 0 -> 883 bytes docs/static/img/adapters/mongodb.svg | 4 +- packages/adapter-dgraph/src/index.ts | 20 +- packages/adapter-dynamodb/src/index.ts | 13 +- packages/adapter-fauna/src/index.ts | 4 +- packages/adapter-firebase/src/index.ts | 15 +- packages/adapter-mikro-orm/src/index.ts | 124 ++++++- packages/adapter-mongodb/src/index.ts | 14 +- packages/adapter-neo4j/src/index.ts | 124 +++++++ packages/adapter-pouchdb/src/index.ts | 6 +- packages/adapter-prisma/src/index.ts | 8 +- packages/adapter-sequelize/src/index.ts | 104 +++++- packages/adapter-supabase/src/index.ts | 324 +++++++++++++++++- .../docs/tutorials/typeorm-custom-models.md | 130 ------- packages/adapter-typeorm-legacy/src/index.ts | 10 +- packages/adapter-upstash-redis/src/index.ts | 103 ++++++ packages/adapter-xata/src/index.ts | 236 +++++++++++++ turbo.json | 8 +- 34 files changed, 1223 insertions(+), 1214 deletions(-) delete mode 100644 docs/docs/reference/06-adapters/00-overview.md delete mode 100644 docs/docs/reference/06-adapters/mikro-orm.md delete mode 100644 docs/docs/reference/06-adapters/neo4j.md delete mode 100644 docs/docs/reference/06-adapters/sequelize.md delete mode 100644 docs/docs/reference/06-adapters/supabase.md delete mode 100644 docs/docs/reference/06-adapters/upstash-redis.md delete mode 100644 docs/docs/reference/06-adapters/xata.md rename docs/docs/reference/{06-adapters => adapters}/_category_.json (100%) rename docs/docs/reference/{06-adapters/01-models.md => adapters/index.md} (59%) create mode 100644 docs/src/css/adapters.css create mode 100644 docs/static/img/adapters/dgraph.png create mode 100644 docs/static/img/adapters/fauna.png create mode 100644 docs/static/img/adapters/mikro-orm.png delete mode 100644 packages/adapter-typeorm-legacy/docs/tutorials/typeorm-custom-models.md diff --git a/docs/docs/reference/06-adapters/00-overview.md b/docs/docs/reference/06-adapters/00-overview.md deleted file mode 100644 index eede1aba..00000000 --- a/docs/docs/reference/06-adapters/00-overview.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Overview ---- - -Auth.js / NextAuth.js database adapters. - - -:::warning -Auth.js (`@auth/*`) support is experimental. -::: \ No newline at end of file diff --git a/docs/docs/reference/06-adapters/mikro-orm.md b/docs/docs/reference/06-adapters/mikro-orm.md deleted file mode 100644 index 53934e53..00000000 --- a/docs/docs/reference/06-adapters/mikro-orm.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -id: mikro-orm -title: MikroORM ---- - -To use this Adapter, you need to install Mikro ORM, the driver that suits your database, and the separate `@next-auth/mikro-orm-adapter` package: - -```bash npm2yarn -npm install next-auth @next-auth/mikro-orm-adapter @mikro-orm/core @mikro-orm/[YOUR DRIVER] -``` - -Configure Auth.js to use the MikroORM Adapter: - -```typescript title="pages/api/auth/[...nextauth].ts" -import NextAuth from "next-auth" -import { MikroOrmAdapter } from "@next-auth/mikro-orm-adapter" - -export default NextAuth({ - adapter: MikroOrmAdapter({ - // MikroORM options object. Ref: https://mikro-orm.io/docs/next/configuration#driver - dbName: "./db.sqlite", - type: "sqlite", - debug: process.env.DEBUG === "true" || process.env.DEBUG?.includes("db"), - }), - providers: [], -}) -``` - -## Setup - -### Passing custom entities - -The MikroORM adapter ships with its own set of entities. If you'd like to extend them, you can optionally pass them to the adapter. - -> This schema is adapted for use in MikroORM and based upon our main [schema](/reference/adapters/models) - -```typescript title="pages/api/auth/[...nextauth].ts" -import config from "config/mikro-orm.ts" -import { - Cascade, - Collection, - Entity, - OneToMany, - PrimaryKey, - Property, - Unique, -} from "@mikro-orm/core" -import { defaultEntities } from "@next-auth/mikro-orm-adapter" - -const { Account, Session } = defaultEntities - -@Entity() -export class User implements defaultEntities.User { - @PrimaryKey() - id: string = randomUUID() - - @Property({ nullable: true }) - name?: string - - @Property({ nullable: true }) - @Unique() - email?: string - - @Property({ type: "Date", nullable: true }) - emailVerified: Date | null = null - - @Property({ nullable: true }) - image?: string - - @OneToMany({ - entity: () => Session, - mappedBy: (session) => session.user, - hidden: true, - orphanRemoval: true, - cascade: [Cascade.ALL], - }) - sessions = new Collection<Session>(this) - - @OneToMany({ - entity: () => Account, - mappedBy: (account) => account.user, - hidden: true, - orphanRemoval: true, - cascade: [Cascade.ALL], - }) - accounts = new Collection<Account>(this) - - @Enum({ hidden: true }) - role = "ADMIN" -} - -export default NextAuth({ - adapter: MikroOrmAdapter(config, { entities: { User } }), -}) -``` - -### Including the default entities in your MikroORM config - -You may want to include the defaultEntities in your MikroORM configuration to include them in Migrations etc. - -To achieve that include them in your "entities" array: - -```typescript title="config/mikro-orm.ts" -import { Options } from "@mikro-orm/core"; -import { defaultEntities } from "@next-auth/mikro-orm-adapter" - -const config: Options = { - ... - entities: [VeryImportantEntity, ...Object.values(defaultEntities)], -}; - -export default config; -``` diff --git a/docs/docs/reference/06-adapters/neo4j.md b/docs/docs/reference/06-adapters/neo4j.md deleted file mode 100644 index e699302e..00000000 --- a/docs/docs/reference/06-adapters/neo4j.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -id: neo4j -title: Neo4j ---- - -This is the Neo4j Adapter for [`next-auth`](https://authjs.dev). This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. - -## Getting Started - -1. Install the necessary packages - -```bash npm2yarn -npm install next-auth @next-auth/neo4j-adapter neo4j-driver -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```javascript title="pages/api/auth/[...nextauth].js" -import neo4j from "neo4j-driver" -import { Neo4jAdapter } from "@next-auth/neo4j-adapter" - -const driver = neo4j.driver( - "bolt://localhost", - neo4j.auth.basic("neo4j", "password") -) - -const neo4jSession = driver.session() - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [], - adapter: Neo4jAdapter(neo4jSession), - ... -}) -``` - -## Schema - -### Node labels - -The following node labels are used. - -- User -- Account -- Session -- VerificationToken - -### Relationships - -The following relationships and relationship labels are used. - -- (:User)-[:HAS_ACCOUNT]->(:Account) -- (:User)-[:HAS_SESSION]->(:Session) - -### Properties - -This schema is adapted for use in Neo4J and is based upon our main [models](/reference/adapters/models). Please check there for the node properties. Relationships have no properties. - -### Indexes - -Optimum indexes will vary on your edition of Neo4j i.e. community or enterprise, and in case you have your own additional data on the nodes. Below are basic suggested indexes. - -1. For **both** Community Edition & Enterprise Edition create constraints and indexes - -```cypher - -CREATE CONSTRAINT user_id_constraint IF NOT EXISTS -ON (u:User) ASSERT u.id IS UNIQUE; - -CREATE INDEX user_id_index IF NOT EXISTS -FOR (u:User) ON (u.id); - -CREATE INDEX user_email_index IF NOT EXISTS -FOR (u:User) ON (u.email); - -CREATE CONSTRAINT session_session_token_constraint IF NOT EXISTS -ON (s:Session) ASSERT s.sessionToken IS UNIQUE; - -CREATE INDEX session_session_token_index IF NOT EXISTS -FOR (s:Session) ON (s.sessionToken); -``` - -2.a. For Community Edition **only** create single-property indexes - -```cypher -CREATE INDEX account_provider_index IF NOT EXISTS -FOR (a:Account) ON (a.provider); - -CREATE INDEX account_provider_account_id_index IF NOT EXISTS -FOR (a:Account) ON (a.providerAccountId); - -CREATE INDEX verification_token_identifier_index IF NOT EXISTS -FOR (v:VerificationToken) ON (v.identifier); - -CREATE INDEX verification_token_token_index IF NOT EXISTS -FOR (v:VerificationToken) ON (v.token); -``` - -2.b. For Enterprise Edition **only** create composite node key constraints and indexes - -```cypher -CREATE CONSTRAINT account_provider_composite_constraint IF NOT EXISTS -ON (a:Account) ASSERT (a.provider, a.providerAccountId) IS NODE KEY; - -CREATE INDEX account_provider_composite_index IF NOT EXISTS -FOR (a:Account) ON (a.provider, a.providerAccountId); - -CREATE CONSTRAINT verification_token_composite_constraint IF NOT EXISTS -ON (v:VerificationToken) ASSERT (v.identifier, v.token) IS NODE KEY; - -CREATE INDEX verification_token_composite_index IF NOT EXISTS -FOR (v:VerificationToken) ON (v.identifier, v.token); -``` diff --git a/docs/docs/reference/06-adapters/sequelize.md b/docs/docs/reference/06-adapters/sequelize.md deleted file mode 100644 index 05020a29..00000000 --- a/docs/docs/reference/06-adapters/sequelize.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -id: sequelize -title: Sequelize ---- - -This is the Sequelize Adapter for [`next-auth`](https://authjs.dev). - -## Getting Started - -1. Install the necessary packages - -```bash npm2yarn -npm install next-auth @next-auth/sequelize-adapter sequelize -``` - -:::warning -You'll also have to manually install [the driver for your database](https://sequelize.org/master/manual/getting-started.html) of choice. -::: - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import SequelizeAdapter from "@next-auth/sequelize-adapter" -import { Sequelize } from "sequelize" - -// https://sequelize.org/master/manual/getting-started.html#connecting-to-a-database -const sequelize = new Sequelize("yourconnectionstring") - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-config -export default NextAuth({ - // https://authjs.dev/reference/providers/ - providers: [], - adapter: SequelizeAdapter(sequelize), -}) -``` - -## Updating the database schema - -By default, the sequelize adapter will not create tables in your database. In production, best practice is to create the [required tables](https://authjs.dev/reference/adapters/models) in your database via [migrations](https://sequelize.org/master/manual/migrations.html). In development, you are able to call [`sequelize.sync()`](https://sequelize.org/master/manual/model-basics.html#model-synchronization) to have sequelize create the necessary tables, foreign keys and indexes: - -> This schema is adapted for use in Sequelize and based upon our main [schema](/reference/adapters/models) - -```js -import NextAuth from "next-auth" -import SequelizeAdapter from "@next-auth/sequelize-adapter" -import Sequelize from 'sequelize' - -const sequelize = new Sequelize("sqlite::memory:") -const adapter = SequelizeAdapter(sequelize) - -// Calling sync() is not recommended in production -sequelize.sync() - -export default NextAuth({ - ... - adapter - ... -}) -``` - -## Using custom models - -Sequelize models are option to customization like so: - -```js -import NextAuth from "next-auth" -import SequelizeAdapter, { models } from "@next-auth/sequelize-adapter" -import Sequelize, { DataTypes } from "sequelize" - -const sequelize = new Sequelize("sqlite::memory:") - -export default NextAuth({ - // https://authjs.dev/reference/providers/ - providers: [], - adapter: SequelizeAdapter(sequelize, { - models: { - User: sequelize.define("user", { - ...models.User, - phoneNumber: DataTypes.STRING, - }), - }, - }), -}) -``` diff --git a/docs/docs/reference/06-adapters/supabase.md b/docs/docs/reference/06-adapters/supabase.md deleted file mode 100644 index f680f47d..00000000 --- a/docs/docs/reference/06-adapters/supabase.md +++ /dev/null @@ -1,309 +0,0 @@ ---- -id: supabase -title: Supabase ---- - -# Supabase - -This is the Supabase Adapter for [`next-auth`](https://authjs.dev). This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. - -:::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. - -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). -::: - -## Getting Started - -1. Install `@supabase/supabase-js`, `next-auth` and `@next-auth/supabase-adapter`. - -```bash npm2yarn2pnpm -npm install @supabase/supabase-js next-auth @next-auth/supabase-adapter -``` - -2. Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. - -```js title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import { SupabaseAdapter } from "@next-auth/supabase-adapter" - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-config -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [...], - adapter: SupabaseAdapter({ - url: process.env.NEXT_PUBLIC_SUPABASE_URL, - secret: process.env.SUPABASE_SERVICE_ROLE_KEY, - }), - // ... -}) -``` - -## Setup - -### Create the `next_auth` schema in Supabase - -Setup your database as described in our main [schema](/reference/adapters/models), by copying the SQL schema below in the Supabase [SQL Editor](https://app.supabase.com/project/_/sql). - -Alternatively you can select the NextAuth Quickstart card on the [SQL Editor page](https://app.supabase.com/project/_/sql), or [create a migration with the Supabase CLI](https://supabase.com/docs/guides/cli/local-development#database-migrations?utm_source=authjs-docs&medium=referral&campaign=authjs). - -```sql --- --- Name: next_auth; Type: SCHEMA; --- -CREATE SCHEMA next_auth; - -GRANT USAGE ON SCHEMA next_auth TO service_role; -GRANT ALL ON SCHEMA next_auth TO postgres; - --- --- Create users table --- -CREATE TABLE IF NOT EXISTS next_auth.users -( - id uuid NOT NULL DEFAULT uuid_generate_v4(), - name text, - email text, - "emailVerified" timestamp with time zone, - image text, - CONSTRAINT users_pkey PRIMARY KEY (id), - CONSTRAINT email_unique UNIQUE (email) -); - -GRANT ALL ON TABLE next_auth.users TO postgres; -GRANT ALL ON TABLE next_auth.users TO service_role; - ---- uid() function to be used in RLS policies -CREATE FUNCTION next_auth.uid() RETURNS uuid - LANGUAGE sql STABLE - AS $$ - select - coalesce( - nullif(current_setting('request.jwt.claim.sub', true), ''), - (nullif(current_setting('request.jwt.claims', true), '')::jsonb ->> 'sub') - )::uuid -$$; - --- --- Create sessions table --- -CREATE TABLE IF NOT EXISTS next_auth.sessions -( - id uuid NOT NULL DEFAULT uuid_generate_v4(), - expires timestamp with time zone NOT NULL, - "sessionToken" text NOT NULL, - "userId" uuid, - CONSTRAINT sessions_pkey PRIMARY KEY (id), - CONSTRAINT sessionToken_unique UNIQUE ("sessionToken"), - CONSTRAINT "sessions_userId_fkey" FOREIGN KEY ("userId") - REFERENCES next_auth.users (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE CASCADE -); - -GRANT ALL ON TABLE next_auth.sessions TO postgres; -GRANT ALL ON TABLE next_auth.sessions TO service_role; - --- --- Create accounts table --- -CREATE TABLE IF NOT EXISTS next_auth.accounts -( - id uuid NOT NULL DEFAULT uuid_generate_v4(), - type text NOT NULL, - provider text NOT NULL, - "providerAccountId" text NOT NULL, - refresh_token text, - access_token text, - expires_at bigint, - token_type text, - scope text, - id_token text, - session_state text, - oauth_token_secret text, - oauth_token text, - "userId" uuid, - CONSTRAINT accounts_pkey PRIMARY KEY (id), - CONSTRAINT provider_unique UNIQUE (provider, "providerAccountId"), - CONSTRAINT "accounts_userId_fkey" FOREIGN KEY ("userId") - REFERENCES next_auth.users (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE CASCADE -); - -GRANT ALL ON TABLE next_auth.accounts TO postgres; -GRANT ALL ON TABLE next_auth.accounts TO service_role; - --- --- Create verification_tokens table --- -CREATE TABLE IF NOT EXISTS next_auth.verification_tokens -( - identifier text, - token text, - expires timestamp with time zone NOT NULL, - CONSTRAINT verification_tokens_pkey PRIMARY KEY (token), - CONSTRAINT token_unique UNIQUE (token), - CONSTRAINT token_identifier_unique UNIQUE (token, identifier) -); - -GRANT ALL ON TABLE next_auth.verification_tokens TO postgres; -GRANT ALL ON TABLE next_auth.verification_tokens TO service_role; -``` - -### Expose the `next_auth` schema in Supabase - -Expose the `next_auth` schema via the Serverless API in the [API settings](https://app.supabase.com/project/_/settings/api) by adding `next_auth` to the "Exposed schemas" list. - -When developing locally add `next_auth` to the `schemas` array in the `config.toml` file in the `supabase` folder that was generated by the [Supabase CLI](https://supabase.com/docs/guides/cli/local-development#initialize-your-project?utm_source=authjs-docs&medium=referral&campaign=authjs). - -## Enabling Row Level Security (RLS) - -Postgres provides a powerful feature called [Row Level Security (RLS)](https://supabase.com/docs/guides/auth/row-level-security?utm_source=authjs-docs&medium=referral&campaign=authjs) to limit access to data. - -This works by sending a signed JWT to your [Supabase Serverless API](https://supabase.com/docs/guides/api?utm_source=authjs-docs&medium=referral&campaign=authjs). There is two steps to make this work with NextAuth: - -### 1. Generate the Supabase `access_token` JWT in the session callback - -To sign the JWT use the `jsonwebtoken` package: - -```bash npm2yarn2pnpm -npm install jsonwebtoken -``` - -Using the [NexthAuth Session callback](/reference/configuration/auth-config#callbacks) create the Supabase `access_token` and append it to the `session` object. - -To sign the JWT use the Supabase JWT secret which can be found in the [API settings](https://app.supabase.com/project/_/settings/api) - -```js title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import { SupabaseAdapter } from "@next-auth/supabase-adapter" -import jwt from "jsonwebtoken" - -// For more information on each option (and a full list of options) go to -// https://authjs.dev/reference/configuration/auth-options -export default NextAuth({ - // https://authjs.dev/reference/providers/oauth-builtin - providers: [...], - adapter: SupabaseAdapter({ - url: process.env.NEXT_PUBLIC_SUPABASE_URL, - secret: process.env.SUPABASE_SERVICE_ROLE_KEY, - }), - callbacks: { - async session({ session, user }) { - const signingSecret = process.env.SUPABASE_JWT_SECRET - if (signingSecret) { - const payload = { - aud: "authenticated", - exp: Math.floor(new Date(session.expires).getTime() / 1000), - sub: user.id, - email: user.email, - role: "authenticated", - } - session.supabaseAccessToken = jwt.sign(payload, signingSecret) - } - return session - }, - }, - // ... -}) -``` - -### 2. Inject the Supabase `access_token` JWT into the Supabase Client - -For example, given the following public schema: - -```sql -/** -* USERS -* Note: This table contains user data. Users should only be able to view and update their own data. -*/ -create table users ( - -- UUID from next_auth.users - id uuid not null primary key, - name text, - email text, - image text, - constraint "users_id_fkey" foreign key ("id") - references next_auth.users (id) match simple - on update no action - on delete cascade -- if user is deleted in NextAuth they will also be deleted in our public table. -); -alter table users enable row level security; -create policy "Can view own user data." on users for select using (next_auth.uid() = id); -create policy "Can update own user data." on users for update using (next_auth.uid() = id); - -/** -* This trigger automatically creates a user entry when a new user signs up via NextAuth. -*/ -create function public.handle_new_user() -returns trigger as $$ -begin - insert into public.users (id, name, email, image) - values (new.id, new.name, new.email, new.image); - return new; -end; -$$ language plpgsql security definer; -create trigger on_auth_user_created - after insert on next_auth.users - for each row execute procedure public.handle_new_user(); -``` - -The `supabaseAccessToken` is now available on the `session` object and can be passed to the supabase-js client. This works in any environment: client-side, server-side (API routes, SSR), as well as in middleware edge functions! - -```js -// ... -// Use `useSession()` or `unstable_getServerSession()` to get the NextAuth session. - -const { supabaseAccessToken } = session - -const supabase = createClient( - process.env.NEXT_PUBLIC_SUPABASE_URL, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, - { - global: { - headers: { - Authorization: `Bearer ${supabaseAccessToken}`, - }, - }, - } -) -// Now you can query with RLS enabled. -const { data, error } = await supabase.from("users").select("*") -``` - -## Usage with TypeScript - -You can pass types that were generated with the Supabase CLI to the Supabase Client to get enhanced type safety and auto completion. - -Creating a new supabase client object: - -```tsx -import { createClient } from "@supabase/supabase-js" -import { Database } from "../database.types" - -const supabase = createClient<Database>() -``` - -### Extend the session type with the `supabaseAccessToken` - -In order to extend the `session` object with the `supabaseAccessToken` we need to extend the `session` interface in a `types/next-auth.d.ts` file: - -```ts title="types/next-auth.d.ts" -import NextAuth, { DefaultSession } from "next-auth" - -declare module "next-auth" { - /** - * Returned by `useSession`, `getSession` and received as a prop on the `SessionProvider` React Context - */ - interface Session { - // A JWT which can be used as Authorization header with supabase-js for RLS. - supabaseAccessToken?: string - user: { - /** The user's postal address. */ - address: string - } & DefaultSession["user"] - } -} -``` diff --git a/docs/docs/reference/06-adapters/upstash-redis.md b/docs/docs/reference/06-adapters/upstash-redis.md deleted file mode 100644 index 7280a861..00000000 --- a/docs/docs/reference/06-adapters/upstash-redis.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -id: upstash-redis -title: Upstash Redis ---- - -To use this Adapter, you need to install `@upstash/redis` and `@next-auth/upstash-redis-adapter` package: - -```bash npm2yarn -npm install @upstash/redis @next-auth/upstash-redis-adapter -``` - -Configure your Auth.js to use the Upstash Redis Adapter: - -```javascript title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import GoogleProvider from "next-auth/providers/google" -import { UpstashRedisAdapter } from "@next-auth/upstash-redis-adapter" -import upstashRedisClient from "@upstash/redis" - -const redis = upstashRedisClient( - process.env.UPSTASH_REDIS_URL, - process.env.UPSTASH_REDIS_TOKEN -) - -export default NextAuth({ - adapter: UpstashRedisAdapter(redis), - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - }), - ], -}) -``` - -## Using Multiple Apps with a Single Upstash Redis Instance - -The Upstash free-tier allows for only one Redis instance. If you have multiple Next-Auth connected apps using this instance, you need different key prefixes for every app. - -You can change the prefixes by passing an `options` object as the second argument to the adapter factory function. - -The default values for this object are: - -```js -const defaultOptions = { - baseKeyPrefix: "", - accountKeyPrefix: "user:account:", - accountByUserIdPrefix: "user:account:by-user-id:", - emailKeyPrefix: "user:email:", - sessionKeyPrefix: "user:session:", - sessionByUserIdKeyPrefix: "user:session:by-user-id:", - userKeyPrefix: "user:", - verificationTokenKeyPrefix: "user:token:", -} -``` - -Usually changing the `baseKeyPrefix` should be enough for this scenario, but for more custom setups, you can also change the prefixes of every single key. - -Example: - -```js -export default NextAuth({ - ... - adapter: UpstashRedisAdapter(redis, {baseKeyPrefix: "app2:"}) - ... -}) -``` diff --git a/docs/docs/reference/06-adapters/xata.md b/docs/docs/reference/06-adapters/xata.md deleted file mode 100644 index d9c7912d..00000000 --- a/docs/docs/reference/06-adapters/xata.md +++ /dev/null @@ -1,239 +0,0 @@ ---- -id: xata -title: Xata ---- - -This adapter allows using next-auth with Xata as a database to store users, sessions, and more. The preferred way to create a Xata project and use Xata databases is using the [Xata Command Line Interface (CLI)](https://docs.xata.io/cli/getting-started). The CLI allows generating a `XataClient` that will help you work with Xata in a safe way, and that this adapter depends on. - -<!-- @todo add GIFs --> - -## Getting Started - -Let's first make sure we have everything installed and configured. We're going to need: - -- next-auth + adapter -- the Xata CLI -- to configure the CLI - -We can do this like so: - -```bash npm2yarn2pnpm -# Install next-auth + adapter -npm install next-auth @next-auth/xata-adapter - -# Install the Xata CLI globally if you don't already have it -npm install --location=global @xata.io/cli - -# Login -xata auth login -``` - -Now that we're ready, let's create a new Xata project using our next-auth schema that the Xata adapter can work with. To do that, copy and paste this schema file into your project's directory: - -```json title="schema.json" -{ - "tables": [ - { - "name": "nextauth_users", - "columns": [ - { - "name": "email", - "type": "email" - }, - { - "name": "emailVerified", - "type": "datetime" - }, - { - "name": "name", - "type": "string" - }, - { - "name": "image", - "type": "string" - } - ] - }, - { - "name": "nextauth_accounts", - "columns": [ - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - }, - { - "name": "type", - "type": "string" - }, - { - "name": "provider", - "type": "string" - }, - { - "name": "providerAccountId", - "type": "string" - }, - { - "name": "refresh_token", - "type": "string" - }, - { - "name": "access_token", - "type": "string" - }, - { - "name": "expires_at", - "type": "int" - }, - { - "name": "token_type", - "type": "string" - }, - { - "name": "scope", - "type": "string" - }, - { - "name": "id_token", - "type": "text" - }, - { - "name": "session_state", - "type": "string" - } - ] - }, - { - "name": "nextauth_verificationTokens", - "columns": [ - { - "name": "identifier", - "type": "string" - }, - { - "name": "token", - "type": "string" - }, - { - "name": "expires", - "type": "datetime" - } - ] - }, - { - "name": "nextauth_users_accounts", - "columns": [ - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - }, - { - "name": "account", - "type": "link", - "link": { - "table": "nextauth_accounts" - } - } - ] - }, - { - "name": "nextauth_users_sessions", - "columns": [ - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - }, - { - "name": "session", - "type": "link", - "link": { - "table": "nextauth_sessions" - } - } - ] - }, - { - "name": "nextauth_sessions", - "columns": [ - { - "name": "sessionToken", - "type": "string" - }, - { - "name": "expires", - "type": "datetime" - }, - { - "name": "user", - "type": "link", - "link": { - "table": "nextauth_users" - } - } - ] - } - ] -} -``` - -Now, run the following command: - -```bash -xata init --schema=./path/to/your/schema.json -``` - -The CLI will walk you through a setup process where you choose a [workspace](https://docs.xata.io/concepts/workspaces) (kind of like a GitHub org or a Vercel team) and an appropriate database. We recommend using a fresh database for this, as we'll augment it with tables that next-auth needs. - -Once you're done, you can continue using next-auth in your project as expected, like creating a `./pages/api/auth/[...nextauth]` route. - -```typescript title="pages/api/auth/[...nextauth].ts" -import NextAuth from "next-auth" -import GoogleProvider from "next-auth/providers/google" - -const client = new XataClient() - -export default NextAuth({ - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - }), - ], -}) -``` - -Now to Xata-fy this route, let's add the Xata client and adapter: - -```diff -import NextAuth from "next-auth" -import GoogleProvider from "next-auth/providers/google" -+import { XataAdapter } from "@next-auth/xata-adapter" -+import { XataClient } from "../../../xata" // or wherever you've chosen to create the client - -+const client = new XataClient() - -export default NextAuth({ -+ adapter: XataAdapter(client), - providers: [ - GoogleProvider({ - clientId: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - }), - ], -}) -``` - -This fully sets up your next-auth site to work with Xata. - -## Contributing - -This is an open-source project created by humans, and as such, might have a few issues. If you experience any of these, we recommend [opening issues](https://github.com/nextauthjs/next-auth/issues/new?assignees=&labels=triage&template=1_bug_framework.yml&title=Issue%20on%20Xata%20adapter&description=I%20experienced%20this%20issue:\n##%20Reproduction%20Steps:\n\n-) that can help us solve problems and build reliable software. diff --git a/docs/docs/reference/06-adapters/_category_.json b/docs/docs/reference/adapters/_category_.json similarity index 100% rename from docs/docs/reference/06-adapters/_category_.json rename to docs/docs/reference/adapters/_category_.json diff --git a/docs/docs/reference/06-adapters/01-models.md b/docs/docs/reference/adapters/index.md similarity index 59% rename from docs/docs/reference/06-adapters/01-models.md rename to docs/docs/reference/adapters/index.md index 42d050a9..26d05ab9 100644 --- a/docs/docs/reference/06-adapters/01-models.md +++ b/docs/docs/reference/adapters/index.md @@ -1,8 +1,76 @@ --- -id: models -title: Models +title: Overview --- +Using a Auth.js / NextAuth.js adapter you can connect to any database service or even several different services at the same time. The following listed official adapters are created and maintained by the community: + +<div class="adapter-card-list"> + <a href="/reference/adapter/dgraph" class="adapter-card"> + <img src="/img/adapters/dgraph.png" width="30" /> + <h4 class="adapter-card__title">Dgraph Adapter</h4> + </a> + <a href="/reference/adapter/dynamodb" class="adapter-card"> + <img src="/img/adapters/dynamodb.png" width="30" /> + <h4 class="adapter-card__title">DynamoDB Adapter</h4> + </a> + <a href="/reference/adapter/fauna" class="adapter-card"> + <img src="/img/adapters/fauna.png" width="30" /> + <h4 class="adapter-card__title">Fauna Adapter</h4> + </a> + <a href="/reference/adapter/firebase" class="adapter-card"> + <img src="/img/adapters/firebase.svg" width="40" /> + <h4 class="adapter-card__title">Firebase Adapter</h4> + </a> + <a href="/reference/adapter/mikro-orm" class="adapter-card"> + <img src="/img/adapters/mikro-orm.png" width="30" /> + <h4 class="adapter-card__title">Mikro ORM Adapter</h4> + </a> + <a href="/reference/adapter/mongodb" class="adapter-card"> + <img src="/img/adapters/mongodb.svg" width="15" /> + <h4 class="adapter-card__title">MongoDB Adapter</h4> + </a> + <a href="/reference/adapter/neo4j" class="adapter-card"> + <img src="/img/adapters/neo4j.svg" width="50" /> + <h4 class="adapter-card__title">Neo4j Adapter</h4> + </a> + <a href="/reference/adapter/pouchdb" class="adapter-card"> + <img src="/img/adapters/pouchdb.svg" width="20" /> + <h4 class="adapter-card__title">PouchDB Adapter</h4> + </a> + <a href="/reference/adapter/prisma" class="adapter-card"> + <img src="/img/adapters/prisma.svg" width="30" /> + <h4 class="adapter-card__title">Prisma Adapter</h4> + </a> + <a href="/reference/adapter/sequelize" class="adapter-card"> + <img src="/img/adapters/sequelize.svg" width="30" /> + <h4 class="adapter-card__title">Sequelize Adapter</h4> + </a> + <a href="/reference/adapter/supabase" class="adapter-card"> + <img src="/img/adapters/supabase.svg" width="25" /> + <h4 class="adapter-card__title">Supabase Adapter</h4> + </a> + <a href="/reference/adapter/typeorm" class="adapter-card"> + <img src="/img/adapters/typeorm.png" width="30" /> + <h4 class="adapter-card__title">TypeORM Adapter</h4> + </a> + <a href="/reference/adapter/upstash-redis" class="adapter-card"> + <img src="/img/adapters/upstash-redis.svg" width="30" /> + <h4 class="adapter-card__title">Upstash Adapter</h4> + </a> + <a href="/reference/adapter/xata" class="adapter-card"> + <img src="/img/adapters/xata.svg" width="20" /> + <h4 class="adapter-card__title">Xata Adapter</h4> + </a> +</div> + +:::info +If you don't find an adapter for the database or service you use, you can always create one yourself. Have a look at our guide on [how to create a database adapter](/guides/adapters/creating-a-database-adapter). +::: + + +## Models + + Auth.js can be used with any database. Models tell you what structures Auth.js expects from your database. Models will vary slightly depending on which adapter you use, but in general, will look something like this. Each adapter's model/schema will be slightly adapted for its needs, but will look very much like this schema below: ```mermaid @@ -53,7 +121,7 @@ You can [create your own adapter](/guides/adapters/creating-a-database-adapter) --- -## User +### User The User model is for information such as the user's name and email address. @@ -67,7 +135,7 @@ This provides a way to contact users and for users to maintain access to their a User creation in the database is automatic, and happens when the user is logging in for the first time with a provider. The default data saved is `id`, `name`, `email` and `image`. You can add more profile data by returning extra fields in your [OAuth provider's `profile()`](/reference/providers/oauth) callback. -## Account +### Account The Account model is for information about OAuth accounts associated with a User. It will usually contain `access_token`, `id_token` and other OAuth specific data. [`TokenSet`](https://github.com/panva/node-openid-client/blob/main/docs/README.md#new-tokensetinput) from `openid-client` might give you an idea of all the fields. @@ -87,7 +155,7 @@ You can manually unlink accounts, if your adapter implements the `unlinkAccount` Linking and unlinking accounts through an API is a planned feature: https://github.com/nextauthjs/next-auth/issues/230 ::: -## Session +### Session The Session model is used for database sessions. It is not used if JSON Web Tokens are enabled. Keep in mind, that you can use a database to persist Users and Accounts, and still use JWT for sessions. See the [`session.strategy`](/reference/configuration/auth-config) option. @@ -97,7 +165,7 @@ A single User can have multiple Sessions, each Session can only have one User. When a Session is read, we check if it's `expires` field indicates an invalid session, and delete it from the database. You can also do this clean-up periodically in the background to avoid our extra delete call to the database during an active session retrieval. This might result in a slight performance increase in a few cases. ::: -## Verification Token +### Verification Token The Verification Token model is used to store tokens for passwordless sign in. @@ -115,4 +183,9 @@ Due to users forgetting or failing at the sign-in flow, you might end up with un ## RDBMS Naming Convention -In the Auth.js v4 some schemas for the providers which support classic RDBMS type databases, like Prisma and TypeORM, have ended up with column names with mixed casing, i.e. snake_case and camelCase. If this is an issue for you or your underlying database system, please take a look at the "Naming Convention" section in the Prisma or TypeORM page. +Auth.js / NextAuth.js uses `camelCase` for its own database rows, while respecting the conventional `snake_case` formatting for OAuth related values. If mixed casing is an issue for you, most adapters have a dedicated section on how to use a single naming convention. + + +## TypeScript + +Check out the [`@auth/core/adapters` API Reference](/reference/core/adapters) documentation. \ No newline at end of file diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 392360fb..19cd9503 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,22 +16,26 @@ delete typedocConfig.$schema /** * @param {string} name - * @returns Record<string, any> + * @returns Record<[string, any]> */ -function createTypeDocAdapterConfig(name) { +function typedocAdapter(name) { const slug = name.toLowerCase().replace(" ", "-") - return { - id: slug, - plugin: [require.resolve("./typedoc-mdn-links")], - watch: process.env.TYPEDOC_WATCH, - entryPoints: [`../packages/adapter-${slug}/src/index.ts`], - tsconfig: `../packages/adapter-${slug}/tsconfig.json`, - out: `reference/adapter/${slug}`, - sidebar: { - indexLabel: name, + return [ + "docusaurus-plugin-typedoc", + { + id: slug, + plugin: [require.resolve("./typedoc-mdn-links")], + watch: process.env.TYPEDOC_WATCH, + entryPoints: [`../packages/adapter-${slug}/src/index.ts`], + tsconfig: `../packages/adapter-${slug}/tsconfig.json`, + out: `reference/adapter/${slug}`, + sidebar: { + indexLabel: name, + }, + ...typedocConfig, }, - } + ] } /** @type {import("@docusaurus/types").Config} */ @@ -253,34 +257,15 @@ const docusaurusConfig = { }, }, ], - [ - "docusaurus-plugin-typedoc", - { - ...typedocConfig, - ...createTypeDocAdapterConfig("Firebase"), - }, - ], - [ - "docusaurus-plugin-typedoc", - { - ...typedocConfig, - ...createTypeDocAdapterConfig("Dgraph"), - }, - ], - [ - "docusaurus-plugin-typedoc", - { - ...typedocConfig, - ...createTypeDocAdapterConfig("Prisma"), - }, - ], - [ - "docusaurus-plugin-typedoc", - { - ...typedocConfig, - ...createTypeDocAdapterConfig("Fauna"), - }, - ], + typedocAdapter("Dgraph"), + typedocAdapter("DynamoDB"), + typedocAdapter("Fauna"), + typedocAdapter("Firebase"), + typedocAdapter("Mikro ORM"), + typedocAdapter("MongoDB"), + typedocAdapter("Neo4j"), + typedocAdapter("PouchDB"), + typedocAdapter("Prisma"), [ "docusaurus-plugin-typedoc", { @@ -291,32 +276,13 @@ const docusaurusConfig = { entryPoints: [`../packages/adapter-typeorm-legacy/src/index.ts`], tsconfig: `../packages/adapter-typeorm-legacy/tsconfig.json`, out: `reference/adapter/typeorm`, - sidebar: { - indexLabel: "TypeORM", - }, - }, - ], - [ - "docusaurus-plugin-typedoc", - { - ...typedocConfig, - ...createTypeDocAdapterConfig("DynamoDB"), - }, - ], - [ - "docusaurus-plugin-typedoc", - { - ...typedocConfig, - ...createTypeDocAdapterConfig("MongoDB"), - }, - ], - [ - "docusaurus-plugin-typedoc", - { - ...typedocConfig, - ...createTypeDocAdapterConfig("PouchDB"), + sidebar: { indexLabel: "TypeORM" }, }, ], + typedocAdapter("Sequelize"), + typedocAdapter("Supabase"), + typedocAdapter("Upstash Redis"), + typedocAdapter("Xata"), ], } diff --git a/docs/sidebars.js b/docs/sidebars.js index 969f840c..7bb65e76 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -48,16 +48,22 @@ module.exports = { { type: "category", label: "Database Adapters", - link: { type: "doc", id: "reference/adapters/overview" }, + link: { type: "doc", id: "reference/adapters/index" }, items: [ - { type: "autogenerated", dirName: "reference/06-adapters" }, - { type: "doc", id: "reference/adapter/prisma/index" }, - { type: "doc", id: "reference/adapter/typeorm/index" }, - { type: "doc", id: "reference/adapter/mongodb/index" }, - { type: "doc", id: "reference/adapter/firebase/index" }, + { type: "doc", id: "reference/adapter/dgraph/index" }, { type: "doc", id: "reference/adapter/dynamodb/index" }, { type: "doc", id: "reference/adapter/fauna/index" }, + { type: "doc", id: "reference/adapter/firebase/index" }, + { type: "doc", id: "reference/adapter/mikro-orm/index" }, + { type: "doc", id: "reference/adapter/mongodb/index" }, + { type: "doc", id: "reference/adapter/neo4j/index" }, { type: "doc", id: "reference/adapter/pouchdb/index" }, + { type: "doc", id: "reference/adapter/prisma/index" }, + { type: "doc", id: "reference/adapter/sequelize/index" }, + { type: "doc", id: "reference/adapter/supabase/index" }, + { type: "doc", id: "reference/adapter/typeorm/index" }, + { type: "doc", id: "reference/adapter/upstash-redis/index" }, + { type: "doc", id: "reference/adapter/xata/index" }, ], }, "reference/warnings", diff --git a/docs/src/css/adapters.css b/docs/src/css/adapters.css new file mode 100644 index 00000000..aebce91d --- /dev/null +++ b/docs/src/css/adapters.css @@ -0,0 +1,39 @@ +.adapter-card-list { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: wrap; + width: 100%; + margin-bottom: 40px; +} + +.adapter-card { + border: 1px solid #dbdde1; + border-radius: 8px; + padding: 16px; + width: 255px; + height: 80px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin: 0; + margin-right: 8px; + margin-bottom: 8px; + color: black; + text-decoration: none; + transition: 0.2s background-color ease-in-out; +} + +.adapter-card:hover { + text-decoration: none; + color: black; + background-color: #f5f5f5; +} + +.adapter-card__title { + font-size: 18px; + font-weight: bold; + margin: 0; + margin-left: 8px; +} diff --git a/docs/src/css/index.css b/docs/src/css/index.css index a2fd92cd..88dbb0d6 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -57,6 +57,7 @@ html[data-theme="dark"] svg[id^="mermaid-svg"] text[id*="-attr"] { @import "providers.css"; @import "navbar.css"; @import "search.css"; +@import "adapters.css"; a { font-weight: 600; @@ -278,4 +279,4 @@ html[data-theme="dark"] #carbonads > span { html[data-theme="dark"] #carbonads .carbon-poweredby { color: #aaa; background: #1e2021; -} \ No newline at end of file +} diff --git a/docs/static/img/adapters/dgraph.png b/docs/static/img/adapters/dgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..74fc6954700e4861aeacaf7e87f48d6ba4e59268 GIT binary patch literal 7954 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 WS{&9EPsQW>2WY71DAy=jh5a9FC5Bl5 literal 0 HcmV?d00001 diff --git a/docs/static/img/adapters/fauna.png b/docs/static/img/adapters/fauna.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf95d7c273b22dc501ef79694e1d24834f5ee46 GIT binary patch literal 4788 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 Aq5uE@ literal 0 HcmV?d00001 diff --git a/docs/static/img/adapters/fauna.svg b/docs/static/img/adapters/fauna.svg index 53e1c0b4..1b49f81d 100644 --- a/docs/static/img/adapters/fauna.svg +++ b/docs/static/img/adapters/fauna.svg @@ -1,9 +1,3 @@ -<svg width="120" height="40" viewBox="0 0 120 40" fill="none" xmlns="http://www.w3.org/2000/svg"> -<rect width="120" height="40" fill="none"/> -<path d="M37.6558 16.4773V15.3494C37.6558 11.6408 40.842 8.89746 44.5863 8.89746C45.3372 8.89746 46.0881 9.00923 46.4229 9.12099L45.5604 12.4333C45.256 12.3216 44.9212 12.2809 44.5863 12.2809C42.6381 12.2809 41.3291 13.7034 41.3291 15.3596V16.4874H45.8243V19.2613H41.3291V33.3642H37.6558V19.2511H35.4844V16.4773H37.6558Z" fill="#3F00A5"/> -<path d="M46.5652 24.9213C46.5652 20.0442 50.0862 16.2949 54.7336 16.2949C57.1283 16.2949 59.2287 17.5752 60.4667 19.4854V16.488H64.1298V33.3647H60.4565V30.3674C59.178 32.2775 57.0877 33.5578 54.7234 33.5578C50.0862 33.5476 46.5652 29.7577 46.5652 24.9213ZM50.2384 24.9213C50.2384 28.1828 52.5215 30.7331 55.3323 30.7331C57.727 30.7331 60.4667 28.7417 60.4667 24.9213C60.4667 21.7004 58.2546 19.1094 55.3323 19.1094C52.5215 19.1094 50.2384 21.7308 50.2384 24.9213Z" fill="#3F00A5"/> -<path d="M66.4939 26.271V16.4863H70.1266V26.5047C70.1266 28.6791 71.7704 30.5588 74.0941 30.5588C77.057 30.5588 78.6603 28.0491 78.6603 26.2811V16.4965H82.2929V33.3733H78.6603V31.0871C77.5035 32.5502 75.6669 33.5663 73.5258 33.5663C69.1118 33.546 66.4939 30.2031 66.4939 26.271Z" fill="#3F00A5"/> -<path d="M84.3223 33.354V16.4772H87.9549V18.7634C89.0812 17.3002 90.9179 16.2842 93.0894 16.2842C97.4729 16.2842 100.131 19.627 100.131 23.5592V33.3438H96.4988V23.3255C96.4988 21.0393 94.7433 19.2714 92.4907 19.2714C89.4973 19.2714 87.9549 21.8928 87.9549 23.549V33.3337H84.3223V33.354Z" fill="#3F00A5"/> -<path d="M101.775 24.9213C101.775 20.0442 105.296 16.2949 109.944 16.2949C112.339 16.2949 114.439 17.5752 115.677 19.4854V16.488H119.35V33.3647H115.677V30.3674C114.398 32.2775 112.308 33.5578 109.944 33.5578C105.296 33.5476 101.775 29.7577 101.775 24.9213ZM105.449 24.9213C105.449 28.1828 107.732 30.7331 110.542 30.7331C112.937 30.7331 115.677 28.7417 115.677 24.9213C115.677 21.7004 113.465 19.1094 110.542 19.1094C107.732 19.1094 105.449 21.7308 105.449 24.9213Z" fill="#3F00A5"/> -<path d="M21.6945 10.5028C19.7767 11.1429 18.8533 12.2911 18.2242 14.0793C18.0618 14.5569 17.6559 15.0852 17.1993 15.4408L18.7721 17.1275L13.7797 13.6323L0 4C0 4 0.994414 10.4621 1.33942 12.8397C1.58295 14.5162 1.99898 15.2681 3.3181 16.0302L3.84574 16.3147L6.11869 17.5136L4.76913 16.8125L10.9994 20.2163L10.9589 20.3078L4.25163 17.1986C4.60678 18.4179 5.29678 20.765 5.59104 21.8014C5.9056 22.919 6.26075 23.3255 7.34649 23.7217L9.34546 24.4533L10.5834 23.9656L9.01061 25.0121L1.14662 35C6.37237 30.1432 10.7965 28.4159 14.0334 27.0036C18.1633 25.2153 20.6493 24.0672 22.2728 19.942C23.4296 17.0462 24.3327 13.3376 25.4793 11.9049L27.9248 8.77548C27.9248 8.77548 22.8614 10.1167 21.6945 10.5028Z" fill="#3F00A5"/> +<svg viewBox="0 0 120 40" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path d="M21.6945 10.5028C19.7767 11.1429 18.8533 12.2911 18.2242 14.0793C18.0618 14.5569 17.6559 15.0852 17.1993 15.4408L18.7721 17.1275L13.7797 13.6323L0 4C0 4 0.994414 10.4621 1.33942 12.8397C1.58295 14.5162 1.99898 15.2681 3.3181 16.0302L3.84574 16.3147L6.11869 17.5136L4.76913 16.8125L10.9994 20.2163L10.9589 20.3078L4.25163 17.1986C4.60678 18.4179 5.29678 20.765 5.59104 21.8014C5.9056 22.919 6.26075 23.3255 7.34649 23.7217L9.34546 24.4533L10.5834 23.9656L9.01061 25.0121L1.14662 35C6.37237 30.1432 10.7965 28.4159 14.0334 27.0036C18.1633 25.2153 20.6493 24.0672 22.2728 19.942C23.4296 17.0462 24.3327 13.3376 25.4793 11.9049L27.9248 8.77548C27.9248 8.77548 22.8614 10.1167 21.6945 10.5028Z" fill="#3F00A5"/> </svg> diff --git a/docs/static/img/adapters/mikro-orm.png b/docs/static/img/adapters/mikro-orm.png new file mode 100644 index 0000000000000000000000000000000000000000..76fb06da858e6db5dcbddb4477851b71e417d029 GIT binary patch literal 883 zcmV-(1C0EMP)<h;3K|Lk000e1NJLTq002$^003AB0{{R3Z2K{(0001ZP)t-s|Ns9N zXNVda8u0V=P>ZIFjEquJQpDNesHmvM#>OOXkEq7fK!cvs;psIsHR0^>w$R$s)6<x| z%WR*tL_|c2vcofamv3)x;^N|7maKcJyltShC@3h4v&1ramc`lPVPRolU|_hoxF;tk zx3{;Oo12=NntpzMKt5UW0008ENkl<ZSi|ks*_yI23<lsYl&vhXgNTl!&T{{E_`^8M z&!nY=!+Cs9JTOmelMuwi!^2-vT)ocskIskM_q|ssu+8<|cT{%I;U4RV@Yz{Xzplu* ze?K}#{?#&B=h)eW7T5F~dv#%I<<42f!;(-}DBs^{z7fz;RPEx)?<UHy<4J36K9Bu$ z$YP7mHs8zdIBC}`UmbR2RkrNcn?>Q4hDy}4(4$a<EM()sJJa#Pg?gBxYtvm{U@*Tf znE5smFu2UZ3qv|Ei!&+>>DW438}2O(ooNnkU<x)$_IK^T?bxJPZyu=+;hV=CYOL;P zCv|oE{aPwaPvV^~l?&zQ*gTH{`y1P3USWJ;hESHJDpAx9bM!s$Do3y0vueSINL$rL zAu1s*&N?@VG@=qrNkjwic3YF}B9KQ!iQ=v_N-~Jf(c`^8&;*Q2A5QFVz|x<9prsFi zE*-V;n9wu6y*mkHJ<)QydqM#eUadb@_cBHVJ$>V?ZRkIJKJ{997j{bjJ)A}{J+$=W z2~0{e(GaJY?4|VXLV2HQk&n4%DsTz?7WJq2JiEvFd>VKh1>geGaqn8~_fY9+n<#^d zNNAH7u+FzVTe&G;j8u8qoCb)B)_F>iM#@&SM8kbS*sBEMpFv?`+y)ShbwYQH?q_4n z9<qZ#Rz;S{zU~r1y8@z<fQU^!i4GYMxcU{~{)7%=Xjb<6`X8oZ#V(O?LEZK7)cl~V zT$)SVCJ=0+P^wt&b4mFb69hrtG)*~viqDNQv@{1MCN3FH=WMo7@>Aa`;=qW-E>1|R z1Xs~kkpL$m+Ngv|PTROpYiNr^K%?50O)Fl1Q-KBP6Rpx<nP}D=Ern55*>2((R<c86 zak3ot;(ocEWrmgVgR8#dw7s@T^QLm$=xf)x<C+q9czF0T{sA9qD8%JzEgJv;002ov JPDHLkV1ko2wln|$ literal 0 HcmV?d00001 diff --git a/docs/static/img/adapters/mongodb.svg b/docs/static/img/adapters/mongodb.svg index bed4f094..7f2878a9 100644 --- a/docs/static/img/adapters/mongodb.svg +++ b/docs/static/img/adapters/mongodb.svg @@ -1 +1,3 @@ -<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1112.61 300"><defs><style>.cls-1{fill:#10aa50;}.cls-2{fill:#b8c4c2;}.cls-3{fill:#12924f;}.cls-4{fill:#21313c;}</style></defs><title>MongoDB_Logo_FullColorBlack_RGB \ No newline at end of file + + + diff --git a/packages/adapter-dgraph/src/index.ts b/packages/adapter-dgraph/src/index.ts index d4e034e9..7a051775 100644 --- a/packages/adapter-dgraph/src/index.ts +++ b/packages/adapter-dgraph/src/index.ts @@ -1,18 +1,18 @@ /** *
- *

Official DynamoDB adapter for Auth.js / NextAuth.js.

- * - * + *

Official Dgraph adapter for Auth.js / NextAuth.js.

+ * + * * *
* * ## Installation * * ```bash npm2yarn2pnpm - * npm install next-auth @next-auth/dynamodb-adapter @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb + * npm install next-auth @next-auth/dgraph-adapter * ``` * - * @module @next-auth/dynamodb-adapter + * @module @next-auth/dgraph-adapter */ import { client as dgraphClient } from "./client" import { format } from "./utils" @@ -42,7 +42,7 @@ export interface DgraphAdapterOptions { export { format } /** - * ### Basic usage + * ## Setup * * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object: * @@ -61,6 +61,7 @@ export { format } * }), * }) * ``` + * * ### Unsecure schema * * The quickest way to use Dgraph is by applying the unsecure schema to your [local](https://dgraph.io/docs/graphql/admin/#modifying-a-schema) Dgraph instance or if using Dgraph [cloud](https://dgraph.io/docs/cloud/cloud-quick-start/#the-schema) you can paste the schema in the codebox to update. @@ -69,7 +70,7 @@ export { format } * This approach is not secure or for production use, and does not require a `jwtSecret`. * ::: * - * > This schema is adapted for use in Dgraph and based upon our main [schema](/reference/adapters/models) + * > This schema is adapted for use in Dgraph and based upon our main [schema](https://authjs.dev/reference/adapters#models) * * #### Example * @@ -113,6 +114,7 @@ export { format } * expires: DateTime * } *``` + * * ### Secure schema * * For production deployments you will want to restrict the access to the types used @@ -203,7 +205,8 @@ export { format } * * # Dgraph.Authorization {"VerificationKey":"","Header":"","Namespace":"","Algo":"HS256"} * ``` - * ### Dgraph.Authorization + * + * ### Dgraph.Authorization * * In order to secure your graphql backend define the `Dgraph.Authorization` object at the * bottom of your schema and provide `authHeader` and `jwtSecret` values to the DgraphClient. @@ -239,6 +242,7 @@ export { format } * ... * } * ``` + * * ### JWT session and `@auth` directive * * Dgraph only works with HS256 or RS256 algorithms. If you want to use session jwt to securely interact with your dgraph diff --git a/packages/adapter-dynamodb/src/index.ts b/packages/adapter-dynamodb/src/index.ts index fb369361..e3f62ada 100644 --- a/packages/adapter-dynamodb/src/index.ts +++ b/packages/adapter-dynamodb/src/index.ts @@ -38,13 +38,12 @@ export interface DynamoDBAdapterOptions { } /** - * ## Basic usage + * ## Setup * - * This is the AWS DynamoDB Adapter for `next-auth`. This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. * By default, the adapter expects a table with a partition key `pk` and a sort key `sk`, as well as a global secondary index named `GSI1` with `GSI1PK` as partition key and `GSI1SK` as sorting key. To automatically delete sessions and verification requests after they expire using [dynamodb TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html) you should [enable the TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html) with attribute name 'expires'. You can set whatever you want as the table name and the billing method. * You can find the full schema in the table structure section below. * - * ## Configuring Auth.js + * ### Configuring Auth.js * * You need to pass `DynamoDBDocument` client from the modular [`aws-sdk`](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/dynamodb-example-dynamodb-utilities.html) v3 to the adapter. * The default table name is `next-auth`, but you can customise that by passing `{ tableName: 'your-table-name' }` as the second parameter in the adapter. @@ -94,7 +93,9 @@ export interface DynamoDBAdapterOptions { * * (AWS secrets start with `NEXT_AUTH_` in order to not conflict with [Vercel's reserved environment variables](https://vercel.com/docs/environment-variables#reserved-environment-variables).) * - * ## Schema + * ## Advanced usage + * + * ### Default schema * * The table respects the single table design pattern. This has many advantages: * @@ -102,7 +103,7 @@ export interface DynamoDBAdapterOptions { * - Querying relations is faster than with multi-table schemas (for eg. retrieving all sessions for a user). * - Only one table needs to be replicated if you want to go multi-region. * - * > This schema is adapted for use in DynamoDB and based upon our main [schema](/reference/adapters/models) + * > This schema is adapted for use in DynamoDB and based upon our main [schema](https://authjs.dev/reference/adapters#models) * * ![DynamoDB Table](https://i.imgur.com/hGZtWDq.png) * @@ -156,7 +157,7 @@ export interface DynamoDBAdapterOptions { * Enabled: true * ``` * - * ## Configuring your custom schema + * ### Using a custom schema * * You can configure your custom table schema by passing the `options` key to the adapter constructor: * diff --git a/packages/adapter-fauna/src/index.ts b/packages/adapter-fauna/src/index.ts index 82c84a38..e926e7c3 100644 --- a/packages/adapter-fauna/src/index.ts +++ b/packages/adapter-fauna/src/index.ts @@ -126,7 +126,7 @@ export function query(f: FaunaClient, format: (...args: any) => any) { /** * - * ## Basic usage + * ## Setup * * This is the Fauna Adapter for [`next-auth`](https://authjs.dev). This package can only be used in conjunction with the primary `next-auth` package. It is not a standalone package. * @@ -197,7 +197,7 @@ export function query(f: FaunaClient, format: (...args: any) => any) { * }) * ``` * - * > This schema is adapted for use in Fauna and based upon our main [schema](/reference/adapters/models) + * > This schema is adapted for use in Fauna and based upon our main [schema](https://authjs.dev/reference/adapters#models) **/ export function FaunaAdapter(f: FaunaClient): Adapter { const { Users, Accounts, Sessions, VerificationTokens } = collections diff --git a/packages/adapter-firebase/src/index.ts b/packages/adapter-firebase/src/index.ts index 2fdf9d04..de20e6cf 100644 --- a/packages/adapter-firebase/src/index.ts +++ b/packages/adapter-firebase/src/index.ts @@ -15,10 +15,6 @@ * npm install next-auth @next-auth/firebase-adapter firebase-admin * ``` * - * ## References - * - [`GOOGLE_APPLICATION_CREDENTIALS` environment variable](https://cloud.google.com/docs/authentication/application-default-credentials#GAC) - * - [Firebase Admin SDK setup](https://firebase.google.com/docs/admin/setup#initialize-sdk) - * * @module @next-auth/firebase-adapter */ @@ -68,14 +64,13 @@ export interface FirebaseAdapterConfig extends AppOptions { } /** - * #### Basic usage + * ## Setup * - * First, create a Firebase project and generate a service account key. - * Visit: `https://console.firebase.google.com/u/0/project/{project-id}/settings/serviceaccounts/adminsdk` (replace `{project-id}` with your project's id) + * First, create a Firebase project and generate a service account key. Visit: `https://console.firebase.google.com/u/0/project/{project-id}/settings/serviceaccounts/adminsdk` (replace `{project-id}` with your project's id) * * Now you have a few options to authenticate with the Firebase Admin SDK in your app: * - * ##### Environment variables + * ### Environment variables * - Download the service account key and save it in your project. (Make sure to add the file to your `.gitignore`!) * - Add [`GOOGLE_APPLICATION_CREDENTIALS`](https://cloud.google.com/docs/authentication/application-default-credentials#GAC) to your environment variables and point it to the service account key file. * - The adapter will automatically pick up the environment variable and use it to authenticate with the Firebase Admin SDK. @@ -91,7 +86,7 @@ export interface FirebaseAdapterConfig extends AppOptions { * }) * ``` * - * ##### Service account values + * ### Service account values * * - Download the service account key to a temporary location. (Make sure to not commit this file to your repository!) * - Add the following environment variables to your project: `FIREBASE_PROJECT_ID`, `FIREBASE_CLIENT_EMAIL`, `FIREBASE_PRIVATE_KEY`. @@ -115,7 +110,7 @@ export interface FirebaseAdapterConfig extends AppOptions { * }) * ``` * - * ##### Using an existing Firestore instance + * ### Using an existing Firestore instance * * If you already have a Firestore instance, you can pass that to the adapter directly instead. * diff --git a/packages/adapter-mikro-orm/src/index.ts b/packages/adapter-mikro-orm/src/index.ts index 3c18caf3..c3e5b543 100644 --- a/packages/adapter-mikro-orm/src/index.ts +++ b/packages/adapter-mikro-orm/src/index.ts @@ -1,3 +1,19 @@ +/** + *
+ *

Official MikroORM adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/dynamodb-adapter @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb + * ``` + * + * @module @next-auth/dynamodb-adapter + */ import type { Connection, IDatabaseDriver, @@ -13,10 +29,110 @@ import * as defaultEntities from "./entities" export { defaultEntities } /** - * The MikroORM adapter accepts a MikroORM configuration and returns a NextAuth adapter. - * @param ormConnection a MikroORM connection configuration (https://mikro-orm.io/docs/next/configuration#driver) - * @param options entities in the options object will be passed to the MikroORM init function as entities. Has to be provided if overridden! - * @returns + * ## Setup + * + * Configure Auth.js to use the MikroORM Adapter: + * + * ```typescript title="pages/api/auth/[...nextauth].ts" + * import NextAuth from "next-auth" + * import { MikroOrmAdapter } from "@next-auth/mikro-orm-adapter" + * + * export default NextAuth({ + * adapter: MikroOrmAdapter({ + * // MikroORM options object. Ref: https://mikro-orm.io/docs/next/configuration#driver + * dbName: "./db.sqlite", + * type: "sqlite", + * debug: process.env.DEBUG === "true" || process.env.DEBUG?.includes("db"), + * }), + * providers: [], + * }) + * ``` + * + * ## Advanced usage + * + * ### Passing custom entities + * + * The MikroORM adapter ships with its own set of entities. If you'd like to extend them, you can optionally pass them to the adapter. + * + * > This schema is adapted for use in MikroORM and based upon our main [schema](https://authjs.dev/reference/adapters#models) + * + * ```typescript title="pages/api/auth/[...nextauth].ts" + * import config from "config/mikro-orm.ts" + * import { + * Cascade, + * Collection, + * Entity, + * OneToMany, + * PrimaryKey, + * Property, + * Unique, + * } from "@mikro-orm/core" + * import { defaultEntities } from "@next-auth/mikro-orm-adapter" + * + * const { Account, Session } = defaultEntities + * + * @Entity() + * export class User implements defaultEntities.User { + * @PrimaryKey() + * id: string = randomUUID() + * + * @Property({ nullable: true }) + * name?: string + * + * @Property({ nullable: true }) + * @Unique() + * email?: string + * + * @Property({ type: "Date", nullable: true }) + * emailVerified: Date | null = null + * + * @Property({ nullable: true }) + * image?: string + * + * @OneToMany({ + * entity: () => Session, + * mappedBy: (session) => session.user, + * hidden: true, + * orphanRemoval: true, + * cascade: [Cascade.ALL], + * }) + * sessions = new Collection(this) + * + * @OneToMany({ + * entity: () => Account, + * mappedBy: (account) => account.user, + * hidden: true, + * orphanRemoval: true, + * cascade: [Cascade.ALL], + * }) + * accounts = new Collection(this) + * + * @Enum({ hidden: true }) + * role = "ADMIN" + * } + * + * export default NextAuth({ + * adapter: MikroOrmAdapter(config, { entities: { User } }), + * }) + * ``` + * + * ### Including default entities + * + * You may want to include the defaultEntities in your MikroORM configuration to include them in Migrations etc. + * + * To achieve that include them in your "entities" array: + * + * ```typescript title="config/mikro-orm.ts" + * import { Options } from "@mikro-orm/core"; + * import { defaultEntities } from "@next-auth/mikro-orm-adapter" + * + * const config: Options = { + * ... + * entities: [VeryImportantEntity, ...Object.values(defaultEntities)], + * }; + * + * export default config; + * ``` */ export function MikroOrmAdapter< D extends IDatabaseDriver = IDatabaseDriver diff --git a/packages/adapter-mongodb/src/index.ts b/packages/adapter-mongodb/src/index.ts index 3bef3424..d23ef592 100644 --- a/packages/adapter-mongodb/src/index.ts +++ b/packages/adapter-mongodb/src/index.ts @@ -2,7 +2,7 @@ *
*

Official MongoDB adapter for Auth.js / NextAuth.js.

* - * + * * *
* @@ -89,17 +89,11 @@ export function _id(hex?: string) { } /** - * #### Basic Usage + * ## Setup * * The MongoDB adapter does not handle connections automatically, so you will have to make sure that you pass the Adapter a `MongoClient` that is connected already. Below you can see an example how to do this. * - * ##### Installation - * - * ```bash npm2yarn2pnpm - * npm install next-auth @next-auth/mongodb-adapter mongodb - * ``` - * - * ##### Add the MongoDB client + * ### Add the MongoDB client * * ```ts * // This approach is taken from https://github.com/vercel/next.js/tree/canary/examples/with-mongodb @@ -134,7 +128,7 @@ export function _id(hex?: string) { * export default clientPromise * ``` * - * ##### Configure Auth.js + * ### Configure Auth.js * * ```js * import NextAuth from "next-auth" diff --git a/packages/adapter-neo4j/src/index.ts b/packages/adapter-neo4j/src/index.ts index 09af9601..7d85d06d 100644 --- a/packages/adapter-neo4j/src/index.ts +++ b/packages/adapter-neo4j/src/index.ts @@ -1,3 +1,19 @@ +/** + *
+ *

Official Neo4j adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install next-auth @next-auth/neo4j-adapter neo4j-driver + * ``` + * + * @module @next-auth/neo4j-adapter + */ import type { Session } from "neo4j-driver" import type { Adapter } from "next-auth/adapters" import { v4 as uuid } from "uuid" @@ -5,6 +21,114 @@ 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. */ +export interface Neo4jOptions extends Session {} + +/** + * ## Setup + * + * Add this adapter to your `pages/api/[...nextauth].js` Auth.js configuration object. + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import neo4j from "neo4j-driver" + * import { Neo4jAdapter } from "@next-auth/neo4j-adapter" + * + * const driver = neo4j.driver( + * "bolt://localhost", + * neo4j.auth.basic("neo4j", "password") + * ) + * + * const neo4jSession = driver.session() + * + * // For more information on each option (and a full list of options) go to + * // https://authjs.dev/reference/configuration/auth-options + * export default NextAuth({ + * // https://authjs.dev/reference/providers/oauth-builtin + * providers: [], + * adapter: Neo4jAdapter(neo4jSession), + * ... + * }) + * ``` + * ## Advanced usage + * + * ### Schema + * + * #### Node labels + * + * The following node labels are used. + * + * - User + * - Account + * - Session + * - VerificationToken + * + * #### Relationships + * + * The following relationships and relationship labels are used. + * + * - (:User)-[:HAS_ACCOUNT]->(:Account) + * - (:User)-[:HAS_SESSION]->(:Session) + * + * #### Properties + * + * This schema is adapted for use in Neo4J and is based upon our main [models](https://authjs.dev/reference/adapters#models). Please check there for the node properties. Relationships have no properties. + * + * #### Indexes + * + * Optimum indexes will vary on your edition of Neo4j i.e. community or enterprise, and in case you have your own additional data on the nodes. Below are basic suggested indexes. + * + * 1. For **both** Community Edition & Enterprise Edition create constraints and indexes + * + * ```cypher + * + * CREATE CONSTRAINT user_id_constraint IF NOT EXISTS + * ON (u:User) ASSERT u.id IS UNIQUE; + * + * CREATE INDEX user_id_index IF NOT EXISTS + * FOR (u:User) ON (u.id); + * + * CREATE INDEX user_email_index IF NOT EXISTS + * FOR (u:User) ON (u.email); + * + * CREATE CONSTRAINT session_session_token_constraint IF NOT EXISTS + * ON (s:Session) ASSERT s.sessionToken IS UNIQUE; + * + * CREATE INDEX session_session_token_index IF NOT EXISTS + * FOR (s:Session) ON (s.sessionToken); + * ``` + * + * 2.a. For Community Edition **only** create single-property indexes + * + * ```cypher + * CREATE INDEX account_provider_index IF NOT EXISTS + * FOR (a:Account) ON (a.provider); + * + * CREATE INDEX account_provider_account_id_index IF NOT EXISTS + * FOR (a:Account) ON (a.providerAccountId); + * + * CREATE INDEX verification_token_identifier_index IF NOT EXISTS + * FOR (v:VerificationToken) ON (v.identifier); + * + * CREATE INDEX verification_token_token_index IF NOT EXISTS + * FOR (v:VerificationToken) ON (v.token); + * ``` + * + * 2.b. For Enterprise Edition **only** create composite node key constraints and indexes + * + * ```cypher + * CREATE CONSTRAINT account_provider_composite_constraint IF NOT EXISTS + * ON (a:Account) ASSERT (a.provider, a.providerAccountId) IS NODE KEY; + * + * CREATE INDEX account_provider_composite_index IF NOT EXISTS + * FOR (a:Account) ON (a.provider, a.providerAccountId); + * + * CREATE CONSTRAINT verification_token_composite_constraint IF NOT EXISTS + * ON (v:VerificationToken) ASSERT (v.identifier, v.token) IS NODE KEY; + * + * CREATE INDEX verification_token_composite_index IF NOT EXISTS + * FOR (v:VerificationToken) ON (v.identifier, v.token); + * ``` + */ export function Neo4jAdapter(session: Session): Adapter { const { read, write } = client(session) diff --git a/packages/adapter-pouchdb/src/index.ts b/packages/adapter-pouchdb/src/index.ts index af66b951..aa79ee75 100644 --- a/packages/adapter-pouchdb/src/index.ts +++ b/packages/adapter-pouchdb/src/index.ts @@ -88,7 +88,7 @@ export interface PouchDBAdapterOptions { * Depending on your architecture you can use PouchDB's http adapter to reach any database compliant with the CouchDB protocol (CouchDB, Cloudant, ...) or use any other PouchDB compatible adapter (leveldb, in-memory, ...) * ::: * - * #### Basic usage + * ## Setup * * :::note * Your PouchDB instance MUST provide the `pouchdb-find` plugin since it is used internally by the adapter to build and manage indexes @@ -124,9 +124,9 @@ export interface PouchDBAdapterOptions { * }) * ``` * - * #### Advanced usage + * ## Advanced usage * - * ##### Memory-First Caching Strategy + * ### Memory-First Caching Strategy * * If you need to boost your authentication layer performance, you may use PouchDB's powerful sync features and various adapters, to build a memory-first caching strategy. * diff --git a/packages/adapter-prisma/src/index.ts b/packages/adapter-prisma/src/index.ts index 012ea823..cdae4534 100644 --- a/packages/adapter-prisma/src/index.ts +++ b/packages/adapter-prisma/src/index.ts @@ -19,7 +19,7 @@ import type { PrismaClient, Prisma } from "@prisma/client" import type { Adapter, AdapterAccount } from "next-auth/adapters" /** - * ## Basic usage + * ## Setup * * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object: * @@ -42,13 +42,13 @@ import type { Adapter, AdapterAccount } from "next-auth/adapters" * }) * ``` * - * ## Schema + * ## Advanced usage * * ### Create the Prisma schema from scratch * * You need to use at least Prisma 2.26.0. Create a schema file in `prisma/schema.prisma` similar to this one: * - * > This schema is adapted for use in Prisma and based upon our main [schema](/reference/adapters/models) + * > This schema is adapted for use in Prisma and based upon our main [schema](https://authjs.dev/reference/adapters#models) * * ```json title="schema.prisma" * datasource db { @@ -160,7 +160,7 @@ import type { Adapter, AdapterAccount } from "next-auth/adapters" * * Everything else should be the same. * - * ## Naming Conventions + * ### Naming Conventions * * If mixed snake_case and camelCase column names is an issue for you and/or your underlying database system, we recommend using Prisma's `@map()`([see the documentation here](https://www.prisma.io/docs/concepts/components/prisma-schema/names-in-underlying-database)) feature to change the field names. This won't affect Auth.js, but will allow you to customize the column names to whichever naming convention you wish. * diff --git a/packages/adapter-sequelize/src/index.ts b/packages/adapter-sequelize/src/index.ts index a8aee6ca..f84fc9c9 100644 --- a/packages/adapter-sequelize/src/index.ts +++ b/packages/adapter-sequelize/src/index.ts @@ -1,3 +1,19 @@ +/** + *
+ *

Official Sequilize adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install install next-auth @next-auth/sequelize-adapter sequelize + * ``` + * + * @module @next-auth/sequelize-adapter + */ import type { Adapter, AdapterUser, @@ -24,8 +40,15 @@ interface VerificationTokenInstance extends Model>, VerificationToken {} -interface SequelizeAdapterOptions { +/** This is the interface of the Sequelize adapter options. */ +export interface SequelizeAdapterOptions { + /** + * Whether to {@link https://sequelize.org/docs/v6/core-concepts/model-basics/#model-synchronization synchronize} the models or not. + */ synchronize?: boolean + /** + * The {@link https://sequelize.org/docs/v6/core-concepts/model-basics/ Sequelize Models} related to Auth.js that will be created in your database. + */ models?: Partial<{ User: ModelCtor Account: ModelCtor @@ -34,6 +57,85 @@ interface SequelizeAdapterOptions { }> } +/** + * :::warning + * You'll also have to manually install [the driver for your database](https://sequelize.org/master/manual/getting-started.html) of choice. + * ::: + * + * ## Setup + * + * ### Configuring Auth.js + * + * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import SequelizeAdapter from "@next-auth/sequelize-adapter" + * import { Sequelize } from "sequelize" + * + * // https://sequelize.org/master/manual/getting-started.html#connecting-to-a-database + * const sequelize = new Sequelize("yourconnectionstring") + * + * // For more information on each option (and a full list of options) go to + * // https://authjs.dev/reference/configuration/auth-config + * export default NextAuth({ + * // https://authjs.dev/reference/providers/ + * providers: [], + * adapter: SequelizeAdapter(sequelize), + * }) + * ``` + * + * ### Updating the database schema + * + * By default, the sequelize adapter will not create tables in your database. In production, best practice is to create the [required tables](https://authjs.dev/reference/adapters/models) in your database via [migrations](https://sequelize.org/master/manual/migrations.html). In development, you are able to call [`sequelize.sync()`](https://sequelize.org/master/manual/model-basics.html#model-synchronization) to have sequelize create the necessary tables, foreign keys and indexes: + * + * > This schema is adapted for use in Sequelize and based upon our main [schema](https://authjs.dev/reference/adapters#models) + * + * ```js + * import NextAuth from "next-auth" + * import SequelizeAdapter from "@next-auth/sequelize-adapter" + * import Sequelize from 'sequelize' + * + * const sequelize = new Sequelize("sqlite::memory:") + * const adapter = SequelizeAdapter(sequelize) + * + * // Calling sync() is not recommended in production + * sequelize.sync() + * + * export default NextAuth({ + * ... + * adapter + * ... + * }) + * ``` + * + * ## Advanced usage + * + * ### Using custom models + * + * Sequelize models are option to customization like so: + * + * ```js + * import NextAuth from "next-auth" + * import SequelizeAdapter, { models } from "@next-auth/sequelize-adapter" + * import Sequelize, { DataTypes } from "sequelize" + * + * const sequelize = new Sequelize("sqlite::memory:") + * + * export default NextAuth({ + * // https://authjs.dev/reference/providers/ + * providers: [], + * adapter: SequelizeAdapter(sequelize, { + * models: { + * User: sequelize.define("user", { + * ...models.User, + * phoneNumber: DataTypes.STRING, + * }), + * }, + * }), + * }) + * ``` + */ export default function SequelizeAdapter( client: Sequelize, options?: SequelizeAdapterOptions diff --git a/packages/adapter-supabase/src/index.ts b/packages/adapter-supabase/src/index.ts index 1319aca5..b27d1739 100644 --- a/packages/adapter-supabase/src/index.ts +++ b/packages/adapter-supabase/src/index.ts @@ -1,3 +1,19 @@ +/** + *
+ *

Official Supabase adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install @supabase/supabase-js next-auth @next-auth/supabase-adapter + * ``` + * + * @module @next-auth/supabase-adapter + */ import { createClient } from "@supabase/supabase-js" import { Database } from "./database.types" import { @@ -27,13 +43,311 @@ export function format(obj: Record): T { return obj as T } -export const SupabaseAdapter = ({ - url, - secret, -}: { +/** + * This is the interface of the Supabase adapter options. + **/ +export interface SupabaseAdapterOptions { + /** + * The URL of your Supabase database + **/ url: string + /** + * The secret to grant access to the database + **/ secret: string -}): Adapter => { +} + +/** + * :::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. + * + * 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 + * + * ### Configure Auth.js + * + * Add this adapter to your `pages/api/[...nextauth].js` next-auth configuration object. + * + * ```js title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import { SupabaseAdapter } from "@next-auth/supabase-adapter" + * + * // For more information on each option (and a full list of options) go to + * // https://authjs.dev/reference/configuration/auth-config + * export default NextAuth({ + * // https://authjs.dev/reference/providers/oauth-builtin + * providers: [...], + * adapter: SupabaseAdapter({ + * url: process.env.NEXT_PUBLIC_SUPABASE_URL, + * secret: process.env.SUPABASE_SERVICE_ROLE_KEY, + * }), + * // ... + * }) + * ``` + * + * ### Create the NextAuth schema in Supabase + * + * Setup your database as described in our main [schema](https://authjs.dev/reference/adapters#models), by copying the SQL schema below in the Supabase [SQL Editor](https://app.supabase.com/project/_/sql). + * + * Alternatively you can select the NextAuth Quickstart card on the [SQL Editor page](https://app.supabase.com/project/_/sql), or [create a migration with the Supabase CLI](https://supabase.com/docs/guides/cli/local-development#database-migrations?utm_source=authjs-docs&medium=referral&campaign=authjs). + * + * ```sql + * -- + * -- Name: next_auth; Type: SCHEMA; + * -- + * CREATE SCHEMA next_auth; + * + * GRANT USAGE ON SCHEMA next_auth TO service_role; + * GRANT ALL ON SCHEMA next_auth TO postgres; + * + * -- + * -- Create users table + * -- + * CREATE TABLE IF NOT EXISTS next_auth.users + * ( + * id uuid NOT NULL DEFAULT uuid_generate_v4(), + * name text, + * email text, + * "emailVerified" timestamp with time zone, + * image text, + * CONSTRAINT users_pkey PRIMARY KEY (id), + * CONSTRAINT email_unique UNIQUE (email) + * ); + * + * GRANT ALL ON TABLE next_auth.users TO postgres; + * GRANT ALL ON TABLE next_auth.users TO service_role; + * + * --- uid() function to be used in RLS policies + * CREATE FUNCTION next_auth.uid() RETURNS uuid + * LANGUAGE sql STABLE + * AS $$ + * select + * coalesce( + * nullif(current_setting('request.jwt.claim.sub', true), ''), + * (nullif(current_setting('request.jwt.claims', true), '')::jsonb ->> 'sub') + * )::uuid + * $$; + * + * -- + * -- Create sessions table + * -- + * CREATE TABLE IF NOT EXISTS next_auth.sessions + * ( + * id uuid NOT NULL DEFAULT uuid_generate_v4(), + * expires timestamp with time zone NOT NULL, + * "sessionToken" text NOT NULL, + * "userId" uuid, + * CONSTRAINT sessions_pkey PRIMARY KEY (id), + * CONSTRAINT sessionToken_unique UNIQUE ("sessionToken"), + * CONSTRAINT "sessions_userId_fkey" FOREIGN KEY ("userId") + * REFERENCES next_auth.users (id) MATCH SIMPLE + * ON UPDATE NO ACTION + * ON DELETE CASCADE + * ); + * + * GRANT ALL ON TABLE next_auth.sessions TO postgres; + * GRANT ALL ON TABLE next_auth.sessions TO service_role; + * + * -- + * -- Create accounts table + * -- + * CREATE TABLE IF NOT EXISTS next_auth.accounts + * ( + * id uuid NOT NULL DEFAULT uuid_generate_v4(), + * type text NOT NULL, + * provider text NOT NULL, + * "providerAccountId" text NOT NULL, + * refresh_token text, + * access_token text, + * expires_at bigint, + * token_type text, + * scope text, + * id_token text, + * session_state text, + * oauth_token_secret text, + * oauth_token text, + * "userId" uuid, + * CONSTRAINT accounts_pkey PRIMARY KEY (id), + * CONSTRAINT provider_unique UNIQUE (provider, "providerAccountId"), + * CONSTRAINT "accounts_userId_fkey" FOREIGN KEY ("userId") + * REFERENCES next_auth.users (id) MATCH SIMPLE + * ON UPDATE NO ACTION + * ON DELETE CASCADE + * ); + * + * GRANT ALL ON TABLE next_auth.accounts TO postgres; + * GRANT ALL ON TABLE next_auth.accounts TO service_role; + * + * -- + * -- Create verification_tokens table + * -- + * CREATE TABLE IF NOT EXISTS next_auth.verification_tokens + * ( + * identifier text, + * token text, + * expires timestamp with time zone NOT NULL, + * CONSTRAINT verification_tokens_pkey PRIMARY KEY (token), + * CONSTRAINT token_unique UNIQUE (token), + * CONSTRAINT token_identifier_unique UNIQUE (token, identifier) + * ); + * + * GRANT ALL ON TABLE next_auth.verification_tokens TO postgres; + * GRANT ALL ON TABLE next_auth.verification_tokens TO service_role; + * ``` + * ### Expose the NextAuth schema in Supabase + * + * Expose the `next_auth` schema via the Serverless API in the [API settings](https://app.supabase.com/project/_/settings/api) by adding `next_auth` to the "Exposed schemas" list. + * + * When developing locally add `next_auth` to the `schemas` array in the `config.toml` file in the `supabase` folder that was generated by the [Supabase CLI](https://supabase.com/docs/guides/cli/local-development#initialize-your-project?utm_source=authjs-docs&medium=referral&campaign=authjs). + * + * ## Advanced usage + * + * ### Enabling Row Level Security (RLS) + * + * Postgres provides a powerful feature called [Row Level Security (RLS)](https://supabase.com/docs/guides/auth/row-level-security?utm_source=authjs-docs&medium=referral&campaign=authjs) to limit access to data. + * + * This works by sending a signed JWT to your [Supabase Serverless API](https://supabase.com/docs/guides/api?utm_source=authjs-docs&medium=referral&campaign=authjs). There is two steps to make this work with NextAuth: + * + * #### Generate the Supabase `access_token` JWT in the session callback + * + * To sign the JWT use the `jsonwebtoken` package: + * + * ```bash npm2yarn2pnpm + * npm install jsonwebtoken + * ``` + * + * Using the [NexthAuth.js Session callback](https://authjs.dev/reference/core/types#session) create the Supabase `access_token` and append it to the `session` object. + * + * To sign the JWT use the Supabase JWT secret which can be found in the [API settings](https://app.supabase.com/project/_/settings/api) + * + * ```js title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import { SupabaseAdapter } from "@next-auth/supabase-adapter" + * import jwt from "jsonwebtoken" + * + * // For more information on each option (and a full list of options) go to + * // https://authjs.dev/reference/configuration/auth-options + * export default NextAuth({ + * // https://authjs.dev/reference/providers/oauth-builtin + * providers: [...], + * adapter: SupabaseAdapter({ + * url: process.env.NEXT_PUBLIC_SUPABASE_URL, + * secret: process.env.SUPABASE_SERVICE_ROLE_KEY, + * }), + * callbacks: { + * async session({ session, user }) { + * const signingSecret = process.env.SUPABASE_JWT_SECRET + * if (signingSecret) { + * const payload = { + * aud: "authenticated", + * exp: Math.floor(new Date(session.expires).getTime() / 1000), + * sub: user.id, + * email: user.email, + * role: "authenticated", + * } + * session.supabaseAccessToken = jwt.sign(payload, signingSecret) + * } + * return session + * }, + * }, + * // ... + * }) + * ``` + * + * #### Inject the Supabase `access_token` JWT into the client + * + * For example, given the following public schema: + * + * ```sql + * // Note: This table contains user data. Users should only be able to view and update their own data. + * create table users ( + * -- UUID from next_auth.users + * id uuid not null primary key, + * name text, + * email text, + * image text, + * constraint "users_id_fkey" foreign key ("id") + * references next_auth.users (id) match simple + * on update no action + * on delete cascade -- if user is deleted in NextAuth they will also be deleted in our public table. + * ); + * alter table users enable row level security; + * create policy "Can view own user data." on users for select using (next_auth.uid() = id); + * create policy "Can update own user data." on users for update using (next_auth.uid() = id); + * + * // This trigger automatically creates a user entry when a new user signs up via NextAuth. + * create function public.handle_new_user() + * returns trigger as $$ + * begin + * insert into public.users (id, name, email, image) + * values (new.id, new.name, new.email, new.image); + * return new; + * end; + * $$ language plpgsql security definer; + * create trigger on_auth_user_created + * after insert on next_auth.users + * for each row execute procedure public.handle_new_user(); + * ``` + * + * The `supabaseAccessToken` is now available on the `session` object and can be passed to the supabase-js client. This works in any environment: client-side, server-side (API routes, SSR), as well as in middleware edge functions! + * + * ```js + * // ... + * // Use `useSession()` or `unstable_getServerSession()` to get the NextAuth session. + * + * const { supabaseAccessToken } = session + * + * const supabase = createClient( + * process.env.NEXT_PUBLIC_SUPABASE_URL, + * process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, + * { + * global: { + * headers: { + * Authorization: `Bearer ${supabaseAccessToken}`, + * }, + * }, + * } + * ) + * // Now you can query with RLS enabled. + * const { data, error } = await supabase.from("users").select("*") + * ``` + * ### Usage with TypeScript + * + * You can pass types that were generated with the Supabase CLI to the Supabase Client to get enhanced type safety and auto completion. + * + * Creating a new supabase client object: + * + * ```tsx + * import { createClient } from "@supabase/supabase-js" + * import { Database } from "../database.types" + * + * const supabase = createClient() + * ``` + * + * #### Extend the session type with the `supabaseAccessToken` + * + * In order to extend the `session` object with the `supabaseAccessToken` we need to extend the `session` interface in a `types/next-auth.d.ts` file: + * + * ```ts title="types/next-auth.d.ts" + * import NextAuth, { DefaultSession } from "next-auth" + * + * declare module "next-auth" { + * // Returned by `useSession`, `getSession` and received as a prop on the `SessionProvider` React Context + * interface Session { + * // A JWT which can be used as Authorization header with supabase-js for RLS. + * supabaseAccessToken?: string + * user: { + * // he user's postal address + * address: string + * } & DefaultSession["user"] + * } + * } + * ``` + */ +export function SupabaseAdapter(options: SupabaseAdapterOptions): Adapter { + const { url, secret } = options const supabase = createClient(url, secret, { db: { schema: "next_auth" }, global: { diff --git a/packages/adapter-typeorm-legacy/docs/tutorials/typeorm-custom-models.md b/packages/adapter-typeorm-legacy/docs/tutorials/typeorm-custom-models.md deleted file mode 100644 index ef1d8bda..00000000 --- a/packages/adapter-typeorm-legacy/docs/tutorials/typeorm-custom-models.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -id: typeorm-custom-models -title: Custom models with TypeORM ---- - -NextAuth.js provides a set of [models and schemas](/schemas/models) for the built-in TypeORM adapter that you can easily extend. - -You can use these models with MySQL, MariaDB, Postgres, MongoDB and SQLite. - -## Creating custom models - -```js title="models/User.js" -import adapter from "@next-auth/typeorm-legacy-adapter" - -// Extend the built-in models using class inheritance -export default class User extends adapter.Models.User.model { - // You can extend the options in a model but you should not remove the base - // properties or change the order of the built-in options on the constructor - constructor(profile) { - super(profile) - // Add custom fields to the User model - this.firstName = profile?.firstName - this.lastName = profile?.lastName - this.userType = profile?.userType - this.phoneNumber = profile?.phoneNumber - } -} - -export const UserSchema = { - name: "User", - target: User, - columns: { - ...adapter.Models.User.schema.columns, - // Add custom fields to the User schema - firstName: { - type: "varchar", - nullable: true, - }, - lastName: { - type: "varchar", - nullable: true, - }, - userType: { - type: "varchar", - nullable: true, - }, - phoneNumber: { - type: "varchar", - nullable: true, - }, - }, -} -``` - -```js title="models/index.js" -// To make importing them easier, you can export all models from single file -import User, { UserSchema } from "./User" - -export default { - User: { - model: User, - schema: UserSchema, - }, -} -``` - -:::note -[View source for built-in TypeORM models and schemas](https://github.com/nextauthjs/adapters/tree/canary/packages/typeorm-legacy/src/models) -::: - -## Using custom models - -You can use custom models by specifying the TypeORM adapter explicitly and passing them as an option. - -```js title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import Providers from "next-auth/providers" -import adapter from "@next-auth/typeorm-legacy-adapter" - -import Models from "../../../models" - -export default NextAuth({ - providers: [ - // Your providers - ], - - adapter: adapter.Adapter( - // The first argument should be a database connection string or TypeORM config object - "mysql://username:password@127.0.0.1:3306/database_name", - // The second argument can be used to pass custom models and schemas - { - models: { - User: Models.User, - }, - } - ), -}) -``` - -## Adding custom fields from Providers - -You can adjust the shape of the profile that is passed to the custom `User` model with the providers `profile` method. - -```js title="pages/api/auth/[...nextauth].js" -import NextAuth from "next-auth" -import Providers from "next-auth/providers" - -export default NextAuth({ - providers: [ - Providers.LinkedIn({ - clientId: process.env.LINKEDIN_CLIENT_ID, - clientSecret: process.env.LINKEDIN_CLIENT_SECRET, - profileUrl: - "https://api.linkedin.com/v2/me?projection=(id,localizedFirstName,localizedLastName)", - // - profile: (profile, tokens) => { - return { - id: profile.id, - name: profile.localizedFirstName + " " + profile.localizedLastName, - email: null, - image: null, - // custom fields - firstName: profile.localizedFirstName, - lastName: profile.localizedLastName, - } - }, - }), - ], -}) -``` diff --git a/packages/adapter-typeorm-legacy/src/index.ts b/packages/adapter-typeorm-legacy/src/index.ts index 624bbbf6..c9c69cec 100644 --- a/packages/adapter-typeorm-legacy/src/index.ts +++ b/packages/adapter-typeorm-legacy/src/index.ts @@ -64,7 +64,7 @@ export async function getManager(options: { } /** - * ## Usage + * ## Setup * * Configure Auth.js to use the TypeORM Adapter: * @@ -81,13 +81,15 @@ export async function getManager(options: { * * `TypeORMLegacyAdapter` takes either a connection string, or a [`ConnectionOptions`](https://github.com/typeorm/typeorm/blob/master/docs/connection-options.md) object as its first parameter. * - * ## Custom models + * ## Advanced usage + * + * ### Custom models * * The TypeORM adapter uses [`Entity` classes](https://github.com/typeorm/typeorm/blob/master/docs/entities.md) to define the shape of your data. * * If you want to override the default entities (for example to add a `role` field to your `UserEntity`), you will have to do the following: * - * > This schema is adapted for use in TypeORM and based upon our main [schema](/reference/adapters/models) + * > This schema is adapted for use in TypeORM and based upon our main [schema](https://authjs.dev/reference/adapters#models) * * 1. Create a file containing your modified entities: * @@ -250,7 +252,7 @@ export async function getManager(options: { * `synchronize: true` should not be enabled against production databases as it may cause data loss if the configured schema does not match the expected schema! We recommend that you synchronize/migrate your production database at build-time. * ::: * - * ## Naming Conventions + * ### Naming Conventions * * If mixed snake_case and camelCase column names are an issue for you and/or your underlying database system, we recommend using TypeORM's naming strategy feature to change the target field names. There is a package called `typeorm-naming-strategies` which includes a `snake_case` strategy which will translate the fields from how Auth.js expects them, to snake_case in the actual database. * diff --git a/packages/adapter-upstash-redis/src/index.ts b/packages/adapter-upstash-redis/src/index.ts index 349f6e13..bfba9593 100644 --- a/packages/adapter-upstash-redis/src/index.ts +++ b/packages/adapter-upstash-redis/src/index.ts @@ -1,3 +1,19 @@ +/** + *
+ *

Official Upstash Redis adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * npm install @upstash/redis @next-auth/upstash-redis-adapter + * ``` + * + * @module @next-auth/upstash-redis-adapter + */ import type { Adapter, AdapterUser, @@ -9,14 +25,39 @@ import type { Redis } from "@upstash/redis" import { v4 as uuid } from "uuid" +/** This is the interface of the Upstash Redis adapter options. */ export interface UpstashRedisAdapterOptions { + /** + * The base prefix for your keys + */ baseKeyPrefix?: string + /** + * The prefix for the `account` key + */ accountKeyPrefix?: string + /** + * The prefix for the `accountByUserId` key + */ accountByUserIdPrefix?: string + /** + * The prefix for the `emailKey` key + */ emailKeyPrefix?: string + /** + * The prefix for the `sessionKey` key + */ sessionKeyPrefix?: string + /** + * The prefix for the `sessionByUserId` key + */ sessionByUserIdKeyPrefix?: string + /** + * The prefix for the `user` key + */ userKeyPrefix?: string + /** + * The prefix for the `verificationToken` key + */ verificationTokenKeyPrefix?: string } @@ -44,6 +85,68 @@ export function hydrateDates(json: object) { }, {} as any) } +/** + * ## Setup + * + * Configure Auth.js to use the Upstash Redis Adapter: + * + * ```javascript title="pages/api/auth/[...nextauth].js" + * import NextAuth from "next-auth" + * import GoogleProvider from "next-auth/providers/google" + * import { UpstashRedisAdapter } from "@next-auth/upstash-redis-adapter" + * import upstashRedisClient from "@upstash/redis" + * + * const redis = upstashRedisClient( + * process.env.UPSTASH_REDIS_URL, + * process.env.UPSTASH_REDIS_TOKEN + * ) + * + * export default NextAuth({ + * adapter: UpstashRedisAdapter(redis), + * providers: [ + * GoogleProvider({ + * clientId: process.env.GOOGLE_CLIENT_ID, + * clientSecret: process.env.GOOGLE_CLIENT_SECRET, + * }), + * ], + * }) + * ``` + * + * ## Advanced usage + * + * ### Using multiple apps with a single Upstash Redis instance + * + * The Upstash free-tier allows for only one Redis instance. If you have multiple Auth.js connected apps using this instance, you need different key prefixes for every app. + * + * You can change the prefixes by passing an `options` object as the second argument to the adapter factory function. + * + * The default values for this object are: + * + * ```js + * const defaultOptions = { + * baseKeyPrefix: "", + * accountKeyPrefix: "user:account:", + * accountByUserIdPrefix: "user:account:by-user-id:", + * emailKeyPrefix: "user:email:", + * sessionKeyPrefix: "user:session:", + * sessionByUserIdKeyPrefix: "user:session:by-user-id:", + * userKeyPrefix: "user:", + * verificationTokenKeyPrefix: "user:token:", + * } + * ``` + * + * Usually changing the `baseKeyPrefix` should be enough for this scenario, but for more custom setups, you can also change the prefixes of every single key. + * + * Example: + * + * ```js + * export default NextAuth({ + * ... + * adapter: UpstashRedisAdapter(redis, {baseKeyPrefix: "app2:"}) + * ... + * }) + * ``` + */ export function UpstashRedisAdapter( client: Redis, options: UpstashRedisAdapterOptions = {} diff --git a/packages/adapter-xata/src/index.ts b/packages/adapter-xata/src/index.ts index e11763fd..860c728d 100644 --- a/packages/adapter-xata/src/index.ts +++ b/packages/adapter-xata/src/index.ts @@ -1,7 +1,243 @@ +/** + *
+ *

Official Xata adapter for Auth.js / NextAuth.js.

+ * + * + * + *
+ * + * ## Installation + * + * ```bash npm2yarn2pnpm + * # Install Auth.js and the Xata adapter + * npm install next-auth @next-auth/xata-adapter + * + * # Install the Xata CLI globally if you don't already have it + * npm install --location=global @xata.io/cli + * + * # Login + * xata auth login + * ``` + * + * @module @next-auth/xata-adapter + */ import type { Adapter } from "next-auth/adapters" import type { XataClient } from "./xata" +/** + * ## Setup + * + * This adapter allows using Auth.js with Xata as a database to store users, sessions, and more. The preferred way to create a Xata project and use Xata databases is using the [Xata Command Line Interface (CLI)](https://docs.xata.io/cli/getting-started). + * + * The CLI allows generating a `XataClient` that will help you work with Xata in a safe way, and that this adapter depends on. + * + * When you're ready, let's create a new Xata project using our Auth.js schema that the Xata adapter can work with. To do that, copy and paste this schema file into your project's directory: + * + * ```json title="schema.json" + * { + * "tables": [ + * { + * "name": "nextauth_users", + * "columns": [ + * { + * "name": "email", + * "type": "email" + * }, + * { + * "name": "emailVerified", + * "type": "datetime" + * }, + * { + * "name": "name", + * "type": "string" + * }, + * { + * "name": "image", + * "type": "string" + * } + * ] + * }, + * { + * "name": "nextauth_accounts", + * "columns": [ + * { + * "name": "user", + * "type": "link", + * "link": { + * "table": "nextauth_users" + * } + * }, + * { + * "name": "type", + * "type": "string" + * }, + * { + * "name": "provider", + * "type": "string" + * }, + * { + * "name": "providerAccountId", + * "type": "string" + * }, + * { + * "name": "refresh_token", + * "type": "string" + * }, + * { + * "name": "access_token", + * "type": "string" + * }, + * { + * "name": "expires_at", + * "type": "int" + * }, + * { + * "name": "token_type", + * "type": "string" + * }, + * { + * "name": "scope", + * "type": "string" + * }, + * { + * "name": "id_token", + * "type": "text" + * }, + * { + * "name": "session_state", + * "type": "string" + * } + * ] + * }, + * { + * "name": "nextauth_verificationTokens", + * "columns": [ + * { + * "name": "identifier", + * "type": "string" + * }, + * { + * "name": "token", + * "type": "string" + * }, + * { + * "name": "expires", + * "type": "datetime" + * } + * ] + * }, + * { + * "name": "nextauth_users_accounts", + * "columns": [ + * { + * "name": "user", + * "type": "link", + * "link": { + * "table": "nextauth_users" + * } + * }, + * { + * "name": "account", + * "type": "link", + * "link": { + * "table": "nextauth_accounts" + * } + * } + * ] + * }, + * { + * "name": "nextauth_users_sessions", + * "columns": [ + * { + * "name": "user", + * "type": "link", + * "link": { + * "table": "nextauth_users" + * } + * }, + * { + * "name": "session", + * "type": "link", + * "link": { + * "table": "nextauth_sessions" + * } + * } + * ] + * }, + * { + * "name": "nextauth_sessions", + * "columns": [ + * { + * "name": "sessionToken", + * "type": "string" + * }, + * { + * "name": "expires", + * "type": "datetime" + * }, + * { + * "name": "user", + * "type": "link", + * "link": { + * "table": "nextauth_users" + * } + * } + * ] + * } + * ] + * } + * ``` + * + * Now, run the following command: + * + * ```bash + * xata init --schema=./path/to/your/schema.json + * ``` + * + * The CLI will walk you through a setup process where you choose a [workspace](https://docs.xata.io/concepts/workspaces) (kind of like a GitHub org or a Vercel team) and an appropriate database. We recommend using a fresh database for this, as we'll augment it with tables that Auth.js needs. + * + * Once you're done, you can continue using Auth.js in your project as expected, like creating a `./pages/api/auth/[...nextauth]` route. + * + * ```typescript title="pages/api/auth/[...nextauth].ts" + * import NextAuth from "next-auth" + * import GoogleProvider from "next-auth/providers/google" + * + * const client = new XataClient() + * + * export default NextAuth({ + * providers: [ + * GoogleProvider({ + * clientId: process.env.GOOGLE_CLIENT_ID, + * clientSecret: process.env.GOOGLE_CLIENT_SECRET, + * }), + * ], + * }) + * ``` + * + * Now to Xata-fy this route, let's add the Xata client and adapter: + * + * ```diff + * import NextAuth from "next-auth" + * import GoogleProvider from "next-auth/providers/google" + * +import { XataAdapter } from "@next-auth/xata-adapter" + * +import { XataClient } from "../../../xata" // or wherever you've chosen to create the client + * + * +const client = new XataClient() + * + * export default NextAuth({ + * + adapter: XataAdapter(client), + * providers: [ + * GoogleProvider({ + * clientId: process.env.GOOGLE_CLIENT_ID, + * clientSecret: process.env.GOOGLE_CLIENT_SECRET, + * }), + * ], + * }) + * ``` + * + * This fully sets up your Auth.js app to work with Xata. + */ export function XataAdapter(client: XataClient): Adapter { return { async createUser(user) { diff --git a/turbo.json b/turbo.json index cb597228..ed51f588 100644 --- a/turbo.json +++ b/turbo.json @@ -62,10 +62,16 @@ "@next-auth/dynamodb-adapter#build", "@next-auth/fauna-adapter#build", "@next-auth/firebase-adapter#build", + "@next-auth/mikro-orm-adapter#build", "@next-auth/mongodb-adapter#build", - "@next-auth/prisma-adapter#build", + "@next-auth/neo4j-adapter#build", "@next-auth/pouchdb-adapter#build", + "@next-auth/prisma-adapter#build", + "@next-auth/sequelize-adapter#build", + "@next-auth/supabase-adapter#build", "@next-auth/typeorm-legacy-adapter#build", + "@next-auth/upstash-redis-adapter#build", + "@next-auth/xata-adapter#build", "next-auth#build" ], "outputs": [ From 93f3fcd1b746450489a755d4326f6e3904d34a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Tue, 21 Mar 2023 19:38:50 +0100 Subject: [PATCH 49/80] chore: update TypeDoc --- docs/package.json | 4 ++-- pnpm-lock.yaml | 54 +++++++++++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/docs/package.json b/docs/package.json index c1ea3ec4..88fb2ea0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -35,8 +35,8 @@ "@docusaurus/theme-mermaid": "2.3.1", "@docusaurus/types": "2.3.1", "docusaurus-plugin-typedoc": "1.0.0-next.2", - "typedoc": "^0.23.24", - "typedoc-plugin-markdown": "4.0.0-next.2" + "typedoc": "^0.23.28", + "typedoc-plugin-markdown": "4.0.0-next.3" }, "browserslist": { "production": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2bb06db1..3a477ce3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -179,8 +179,8 @@ importers: react-dom: ^18.2.0 react-marquee-slider: ^1.1.5 styled-components: 5.3.6 - typedoc: ^0.23.24 - typedoc-plugin-markdown: 4.0.0-next.2 + typedoc: ^0.23.28 + typedoc-plugin-markdown: 4.0.0-next.3 dependencies: '@mdx-js/react': 1.6.22_react@18.2.0 '@sapphire/docusaurus-plugin-npm2yarn2pnpm': 1.1.4 @@ -200,9 +200,9 @@ importers: '@docusaurus/theme-common': 2.3.1_pmmuy6rkkayfggimpcjiffhloy '@docusaurus/theme-mermaid': 2.3.1_biqbaboplfbrettd7655fr4n2y '@docusaurus/types': 2.3.1_biqbaboplfbrettd7655fr4n2y - docusaurus-plugin-typedoc: 1.0.0-next.2_kb65gbyd32jlgdze2tbrhv364a - typedoc: 0.23.24 - typedoc-plugin-markdown: 4.0.0-next.2_typedoc@0.23.24 + docusaurus-plugin-typedoc: 1.0.0-next.2_uohvtzr4yhotvxhnypob3homwy + typedoc: 0.23.28 + typedoc-plugin-markdown: 4.0.0-next.3_typedoc@0.23.28 packages/adapter-dgraph: specifiers: @@ -11788,6 +11788,10 @@ packages: engines: {node: '>=12'} dev: true + /ansi-sequence-parser/1.1.0: + resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} + dev: true + /ansi-styles/2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} @@ -12161,7 +12165,7 @@ packages: /axios/0.21.4_debug@4.3.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.1_debug@4.3.4 + follow-redirects: 1.15.1 transitivePeerDependencies: - debug @@ -15513,14 +15517,14 @@ packages: dependencies: esutils: 2.0.3 - /docusaurus-plugin-typedoc/1.0.0-next.2_kb65gbyd32jlgdze2tbrhv364a: + /docusaurus-plugin-typedoc/1.0.0-next.2_uohvtzr4yhotvxhnypob3homwy: resolution: {integrity: sha512-JQOdw8U7Ix1lETgmlgkm1WpUrpmsTthWSQlMJRYiEnX06s2g/wSE+cg1JcP5ILAyeTjxDlF/DPwtOBIzTuzSTg==} peerDependencies: typedoc: '>=0.23.0' typedoc-plugin-markdown: '>=4.0.0-next.2' dependencies: - typedoc: 0.23.24 - typedoc-plugin-markdown: 4.0.0-next.2_typedoc@0.23.24 + typedoc: 0.23.28 + typedoc-plugin-markdown: 4.0.0-next.3_typedoc@0.23.28 dev: true /dom-accessibility-api/0.5.14: @@ -17965,7 +17969,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: true /follow-redirects/1.15.1_debug@4.3.4: resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} @@ -17977,6 +17980,7 @@ packages: optional: true dependencies: debug: 4.3.4 + dev: true /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -19765,7 +19769,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.1_debug@4.3.4 + follow-redirects: 1.15.1 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -24142,6 +24146,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch/7.4.2: + resolution: {integrity: sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -28995,9 +29006,10 @@ packages: rechoir: 0.6.2 dev: true - /shiki/0.12.1: - resolution: {integrity: sha512-aieaV1m349rZINEBkjxh2QbBvFFQOlgqYTNtCal82hHj4dDZ76oMlQIX+C7ryerBTDiga3e5NfH6smjdJ02BbQ==} + /shiki/0.14.1: + resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} dependencies: + ansi-sequence-parser: 1.1.0 jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 @@ -31041,25 +31053,25 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: false - /typedoc-plugin-markdown/4.0.0-next.2_typedoc@0.23.24: - resolution: {integrity: sha512-5Uz3/Wq2syMKh1OiLxqrj7GXz0vwfxjJiyRW3QATrbpwTiRY+5v5n735+FgR5NQyLSoANGqAwMmSxpVnvFqamA==} + /typedoc-plugin-markdown/4.0.0-next.3_typedoc@0.23.28: + resolution: {integrity: sha512-Koim98xkXOoY8KPlMNH/cKTfqTEocVEYMa3XZgoPX/DkGp7ioB6nl38p6Snl7rEmhcbHkFktcUoOQLn04Kk3sg==} peerDependencies: typedoc: '>=0.23.0' dependencies: - typedoc: 0.23.24 + typedoc: 0.23.28 dev: true - /typedoc/0.23.24: - resolution: {integrity: sha512-bfmy8lNQh+WrPYcJbtjQ6JEEsVl/ce1ZIXyXhyW+a1vFrjO39t6J8sL/d6FfAGrJTc7McCXgk9AanYBSNvLdIA==} + /typedoc/0.23.28: + resolution: {integrity: sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==} engines: {node: '>= 14.14'} hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x dependencies: lunr: 2.3.9 marked: 4.2.12 - minimatch: 5.1.6 - shiki: 0.12.1 + minimatch: 7.4.2 + shiki: 0.14.1 dev: true /typeorm-naming-strategies/4.1.0_typeorm@0.3.7: From dc5f3e1873bc8c001ad755469e40754a47022243 Mon Sep 17 00:00:00 2001 From: Nikhil Dev Chunchu Date: Wed, 22 Mar 2023 10:30:56 +0200 Subject: [PATCH 50/80] chore(docs): update using-a-database-adapter.md (#7028) Update using-a-database-adapter.md --- docs/docs/guides/adapters/using-a-database-adapter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/adapters/using-a-database-adapter.md b/docs/docs/guides/adapters/using-a-database-adapter.md index f5a13c54..e10baf56 100644 --- a/docs/docs/guides/adapters/using-a-database-adapter.md +++ b/docs/docs/guides/adapters/using-a-database-adapter.md @@ -10,4 +10,4 @@ When using a database, you can still use JWT for session handling for fast acces We have a list of official adapters that are distributed as their own packages under the `@next-auth/{name}-adapter` namespace. Their source code is available in their various adapters package directories at [`nextauthjs/next-auth`](https://github.com/nextauthjs/next-auth/tree/main/packages): -- [All available adapters](/reference/adapters/overview) +- [All available adapters](/reference/adapters) From 380f2de961a90ab8656a2f0c67b7bcdbeaf48a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 03:29:29 +0100 Subject: [PATCH 51/80] docs: add API reference overview --- docs/docs/reference/index.md | 32 ++++++++++++++++++++++++++++++++ docs/docusaurus.config.js | 6 ++---- 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 docs/docs/reference/index.md diff --git a/docs/docs/reference/index.md b/docs/docs/reference/index.md new file mode 100644 index 00000000..ece1aa18 --- /dev/null +++ b/docs/docs/reference/index.md @@ -0,0 +1,32 @@ +--- +title: API Reference +--- + +This section of the documentation contains the API reference for all the official packages under the `@auth/*` and `@next-auth/*` scopes. + +:::warning +The API reference is being migrated from the [old documentation page](https://next-auth.js.org), so there are going to be references to `next-auth` still. We are continuously working on updating the naming/references. +::: + +## Roadmap + +Here are the _currently_ planned and released packages under the `@auth/*` scope. This is not an exhaustive list, but the set of packages that we would like to focus on to begin with. + +| Feature | Status | +| ------------------- | -------- | +| `@auth/nextjs` | Planned | +| `@auth/*-adapter` | Planned | +| `@auth/core` | Experimental | +| `@auth/sveltekit` | Experimental | +| `@auth/solid-start` | Experimental | + +### Community Packages + +While we are migrating the documentation and working on stabilizing the core package, the community has been working on some packages that are already available. With collaboration, we hope to make these packages official in the future. + +:::note +If you are a maintainer of a package, [reach out](https://twitter.com/balazsorban44) if you want to collaborate on making it official or open a PR to add it to the list below, so others can discover it more easily. +::: + +- ... +- ... \ No newline at end of file diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 19cd9503..8fd18ecc 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -93,11 +93,9 @@ const docusaurusConfig = { position: "left", }, { - to: "/reference/core", - // TODO: change to this when the overview page looks better. - // to: "/reference", + to: "/reference", activeBasePath: "/reference", - label: "Reference", + label: "API Reference", position: "left", }, { From d644d1fcbf0fbaf0572767cd51d03db8906f105d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 03:43:15 +0100 Subject: [PATCH 52/80] docs: add sidebar to API reference --- docs/sidebars.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/sidebars.js b/docs/sidebars.js index 7bb65e76..8d035352 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -14,6 +14,11 @@ module.exports = { }, ], referenceSidebar: [ + { + type: "doc", + id: "reference/index", + label: "Overview", + }, { type: "category", label: "@auth/core", From 06b8d4772c7bbc13d4514d6f4e956133730173cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 03:44:59 +0100 Subject: [PATCH 53/80] docs: simplify --- docs/docs/reference/index.md | 2 +- docs/sidebars.js | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/docs/reference/index.md b/docs/docs/reference/index.md index ece1aa18..0f090dd2 100644 --- a/docs/docs/reference/index.md +++ b/docs/docs/reference/index.md @@ -1,5 +1,5 @@ --- -title: API Reference +title: Overview --- This section of the documentation contains the API reference for all the official packages under the `@auth/*` and `@next-auth/*` scopes. diff --git a/docs/sidebars.js b/docs/sidebars.js index 8d035352..9eccef96 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -14,11 +14,7 @@ module.exports = { }, ], referenceSidebar: [ - { - type: "doc", - id: "reference/index", - label: "Overview", - }, + "reference/index", { type: "category", label: "@auth/core", From cc13df9d5107b9fa6d66e9ecf0f86dd4a86d007f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 12:42:41 +0100 Subject: [PATCH 54/80] docs: tweak announcement bar --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 8fd18ecc..f940d2c4 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -130,7 +130,7 @@ const docusaurusConfig = { announcementBar: { id: "new-major-announcement", content: - "NextAuth.js is becoming Auth.js! 🎉 We're creating Authentication for the Web. Everyone included. Starting with SvelteKit, check out the docs. Note, this site is under active development.", + "NextAuth.js is becoming Auth.js! 🎉 Read the announcement. Note, this site is under active development. 🏗", backgroundColor: "#000", textColor: "#fff", }, From a6b4d958ac26621542b2b607dd0243f73f9148d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 12:42:52 +0100 Subject: [PATCH 55/80] docs: open basics guides by default --- docs/docs/guides/basics/_category_.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/basics/_category_.json b/docs/docs/guides/basics/_category_.json index 2be9bd81..2209bc23 100644 --- a/docs/docs/guides/basics/_category_.json +++ b/docs/docs/guides/basics/_category_.json @@ -1,5 +1,5 @@ { "label": "Basics", "collapsible": true, - "collapsed": true + "collapsed": false } From 40a0faa5868809b2677327992fc428f19decba0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 12:43:08 +0100 Subject: [PATCH 56/80] docs: remove outdated guides --- docs/docs/guides/other/_category_.json | 5 -- docs/docs/guides/other/ldap-auth.md | 79 ------------------- .../other/usage-with-class-components.md | 60 -------------- 3 files changed, 144 deletions(-) delete mode 100644 docs/docs/guides/other/_category_.json delete mode 100644 docs/docs/guides/other/ldap-auth.md delete mode 100644 docs/docs/guides/other/usage-with-class-components.md diff --git a/docs/docs/guides/other/_category_.json b/docs/docs/guides/other/_category_.json deleted file mode 100644 index 7b46477f..00000000 --- a/docs/docs/guides/other/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Other", - "collapsible": true, - "collapsed": true -} diff --git a/docs/docs/guides/other/ldap-auth.md b/docs/docs/guides/other/ldap-auth.md deleted file mode 100644 index c16d2818..00000000 --- a/docs/docs/guides/other/ldap-auth.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: LDAP Authentication ---- - -Auth.js provides the ability to setup a [custom Credential provider](/guides/providers/credentials) which we can take advantage of to authenticate users against an existing LDAP server. - -You will need an additional dependency, `ldapjs`, which you can install by running - -```bash npm2yarn2pnpm -npm install ldapjs -``` - -Then you must setup the `CredentialsProvider()` provider key like so: - -```js title="[...nextauth].js" -const ldap = require("ldapjs") -import NextAuth from "next-auth" -import CredentialsProvider from "next-auth/providers/credentials" - -export default NextAuth({ - providers: [ - CredentialsProvider({ - name: "LDAP", - credentials: { - username: { label: "DN", type: "text", placeholder: "" }, - password: { label: "Password", type: "password" }, - }, - async authorize(credentials, req) { - // You might want to pull this call out so we're not making a new LDAP client on every login attempt - const client = ldap.createClient({ - url: process.env.LDAP_URI, - }) - - // Essentially promisify the LDAPJS client.bind function - return new Promise((resolve, reject) => { - client.bind(credentials.username, credentials.password, (error) => { - if (error) { - console.error("Failed") - reject() - } else { - console.log("Logged in") - resolve({ - username: credentials.username, - password: credentials.password, - }) - } - }) - }) - }, - }), - ], - callbacks: { - async jwt({ token, user }) { - const isSignIn = user ? true : false - if (isSignIn) { - token.username = user.username - token.password = user.password - } - return token - }, - async session({ session, token }) { - return { ...session, user: { username: token.username } } - }, - }, -}) -``` - -The idea is that once one is authenticated with the LDAP server, one can pass through both the username/DN and password to the JWT stored in the browser. - -This is then passed back to any API routes and retrieved as such: - -```js title="/pages/api/doLDAPWork.js" -token = await jwt.getToken({ - req, -}) -const { username, password } = token -``` - -> Thanks to [Winwardo](https://github.com/Winwardo) for the code example diff --git a/docs/docs/guides/other/usage-with-class-components.md b/docs/docs/guides/other/usage-with-class-components.md deleted file mode 100644 index 71fe74ed..00000000 --- a/docs/docs/guides/other/usage-with-class-components.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Usage with class components ---- - -If you want to use the [`useSession()`](/reference/react/#usesession) hook in your class components you can do so with the help of a higher order component or with a render prop. - -## Higher Order Component - -```js -import { useSession } from "next-auth/react" - -const withSession = (Component) => (props) => { - const session = useSession() - - // if the component has a render property, we are good - if (Component.prototype.render) { - return - } - - // if the passed component is a function component, there is no need for this wrapper - throw new Error( - [ - "You passed a function component, `withSession` is not needed.", - "You can `useSession` directly in your component.", - ].join("\n") - ) -} - -// Usage -class ClassComponent extends React.Component { - render() { - const { data: session, status } = this.props.session - return null - } -} - -const ClassComponentWithSession = withSession(ClassComponent) -``` - -## Render Prop - -```js -import { useSession } from "next-auth/react" - -const UseSession = ({ children }) => { - const session = useSession() - return children(session) -} - -// Usage -class ClassComponent extends React.Component { - render() { - return ( - - {(session) =>
{JSON.stringify(session, null, 2)}
} -
- ) - } -} -``` From 2830b7de5bd112442089d2108893c53b3086b2cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 12:43:23 +0100 Subject: [PATCH 57/80] docs: fix some typos --- docs/docs/guides/providers/credentials-provider.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/guides/providers/credentials-provider.md b/docs/docs/guides/providers/credentials-provider.md index 3fcf2e8b..2ef27455 100644 --- a/docs/docs/guides/providers/credentials-provider.md +++ b/docs/docs/guides/providers/credentials-provider.md @@ -3,14 +3,14 @@ id: credentials title: Credentials Provider --- -The Credentials provider allows you to handle signing in with arbitrary credentials, such as a username and password, domain, or two factor authentication or hardware device (e.g. YubiKey U2F / FIDO). +The Credentials provider allows you to handle signing in with arbitrary credentials, such as a username and password, domain, or two-factor authentication or hardware device (e.g. YubiKey U2F / FIDO). It is intended to support use cases where you have an existing system you need to authenticate users against. It comes with the constraint that users authenticated in this manner are not persisted in the database, and consequently that the Credentials provider can only be used if JSON Web Tokens are enabled for sessions. :::warning -The functionality provided for credentials based authentication is intentionally limited to discourage use of passwords due to the inherent security risks associated with them and the additional complexity associated with supporting usernames and passwords. +The functionality provided for credentials-based authentication is intentionally limited to discourage the use of passwords due to the inherent security risks associated with them and the additional complexity associated with supporting usernames and passwords. ::: ## Options @@ -33,7 +33,7 @@ If you return an object it will be persisted to the JSON Web Token and the user 3. If you throw an Error, the user will be sent to the error page with the error message as a query parameter. -The Credentials provider's `authorize()` method also provides the request object as the second parameter (see example below). +The Credentials provider's `authorize()` method also provides the request object as the second parameter (see the example below). ```js title="pages/api/auth/[...nextauth].js" import CredentialsProvider from "next-auth/providers/credentials"; @@ -89,7 +89,7 @@ You can specify more than one credentials provider by specifying a unique `id` f You can also use them in conjunction with other provider options. -As with all providers, the order you specify them is the order they are displayed on the sign in page. +As with all providers, the order you specify is the order they are displayed on the sign-in page. ```js providers: [ From 856b5c50fcfe8b52532d05f1210a546d9fd999b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 12:43:40 +0100 Subject: [PATCH 58/80] docs: change section title --- docs/docs/guides/providers/custom-provider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/providers/custom-provider.md b/docs/docs/guides/providers/custom-provider.md index 681eb9fd..4b84d627 100644 --- a/docs/docs/guides/providers/custom-provider.md +++ b/docs/docs/guides/providers/custom-provider.md @@ -1,5 +1,5 @@ --- -title: Customized OAuth Provider +title: OAuth Provider --- Auth.js comes with a set of built-in OAuth providers that you can import from `@auth/core/providers/*`. Every provider has their separate documentation page under the [core package's API Reference](/reference/core) From 69398e2d3ae043409778c0d233abd385ca9ad521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 12:43:56 +0100 Subject: [PATCH 59/80] docs: clarify guides overview --- docs/docs/guides/index.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/docs/guides/index.md b/docs/docs/guides/index.md index e496d88f..2bef32c7 100644 --- a/docs/docs/guides/index.md +++ b/docs/docs/guides/index.md @@ -1,9 +1,12 @@ --- title: Overview -sidebar_label: Guides sidebar_position: 0 --- -We're creating internal guides to help understand how to use Auth.js and all the possible configurations and uses cases it supports. +This section contains guides for common use cases. -If you can't find what you're looking for, [raise an issue](https://github.com/nextauthjs/next-auth/issues/new/choose) then take a look at our third-party [community resources](/guides/resources). +If you can't find what you're looking for, [raise an issue](https://github.com/nextauthjs/next-auth/issues/new?assignees=&labels=triage%2Cdocumentation&template=4_documentation.yml). + +:::warning +Guides are being migrated from the [old documentation page](https://next-auth.js.org), so there are going to be references to `next-auth` still. We are continuously working on updating the naming/references. +::: \ No newline at end of file From d1cf701ed98f29cbeabc4c1be113e02096158c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 24 Mar 2023 12:46:02 +0100 Subject: [PATCH 60/80] docs: change admonition titles --- docs/docs/guides/index.md | 2 +- docs/docs/reference/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/guides/index.md b/docs/docs/guides/index.md index 2bef32c7..484a4753 100644 --- a/docs/docs/guides/index.md +++ b/docs/docs/guides/index.md @@ -7,6 +7,6 @@ This section contains guides for common use cases. If you can't find what you're looking for, [raise an issue](https://github.com/nextauthjs/next-auth/issues/new?assignees=&labels=triage%2Cdocumentation&template=4_documentation.yml). -:::warning +:::warning Warning Guides are being migrated from the [old documentation page](https://next-auth.js.org), so there are going to be references to `next-auth` still. We are continuously working on updating the naming/references. ::: \ No newline at end of file diff --git a/docs/docs/reference/index.md b/docs/docs/reference/index.md index 0f090dd2..d411c688 100644 --- a/docs/docs/reference/index.md +++ b/docs/docs/reference/index.md @@ -4,7 +4,7 @@ title: Overview This section of the documentation contains the API reference for all the official packages under the `@auth/*` and `@next-auth/*` scopes. -:::warning +:::warning Warning The API reference is being migrated from the [old documentation page](https://next-auth.js.org), so there are going to be references to `next-auth` still. We are continuously working on updating the naming/references. ::: From c580f0db22e2cae5aa84e3b7bf2e945fa5ed7688 Mon Sep 17 00:00:00 2001 From: Jabed Zaman Date: Sun, 26 Mar 2023 01:45:38 +0530 Subject: [PATCH 61/80] docs: fix `session.user` is possibly `undefined`. (#7058) fixed the code snippet for the example to consume session via hooks. Threw an error earlier stating 'session.user' is possibly 'undefined'. --- docs/docs/getting-started/oauth-tutorial.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/getting-started/oauth-tutorial.mdx b/docs/docs/getting-started/oauth-tutorial.mdx index 7b081a93..0bbb3251 100644 --- a/docs/docs/getting-started/oauth-tutorial.mdx +++ b/docs/docs/getting-started/oauth-tutorial.mdx @@ -128,7 +128,7 @@ import { useSession, signIn, signOut } from "next-auth/react" export default function CamperVanPage() { const { data: session, status } = useSession() - const userEmail = session?.user.email + const userEmail = session?.user?.email if (status === "loading") { return

Hang on there...

From 1954258a0a5ef214eadf8a12180349cc043c57e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Sun, 26 Mar 2023 03:46:51 +0200 Subject: [PATCH 62/80] docs: make security page top-level --- docs/docs/concepts/faq.md | 2 +- docs/docs/{getting-started => }/security.md | 19 ++++++++++++------- docs/docusaurus.config.js | 6 ++++++ 3 files changed, 19 insertions(+), 8 deletions(-) rename docs/docs/{getting-started => }/security.md (58%) diff --git a/docs/docs/concepts/faq.md b/docs/docs/concepts/faq.md index f7d6649a..4279eb7e 100644 --- a/docs/docs/concepts/faq.md +++ b/docs/docs/concepts/faq.md @@ -174,7 +174,7 @@ If you are deploying directly to a particular cloud platform you may also want t ## Security -Parts of this section has been moved to its [own page](/getting-started/security). +Parts of this section has been moved to its [own page](/security).
diff --git a/docs/docs/getting-started/security.md b/docs/docs/security.md similarity index 58% rename from docs/docs/getting-started/security.md rename to docs/docs/security.md index c45442db..daadf013 100644 --- a/docs/docs/getting-started/security.md +++ b/docs/docs/security.md @@ -2,6 +2,16 @@ title: Security --- +## Supported Versions + +Security updates are only released for the current version. + +Old releases are not maintained and do not receive updates. + +:::caution +`@auth/*` packages are currently under development and - unless stated otherwise - they are not considered ready for production yet. That said, we encourage you to reach out to us if you have any questions or concerns via the below-mentioned channels. We are committed to making Auth.js a secure and reliable solution for your authentication needs. +::: + ## Reporting a Vulnerability Auth.js practices responsible disclosure. @@ -13,16 +23,11 @@ If you contact us regarding a serious issue: - We will endeavor to get back to you within 72 hours. - We will aim to publish a fix within 30 days. - We will disclose the issue (and credit you, with your consent) once a fix to resolve the issue has been released. -- If 90 days has elapsed and we still don't have a fix, we will disclose the issue publicly. +- If 90 days have elapsed and we still don't have a fix, we will disclose the issue publicly. -The best way to report an issue is by contacting us via email at info@balazsorban.com or me@iaincollins.com and yo@ndo.dev, or raise a public issue requesting someone get in touch with you via whatever means you prefer for more details. (Please do not disclose sensitive details publicly at this stage.) +The best way to report an issue is by contacting us via email at info@balazsorban.com, hi@thvu.dev and yo@ndo.dev, or raise a public issue requesting someone get in touch with you via whatever means you prefer for more details. (Please do not disclose sensitive details publicly at this stage.) :::note For less serious issues (e.g. RFC compliance for unsupported flows or potential issues that may cause a problem in the future) it is appropriate to make these public as bug reports or feature requests or to raise a question to open a discussion around them. ::: -## Supported Versions - -Security updates are only released for the current version. - -Old releases are not maintained and do not receive updates. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index f940d2c4..f750f13c 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -104,6 +104,12 @@ const docusaurusConfig = { label: "Concepts", position: "left", }, + { + to: "/security", + activeBasePath: "/security", + label: "Security", + position: "left", + }, { type: "docsVersionDropdown", position: "right", From 6184b936f5fae9d07179a6fd41e4c4c4fe4dd590 Mon Sep 17 00:00:00 2001 From: Abdulaziz Askaraliev Date: Sun, 26 Mar 2023 22:48:36 +0300 Subject: [PATCH 63/80] chore(docs): show close button on announcementBar (#7074) * fix #6935: show close button. * fix(global-css): show close button on annoucement bar dev and build were generating different results, adding `!important` fixed on build. --- docs/src/css/index.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/css/index.css b/docs/src/css/index.css index 88dbb0d6..08486c3a 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -104,7 +104,7 @@ html[data-theme="dark"] hr { /* Docusaurus announcementBar close button */ .close { - color: inherit; + color: inherit!important; } .home-main .code { From 7d264860abd20cb9a8d785562a8fb1d0c6b752c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 27 Mar 2023 01:32:50 +0200 Subject: [PATCH 64/80] chore: package builds as `docs#dev` task dependencies --- turbo.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/turbo.json b/turbo.json index ed51f588..21d09609 100644 --- a/turbo.json +++ b/turbo.json @@ -51,7 +51,26 @@ "env": ["UPSTASH_REDIS_KEY", "UPSTASH_REDIS_URL"] }, "docs#dev": { - "dependsOn": ["^build"], + "dependsOn": [ + "@auth/core#build", + "@auth/sveltekit#build", + "@next-auth/dgraph-adapter#build", + "@next-auth/dynamodb-adapter#build", + "@next-auth/fauna-adapter#build", + "@next-auth/firebase-adapter#build", + "@next-auth/mikro-orm-adapter#build", + "@next-auth/mongodb-adapter#build", + "@next-auth/neo4j-adapter#build", + "@next-auth/pouchdb-adapter#build", + "@next-auth/prisma-adapter#build", + "@next-auth/sequelize-adapter#build", + "@next-auth/supabase-adapter#build", + "@next-auth/typeorm-legacy-adapter#build", + "@next-auth/upstash-redis-adapter#build", + "@next-auth/xata-adapter#build", + "^build", + "next-auth#build" + ], "cache": false }, "docs#build": { @@ -72,6 +91,7 @@ "@next-auth/typeorm-legacy-adapter#build", "@next-auth/upstash-redis-adapter#build", "@next-auth/xata-adapter#build", + "^build", "next-auth#build" ], "outputs": [ From d7888263ca342c9a551c34170eefeb03af8c0413 Mon Sep 17 00:00:00 2001 From: Abdulaziz Askaraliev Date: Mon, 27 Mar 2023 02:38:06 +0300 Subject: [PATCH 65/80] fix(providers): update Yandex to TypeScript (#7054) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(providers): yandex add typescript. * fix(providers): yandex add avatar to scope * fix(providers): Yandex - add types & avatar scope * fix(providers): Yandex - permissions list * Apply suggestions from code review * Apply suggestions from code review * docs(provider): added comments for * revert yandex.ts from next-auth/providers/ * fix(providers): yandex fix typo * revert * Update [...nextauth].ts * Update yandex.ts * Update yandex.ts * Update [...nextauth].ts --------- Co-authored-by: Balázs Orbán --- apps/dev/nextjs/.env.local.example | 4 + .../nextjs/pages/api/auth/[...nextauth].ts | 2 + docs/static/img/providers/yandex.svg | 1 + packages/core/src/providers/yandex.js | 23 --- packages/core/src/providers/yandex.ts | 155 ++++++++++++++++++ 5 files changed, 162 insertions(+), 23 deletions(-) create mode 100644 docs/static/img/providers/yandex.svg delete mode 100644 packages/core/src/providers/yandex.js create mode 100644 packages/core/src/providers/yandex.ts diff --git a/apps/dev/nextjs/.env.local.example b/apps/dev/nextjs/.env.local.example index 312f7e09..254a1410 100644 --- a/apps/dev/nextjs/.env.local.example +++ b/apps/dev/nextjs/.env.local.example @@ -52,6 +52,10 @@ TWITTER_SECRET= WIKIMEDIA_ID= WIKIMEDIA_SECRET= +# Yandex OAuth. new app -> https://oauth.yandex.com/client/new/id +YANDEX_ID= +YANDEX_SECRET= + # Example configuration for a Gmail account (will need SMTP enabled) EMAIL_SERVER=smtps://user@gmail.com:password@smtp.gmail.com:465 EMAIL_FROM=user@gmail.com diff --git a/apps/dev/nextjs/pages/api/auth/[...nextauth].ts b/apps/dev/nextjs/pages/api/auth/[...nextauth].ts index ffa5d2fc..d0d992b2 100644 --- a/apps/dev/nextjs/pages/api/auth/[...nextauth].ts +++ b/apps/dev/nextjs/pages/api/auth/[...nextauth].ts @@ -34,6 +34,7 @@ import Spotify from "@auth/core/providers/spotify" import Trakt from "@auth/core/providers/trakt" import Twitch from "@auth/core/providers/twitch" import Twitter from "@auth/core/providers/twitter" +import Yandex from "@auth/core/providers/yandex" import Vk from "@auth/core/providers/vk" import Wikimedia from "@auth/core/providers/wikimedia" import WorkOS from "@auth/core/providers/workos" @@ -120,6 +121,7 @@ export const authConfig: AuthConfig = { Twitch({ clientId: process.env.TWITCH_ID, clientSecret: process.env.TWITCH_SECRET }), Twitter({ clientId: process.env.TWITTER_ID, clientSecret: process.env.TWITTER_SECRET }), // TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }), + Yandex({ clientId: process.env.YANDEX_ID, clientSecret: process.env.YANDEX_SECRET }), Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }), Wikimedia({ clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET }), WorkOS({ clientId: process.env.WORKOS_ID, clientSecret: process.env.WORKOS_SECRET }), diff --git a/docs/static/img/providers/yandex.svg b/docs/static/img/providers/yandex.svg new file mode 100644 index 00000000..5cd095aa --- /dev/null +++ b/docs/static/img/providers/yandex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/core/src/providers/yandex.js b/packages/core/src/providers/yandex.js deleted file mode 100644 index 86a02193..00000000 --- a/packages/core/src/providers/yandex.js +++ /dev/null @@ -1,23 +0,0 @@ -/** @type {import(".").OAuthProvider} */ -export default function Yandex(options) { - return { - id: "yandex", - name: "Yandex", - type: "oauth", - authorization: - "https://oauth.yandex.ru/authorize?scope=login:email+login:info", - token: "https://oauth.yandex.ru/token", - userinfo: "https://login.yandex.ru/info?format=json", - profile(profile) { - return { - id: profile.id, - name: profile.real_name, - email: profile.default_email, - image: profile.is_avatar_empty - ? null - : `https://avatars.yandex.net/get-yapic/${profile.default_avatar_id}/islands-200`, - } - }, - options, - } -} diff --git a/packages/core/src/providers/yandex.ts b/packages/core/src/providers/yandex.ts new file mode 100644 index 00000000..3d84ae84 --- /dev/null +++ b/packages/core/src/providers/yandex.ts @@ -0,0 +1,155 @@ +/** + *
+ * Built-in Yandex integration. + * + * + * + *
+ * + * --- + * @module providers/yandex + */ + +import { OAuthConfig, OAuthUserConfig } from "." + +/** + * @see [Getting information about the user](https://yandex.com/dev/id/doc/en/user-information) + * @see [Access to email address](https://yandex.com/dev/id/doc/en/user-information#email-access) + * @see [Access to the user's profile picture](https://yandex.com/dev/id/doc/en/user-information#avatar-access) + * @see [Access to the date of birth](https://yandex.com/dev/id/doc/en/user-information#birthday-access) + * @see [Access to login, first name, last name, and gender](https://yandex.com/dev/id/doc/en/user-information#name-access) + * @see [Access to the phone number](https://yandex.com/dev/id/doc/en/user-information#phone-access) + */ +export interface YandexProfile { + /** User's Yandex login. */ + login: string + /** Yandex user's unique ID. */ + id: string + /** + * The ID of the app the OAuth token in the request was issued for. + * Available in the [app properties](https://oauth.yandex.com/). To open properties, click the app name. + */ + client_id: string + /** Authorized Yandex user ID. It is formed on the Yandex side based on the `client_id` and `user_id` pair. */ + psuid: string + /** An array of the user's email addresses. Currently only includes the default email address. */ + emails?: string[] + /** The default email address for contacting the user. */ + default_email?: string + /** + * Indicates that the stub (profile picture that is automatically assigned when registering in Yandex) + * ID is specified in the `default_avatar_id` field. + */ + is_avatar_empty?: boolean + /** + * ID of the Yandex user's profile picture. + * The profile picture with this ID can be downloaded via a link that looks like this: + * @example "https://avatars.yandex.net/get-yapic/31804/BYkogAC6AoB17bN1HKRFAyKiM4-1/islands-200" + */ + default_avatar_id?: + | "islands-small" + | "islands-34" + | "islands-middle" + | "islands-50" + | "islands-retina-small" + | "islands-68" + | "islands-75" + | "islands-retina-middle" + | "islands-retina-50" + | "islands-200" + /** + * The user's date of birth in YYYY-MM-DD format. + * Unknown elements of the date are filled in with zeros, such as: `0000-12-23`. + * If the user's date of birth is unknow, birthday will be `null` + */ + birthday?: string | null + first_name?: string + last_name?: string + display_name?: string + /** + * The first and last name that the user specified in Yandex ID. + * Non-Latin characters of the first and last names are presented in Unicode format. + */ + real_name?: string + /** User's gender. Possible values: Male: `male', Female: `female`, Unknown gender: `null` */ + sex?: string + /** + * The default phone number for contacting the user. + * The API can exclude the user's phone number from the response at its discretion. + * The field contains the following parameters: + * id: Phone number ID. + * number: The user's phone number. + */ + default_phone?: { id: number; number: string } +} + +/** + * Add Yandex login to your page + * + * ## Example + * + * ```ts + * import { Auth } from "@auth/core" + * import Yandex from "@auth/core/providers/yandex" + * + * const request = new Request("https://example.com") + * const response = await Auth(request, { + * providers: [Yandex({ clientId: "", clientSecret: "" })], + * }) + * ``` + * + * ## Resources + * + * @see [Yandex - Creating an OAuth app](https://yandex.com/dev/id/doc/en/register-client#create) + * @see [Yandex - Manage OAuth apps](https://oauth.yandex.com/) + * @see [Yandex - OAuth documentation](https://yandex.com/dev/id/doc/en/) + * @see [Learn more about OAuth](https://authjs.dev/concepts/oauth) + * @see [Source code](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/yandex.ts) + * + *:::tip + * The Yandex provider comes with a [default configuration](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/yandex.ts). + * To override the defaults for your use case, check out [customizing a built-in OAuth provider](https://authjs.dev/guides/providers/custom-provider#override-default-options). + * ::: + * + * :::info **Disclaimer** + * If you think you found a bug in the default configuration, you can [open an issue](https://authjs.dev/new/provider-issue). + * + * Auth.js strictly adheres to the specification and it cannot take responsibility for any deviation from + * the spec by the provider. You can open an issue, but if the problem is non-compliance with the spec, + * we might not pursue a resolution. You can ask for more help in [Discussions](https://authjs.dev/new/github-discussions). + * ::: + */ +export default function Yandex( + options: OAuthUserConfig +): OAuthConfig { + return { + id: "yandex", + name: "Yandex", + type: "oauth", + /** @see [Data access](https://yandex.com/dev/id/doc/en/register-client#access) */ + authorization: + "https://oauth.yandex.ru/authorize?scope=login:info+login:email+login:avatar", + token: "https://oauth.yandex.ru/token", + userinfo: "https://login.yandex.ru/info?format=json", + profile(profile) { + return { + id: profile.id, + name: profile.display_name ?? profile.real_name ?? profile.first_name, + email: profile.default_email ?? profile.emails?.[0] ?? null, + image: + !profile.is_avatar_empty && profile.default_avatar_id + ? `https://avatars.yandex.net/get-yapic/${profile.default_avatar_id}/islands-200` + : null, + } + }, + style: { + logo: "/yandex.svg", + logoDark: "/yandex.svg", + bg: "#ffcc00", + text: "#000", + bgDark: "#ffcc00", + textDark: "#000", + }, + options, + } +} From ccbbc800d2fd35ee7bf6a45b6a1ec7326ef0d624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 27 Mar 2023 02:06:33 +0200 Subject: [PATCH 66/80] docs: rephrase buttons on landing page --- docs/src/pages/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index 2bf32c91..b69bba28 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -135,7 +135,7 @@ export default function Home() { )} href="https://next-auth-example.vercel.app" > - Live Demo (Next.js) + Next.js Demo - Live Demo (SvelteKit) + SvelteKit Demo - Live Demo (SolidStart) + SolidStart Demo Date: Mon, 27 Mar 2023 00:36:47 -0700 Subject: [PATCH 67/80] chore(provider): added svg for Reddit (#7050) Added svg for Reddit Co-authored-by: Nico Domino --- docs/static/img/providers/reddit.svg | 6 ++++++ packages/core/src/providers/reddit.js | 5 +++++ packages/next-auth/src/providers/reddit.js | 7 ++++++- 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 docs/static/img/providers/reddit.svg diff --git a/docs/static/img/providers/reddit.svg b/docs/static/img/providers/reddit.svg new file mode 100644 index 00000000..e4a7253d --- /dev/null +++ b/docs/static/img/providers/reddit.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/core/src/providers/reddit.js b/packages/core/src/providers/reddit.js index fe5c2ff8..2343618e 100644 --- a/packages/core/src/providers/reddit.js +++ b/packages/core/src/providers/reddit.js @@ -7,6 +7,11 @@ export default function Reddit(options) { authorization: "https://www.reddit.com/api/v1/authorize?scope=identity", token: "https://www.reddit.com/api/v1/access_token", userinfo: "https://oauth.reddit.com/api/v1/me", + style: { + logo: "/reddit.svg", + bg: "#fff", + text: "#000", + }, options, } } diff --git a/packages/next-auth/src/providers/reddit.js b/packages/next-auth/src/providers/reddit.js index 814b32e0..f0d08930 100644 --- a/packages/next-auth/src/providers/reddit.js +++ b/packages/next-auth/src/providers/reddit.js @@ -5,7 +5,7 @@ export default function Reddit(options) { name: "Reddit", type: "oauth", authorization: "https://www.reddit.com/api/v1/authorize?scope=identity", - token: " https://www.reddit.com/api/v1/access_token", + token: "https://www.reddit.com/api/v1/access_token", userinfo: "https://oauth.reddit.com/api/v1/me", profile(profile) { return { @@ -15,6 +15,11 @@ export default function Reddit(options) { image: null, } }, + style: { + logo: "https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/reddit.svg", + bg: "#fff", + text: "#000", + }, options, } } From 400da8c76686e3e02d6c767e7cc9be1673cbe403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Mon, 27 Mar 2023 15:44:23 +0200 Subject: [PATCH 68/80] fix(providers): mention Email Address as required for Azure B2C closes #7071 --- packages/core/src/providers/azure-ad-b2c.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/providers/azure-ad-b2c.ts b/packages/core/src/providers/azure-ad-b2c.ts index c6db9ee7..3d341794 100644 --- a/packages/core/src/providers/azure-ad-b2c.ts +++ b/packages/core/src/providers/azure-ad-b2c.ts @@ -44,7 +44,7 @@ export interface AzureADB2CProfile { * 2. [App Registration](https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-register-applications) * 3. [User Flow](https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows) * - * For the step "User attributes and token claims" you might want to set the following: + * For the step "User attributes and token claims" set the following: * * - Collect attribute: * - Email Address From b02057a72d1804bfb036f128ceca12febbc94cda Mon Sep 17 00:00:00 2001 From: Alan Hoskins Date: Mon, 27 Mar 2023 09:46:43 -0400 Subject: [PATCH 69/80] fix(docs): fix broken links links (#7083) Co-authored-by: Alan Hoskins --- docs/docs/getting-started/credentials-tutorial.mdx | 2 +- docs/docs/getting-started/upgrade-to-v4.md | 2 +- docs/docs/guides/providers/credentials-provider.md | 2 +- docs/docs/guides/providers/email-provider.md | 2 +- docs/docs/reference/adapters/index.md | 6 +++--- packages/core/src/providers/email.ts | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/docs/getting-started/credentials-tutorial.mdx b/docs/docs/getting-started/credentials-tutorial.mdx index 3e1f8a13..f7c02517 100644 --- a/docs/docs/getting-started/credentials-tutorial.mdx +++ b/docs/docs/getting-started/credentials-tutorial.mdx @@ -46,7 +46,7 @@ export default NextAuth({ ``` :::note -Check the [Credentials Provider options](/reference/providers/credentials) for further customization +Check the [Credentials Provider options](/reference/core/providers_credentials) for further customization ::: Note that we only need to define an `authorize` method that is in charge of receiving the credentials inserted by the user and call the authorization service. diff --git a/docs/docs/getting-started/upgrade-to-v4.md b/docs/docs/getting-started/upgrade-to-v4.md index ebe85d04..221e14de 100644 --- a/docs/docs/getting-started/upgrade-to-v4.md +++ b/docs/docs/getting-started/upgrade-to-v4.md @@ -239,7 +239,7 @@ Introduced in https://github.com/nextauthjs/next-auth/releases/tag/v4.0.0-next.1 ## `nodemailer` -Like `typeorm` and `prisma`, [`nodemailer`](https://npmjs.com/package/nodemailer) is no longer included as a dependency by default. If you are using the Email provider you must install it in your project manually, or use any other Email library in the [`sendVerificationRequest`](/reference/providers/email) callback. This reduces bundle size for those not actually using the Email provider. Remember, when using the Email provider, it is mandatory to also use a database adapter due to the fact that verification tokens need to be persisted longer term for the magic link functionality to work. +Like `typeorm` and `prisma`, [`nodemailer`](https://npmjs.com/package/nodemailer) is no longer included as a dependency by default. If you are using the Email provider you must install it in your project manually, or use any other Email library in the [`sendVerificationRequest`](/guides/providers/email) callback. This reduces bundle size for those not actually using the Email provider. Remember, when using the Email provider, it is mandatory to also use a database adapter due to the fact that verification tokens need to be persisted longer term for the magic link functionality to work. Introduced in https://github.com/nextauthjs/next-auth/releases/tag/v4.0.0-next.2 diff --git a/docs/docs/guides/providers/credentials-provider.md b/docs/docs/guides/providers/credentials-provider.md index 2ef27455..0bf12ba1 100644 --- a/docs/docs/guides/providers/credentials-provider.md +++ b/docs/docs/guides/providers/credentials-provider.md @@ -17,7 +17,7 @@ The functionality provided for credentials-based authentication is intentionally The **Credentials Provider** comes with a set of default options: -- [Credentials Provider options](/reference/providers/credentials) +- [Credentials Provider options](/reference/core/providers_credentials) You can override any of the options to suit your own use case. diff --git a/docs/docs/guides/providers/email-provider.md b/docs/docs/guides/providers/email-provider.md index d9b82009..d17d4351 100644 --- a/docs/docs/guides/providers/email-provider.md +++ b/docs/docs/guides/providers/email-provider.md @@ -23,7 +23,7 @@ The Email Provider can be used with both JSON Web Tokens and database sessions, The **Email Provider** comes with a set of default options: -- [Email Provider options](/reference/providers/email) +- [Email Provider options](/guides/providers/email) You can override any of the options to suit your own use case. diff --git a/docs/docs/reference/adapters/index.md b/docs/docs/reference/adapters/index.md index 26d05ab9..6c86a7d5 100644 --- a/docs/docs/reference/adapters/index.md +++ b/docs/docs/reference/adapters/index.md @@ -52,7 +52,7 @@ Using a Auth.js / NextAuth.js adapter you can connect to any database service or

TypeORM Adapter

-
+

Upstash Adapter

@@ -174,7 +174,7 @@ A single User can have multiple open Verification Tokens (e.g. to sign in to dif It has been designed to be extendable for other verification purposes in the future (e.g. 2FA / short codes). :::note -Auth.js makes sure that every token is usable only once, and by default has a short (1 day, can be configured by [`maxAge`](/reference/providers/email)) lifetime. If your user did not manage to finish the sign-in flow in time, they will have to start the sign-in process again. +Auth.js makes sure that every token is usable only once, and by default has a short (1 day, can be configured by [`maxAge`](/guides/providers/email)) lifetime. If your user did not manage to finish the sign-in flow in time, they will have to start the sign-in process again. ::: :::tip @@ -188,4 +188,4 @@ Auth.js / NextAuth.js uses `camelCase` for its own database rows, while respecti ## TypeScript -Check out the [`@auth/core/adapters` API Reference](/reference/core/adapters) documentation. \ No newline at end of file +Check out the [`@auth/core/adapters` API Reference](/reference/core/adapters) documentation. diff --git a/packages/core/src/providers/email.ts b/packages/core/src/providers/email.ts index 6ee21568..a10ea86b 100644 --- a/packages/core/src/providers/email.ts +++ b/packages/core/src/providers/email.ts @@ -39,7 +39,7 @@ export interface EmailConfig extends CommonProviderOptions { * @default 86400 */ maxAge?: number - /** [Documentation](https://authjs.dev/reference/providers/email#customizing-emails) */ + /** [Documentation](https://authjs.dev/guides/providers/email#customizing-emails) */ sendVerificationRequest: ( params: SendVerificationRequestParams ) => Awaitable @@ -55,7 +55,7 @@ export interface EmailConfig extends CommonProviderOptions { * } * }) * ``` - * [Documentation](https://authjs.dev/reference/providers/email#customizing-the-verification-token) + * [Documentation](https://authjs.dev/guides/providers/email#customizing-the-verification-token) */ generateVerificationToken?: () => Awaitable /** If defined, it is used to hash the verification token when saving to the database . */ @@ -72,7 +72,7 @@ export interface EmailConfig extends CommonProviderOptions { * By default, we treat email addresses as all lower case, * but you can override this function to change this behavior. * - * [Documentation](https://authjs.dev/reference/providers/email#normalizing-the-e-mail-address) | [RFC 2821](https://tools.ietf.org/html/rfc2821) | [Email syntax](https://en.wikipedia.org/wiki/Email_address#Syntax) + * [Documentation](https://authjs.dev/guides/providers/email#normalizing-the-e-mail-address) | [RFC 2821](https://tools.ietf.org/html/rfc2821) | [Email syntax](https://en.wikipedia.org/wiki/Email_address#Syntax) */ normalizeIdentifier?: (identifier: string) => string } From 88023f69b9b4288d5a94a7bc27523f082a58aa53 Mon Sep 17 00:00:00 2001 From: Alan Hoskins Date: Mon, 27 Mar 2023 09:47:32 -0400 Subject: [PATCH 70/80] fix(docs): remove extra install (#7081) --- packages/adapter-sequelize/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adapter-sequelize/src/index.ts b/packages/adapter-sequelize/src/index.ts index f84fc9c9..7b8ab72d 100644 --- a/packages/adapter-sequelize/src/index.ts +++ b/packages/adapter-sequelize/src/index.ts @@ -9,7 +9,7 @@ * ## Installation * * ```bash npm2yarn2pnpm - * npm install install next-auth @next-auth/sequelize-adapter sequelize + * npm install next-auth @next-auth/sequelize-adapter sequelize * ``` * * @module @next-auth/sequelize-adapter From 1aa4994de6b30a07f466750064850e946a0248f7 Mon Sep 17 00:00:00 2001 From: Sai Srikar Dumpeti <80447788+the-r3aper7@users.noreply.github.com> Date: Tue, 28 Mar 2023 07:36:21 +0530 Subject: [PATCH 71/80] docs: respect color scheme (#7076) --- docs/src/css/adapters.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/src/css/adapters.css b/docs/src/css/adapters.css index aebce91d..dc8bf746 100644 --- a/docs/src/css/adapters.css +++ b/docs/src/css/adapters.css @@ -25,6 +25,10 @@ transition: 0.2s background-color ease-in-out; } +html[data-theme="dark"] .adapter-card { + color: #f5f5f5; +} + .adapter-card:hover { text-decoration: none; color: black; From a087df8494eeca9269d6185e3d2bcfe34a13d993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Tue, 28 Mar 2023 13:47:53 +0200 Subject: [PATCH 72/80] docs: fix some links --- docs/docs/reference/adapters/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/reference/adapters/index.md b/docs/docs/reference/adapters/index.md index 6c86a7d5..1ad11728 100644 --- a/docs/docs/reference/adapters/index.md +++ b/docs/docs/reference/adapters/index.md @@ -133,7 +133,7 @@ If a user first signs in with OAuth then their email address is automatically po This provides a way to contact users and for users to maintain access to their account and sign in using email in the event they are unable to sign in with the OAuth provider in future (if the [Email Provider](/getting-started/email-tutorial) is configured). ::: -User creation in the database is automatic, and happens when the user is logging in for the first time with a provider. The default data saved is `id`, `name`, `email` and `image`. You can add more profile data by returning extra fields in your [OAuth provider's `profile()`](/reference/providers/oauth) callback. +User creation in the database is automatic, and happens when the user is logging in for the first time with a provider. The default data saved is `id`, `name`, `email` and `image`. You can add more profile data by returning extra fields in your [OAuth provider](/guides/providers/custom-provider)'s [`profile()`](/reference/core/providers#profile) callback. ### Account From 99ca67f1cff24d77330ff662acf7aa57dd5793e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Tue, 28 Mar 2023 13:59:08 +0200 Subject: [PATCH 73/80] docs: fix typo --- docs/docs/getting-started/email-tutorial.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/getting-started/email-tutorial.mdx b/docs/docs/getting-started/email-tutorial.mdx index 69d01f63..1e50adfd 100644 --- a/docs/docs/getting-started/email-tutorial.mdx +++ b/docs/docs/getting-started/email-tutorial.mdx @@ -66,7 +66,7 @@ Nice! We're getting there. Now we need to read supply this values as the configu ```ts title="pages/api/auth/[...nextauth].ts" import NextAuth from "next-auth" -import EmailProvider from "next-auth/providers/email" +import Email from "next-auth/providers/email" export default NextAuth({ providers: [ From 4dc1d421f8ffc4d2fd3d5d792f281c316f3beb53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 30 Mar 2023 18:34:30 +0200 Subject: [PATCH 74/80] docs: mention `client` in OAuth config options Related issue #7114 --- packages/core/src/providers/oauth.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/src/providers/oauth.ts b/packages/core/src/providers/oauth.ts index 87edda7f..b123fc8d 100644 --- a/packages/core/src/providers/oauth.ts +++ b/packages/core/src/providers/oauth.ts @@ -150,6 +150,10 @@ export interface OAuth2Config checks?: Array<"pkce" | "state" | "none" | "nonce"> clientId?: string clientSecret?: string + /** + * Pass overrides to the underlying OAuth library. + * See [`oauth4webapi` client](https://github.com/panva/oauth4webapi/blob/main/docs/interfaces/Client.md) for details. + */ client?: Partial style?: OAuthProviderButtonStyles /** From 3dd47b07358e9c89d47570101f50798dbf0fee72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 31 Mar 2023 05:01:58 +0200 Subject: [PATCH 75/80] docs(example): remove `unstable_` prefix --- apps/examples/nextjs/pages/server.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/examples/nextjs/pages/server.tsx b/apps/examples/nextjs/pages/server.tsx index d5c54f56..a2e0b253 100644 --- a/apps/examples/nextjs/pages/server.tsx +++ b/apps/examples/nextjs/pages/server.tsx @@ -1,4 +1,4 @@ -import { unstable_getServerSession } from "next-auth/next" +import { getServerSession } from "next-auth/next" import { authOptions } from "./api/auth/[...nextauth]" import Layout from "../components/layout" @@ -38,7 +38,7 @@ export default function ServerSidePage() { export async function getServerSideProps(context: GetServerSidePropsContext) { return { props: { - session: await unstable_getServerSession( + session: await getServerSession( context.req, context.res, authOptions From 75a59fbd92cb536d1fe89a1f03a726f91ae08a3c Mon Sep 17 00:00:00 2001 From: jakzo Date: Sun, 2 Apr 2023 19:00:00 +1000 Subject: [PATCH 76/80] chore(docs): fix dynamodb typo (#7130) fix: typo --- packages/adapter-dynamodb/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/adapter-dynamodb/src/index.ts b/packages/adapter-dynamodb/src/index.ts index e3f62ada..2c6467c4 100644 --- a/packages/adapter-dynamodb/src/index.ts +++ b/packages/adapter-dynamodb/src/index.ts @@ -9,10 +9,10 @@ * ## Installation * * ```bash npm2yarn2pnpm - * npm install next-auth @next-auth/dyanamodb-adapter + * npm install next-auth @next-auth/dynamodb-adapter * ``` * - * @module @next-auth/dyanamodb-adapter + * @module @next-auth/dynamodb-adapter */ import { v4 as uuid } from "uuid" From c8ef94b2be3fbcb5c5f05b89e4fd58cb5e573dcb Mon Sep 17 00:00:00 2001 From: Saurav Maheshkar Date: Tue, 4 Apr 2023 12:52:11 +0100 Subject: [PATCH 77/80] chore: move `prettier` and `eslint` configs under `package.json` (#7145) --- .eslintignore | 70 ------------------------- .eslintrc.js | 75 -------------------------- .prettierrc.js | 22 -------- package.json | 139 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 167 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js delete mode 100644 .prettierrc.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 32343497..00000000 --- a/.eslintignore +++ /dev/null @@ -1,70 +0,0 @@ -.eslintrc.js -.cache-loader -.DS_Store -.pnpm-debug.log -.turbo -.vscode/generated* -/_work -/actions-runner -node_modules -patches -pnpm-lock.yaml -.github/actions/issue-validator/index.mjs -*.cjs -*.js -*.d.ts -*.d.ts.map - -.svelte-kit -.next -.nuxt - -# --------------- Docs --------------- - -.docusaurus -build -docs/docs/reference/core -docs/docs/reference/sveltekit -static - -# --------------- Packages --------------- - -coverage -dist - -# @auth/core -packages/core/src/providers/oauth-types.ts -packages/core/src/lib/pages/styles.ts - -# @auth/sveltekit -packages/frameworks-sveltekit/package -packages/frameworks-sveltekit/vite.config.{js,ts}.timestamp-* - -# next-auth -packages/next-auth/src/providers/oauth-types.ts -packages/next-auth/css/index.css - - -# Adapters -.branches -db.sqlite -dev.db -dynamodblocal-bin -firebase-debug.log -firestore-debug.log -migrations -test.schema.gql - -# --------------- Apps --------------- - - -# Examples should have their own Prettier config since they are templates too -apps/example-sveltekit - -# Development app -apps - - -# --------------- Tests --------------- -# TODO: these should be linted -packages/**/*test* \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 802d0ab7..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,75 +0,0 @@ -// @ts-check - -/** @type {import("eslint").ESLint.ConfigData} */ -module.exports = { - env: { browser: true, es2022: true, node: true }, - extends: ["eslint:recommended", "prettier"], - overrides: [ - { - files: ["*.ts", "*.tsx"], - parser: "@typescript-eslint/parser", - parserOptions: { - project: ["./packages/**/tsconfig.json", "./apps/**/tsconfig.json"], - }, - settings: { react: { version: "18" } }, - extends: [ - "plugin:react/recommended", - "plugin:react/jsx-runtime", - "standard-with-typescript", - "prettier", - ], - rules: { - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/method-signature-style": "off", - "@typescript-eslint/naming-convention": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/restrict-template-expressions": "off", - "@typescript-eslint/strict-boolean-expressions": "off", - "react/prop-types": "off", - "react/no-unescaped-entities": "off", - }, - }, - { - files: ["*.test.ts", "*.test.js"], - extends: ["plugin:jest/recommended"], - env: { jest: true }, - }, - { - files: ["docs/**"], - plugins: ["@docusaurus"], - extends: ["plugin:@docusaurus/recommended"], - }, - { - // TODO: Expand to all packages - files: ["packages/{core,sveltekit}/*.ts"], - plugins: ["jsdoc"], - extends: ["plugin:jsdoc/recommended"], - rules: { - "jsdoc/require-param": "off", - "jsdoc/require-returns": "off", - "jsdoc/require-jsdoc": [ - "warn", - { publicOnly: true, enableFixer: false }, - ], - "jsdoc/no-multi-asterisks": ["warn", { allowWhitespace: true }], - "jsdoc/tag-lines": "off", - }, - }, - { - files: ["packages/frameworks-sveltekit"], - plugins: ["svelte3"], - overrides: [{ files: ["*.svelte"], processor: "svelte3/svelte3" }], - settings: { - "svelte3/typescript": () => require("typescript"), - }, - parserOptions: { sourceType: "module", ecmaVersion: 2020 }, - env: { browser: true, es2017: true, node: true }, - }, - ], - parserOptions: { - sourceType: "module", - ecmaVersion: "latest", - ecmaFeatures: { jsx: true }, - }, - root: true, -} diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index fc17898f..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1,22 +0,0 @@ -// @ts-check - -/** @type {import("prettier").Config} */ -module.exports = { - semi: false, - singleQuote: false, - overrides: [ - { - files: [ - "apps/dev/nextjs/pages/api/auth/[...nextauth].ts", - "docs/{sidebars,docusaurus.config}.js", - ], - options: { printWidth: 150 }, - }, - { - files: ["**/*package.json"], - options: { - trailingComma: "none", - }, - }, - ], -} diff --git a/package.json b/package.json index 6e075dd7..ccabec1f 100644 --- a/package.json +++ b/package.json @@ -61,5 +61,144 @@ "patchedDependencies": { "@balazsorban/monorepo-release@0.1.8": "patches/@balazsorban__monorepo-release@0.1.8.patch" } + }, + "eslintIgnore": [ + ".eslintrc.js", + ".cache-loader", + ".DS_Store", + ".pnpm-debug.log", + ".turbo", + ".vscode/generated*", + "/_work", + "/actions-runner", + "node_modules", + "patches", + "pnpm-lock.yaml", + ".github/actions/issue-validator/index.mjs", + "*.cjs", + "*.js", + "*.d.ts", + "*.d.ts.map", + ".svelte-kit", + ".next", + ".nuxt", + ".docusaurus", + "build", + "docs/docs/reference/core", + "docs/docs/reference/sveltekit", + "static", + "coverage", + "dist", + "packages/core/src/providers/oauth-types.ts", + "packages/core/src/lib/pages/styles.ts", + "packages/frameworks-sveltekit/package", + "packages/frameworks-sveltekit/vite.config.{js,ts}.timestamp-*", + "packages/next-auth/src/providers/oauth-types.ts", + "packages/next-auth/css/index.css", + ".branches", + "db.sqlite", + "dev.db", + "dynamodblocal-bin", + "firebase-debug.log", + "firestore-debug.log", + "migrations", + "test.schema.gql", + "apps/example-sveltekit", + "apps", + "packages/**/*test*" + ], + "eslintConfig": { + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": [ + "eslint:recommended", + "prettier" + ], + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": ["./packages/**/tsconfig.json", "./apps/**/tsconfig.json"] + }, + "settings": { "react": { "version": "18" } }, + "extends": [ + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "standard-with-typescript", + "prettier" + ], + "rules": { + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/method-signature-style": "off", + "@typescript-eslint/naming-convention": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/strict-boolean-expressions": "off", + "react/prop-types": "off", + "react/no-unescaped-entities": "off" + } + }, + { + "files": ["*.test.ts", "*.test.js"], + "extends": ["plugin:jest/recommended"], + "env": { "jest": true } + }, + { + "files": ["docs/**"], + "plugins": ["@docusaurus"], + "extends": ["plugin:@docusaurus/recommended"] + }, + { + "files": ["packages/{core,sveltekit}/*.ts"], + "plugins": ["jsdoc"], + "extends": ["plugin:jsdoc/recommended"], + "rules": { + "jsdoc/require-param": "off", + "jsdoc/require-returns": "off", + "jsdoc/require-jsdoc": [ + "warn", + { "publicOnly": true, "enableFixer": false } + ], + "jsdoc/no-multi-asterisks": ["warn", { "allowWhitespace": true }], + "jsdoc/tag-lines": "off" + } + }, + { + "files": ["packages/frameworks-sveltekit"], + "plugins": ["svelte3"], + "overrides": [{ "files": ["*.svelte"], "processor": "svelte3/svelte3" }], + "parserOptions": { "sourceType": "module", "ecmaVersion": 2020 }, + "env": { "browser": true, "es2017": true, "node": true } + } + ], + "parserOptions": { + "sourceType": "module", + "ecmaVersion": "latest", + "ecmaFeatures": { "jsx": true } + }, + "root": true + }, + "prettier": { + "semi": false, + "singleQuote": false, + "overrides": [ + { + "files": [ + "apps/dev/nextjs/pages/api/auth/[...nextauth].ts", + "docs/{sidebars,docusaurus.config}.js" + ], + "options": { "printWidth": 150 } + }, + { + "files": ["**/*package.json"], + "options": { + "trailingComma": "none" + } + } + ] } } From 6c07331cc53abe45c644308af6b6f2de29fdae2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 6 Apr 2023 12:58:10 +0200 Subject: [PATCH 78/80] chore: upgrade `turbo` --- package.json | 107 ++++++++++++++++++++++++++++++++++++++----------- pnpm-lock.yaml | 44 ++++++++++---------- 2 files changed, 106 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index ccabec1f..48e24fa5 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "eslint-plugin-svelte3": "^4.0.0", "prettier": "2.8.1", "prettier-plugin-svelte": "^2.8.1", - "turbo": "1.6.3", + "turbo": "1.8.8", "typescript": "4.9.4" }, "engines": { @@ -119,12 +119,22 @@ ], "overrides": [ { - "files": ["*.ts", "*.tsx"], + "files": [ + "*.ts", + "*.tsx" + ], "parser": "@typescript-eslint/parser", "parserOptions": { - "project": ["./packages/**/tsconfig.json", "./apps/**/tsconfig.json"] + "project": [ + "./packages/**/tsconfig.json", + "./apps/**/tsconfig.json" + ] + }, + "settings": { + "react": { + "version": "18" + } }, - "settings": { "react": { "version": "18" } }, "extends": [ "plugin:react/recommended", "plugin:react/jsx-runtime", @@ -143,42 +153,89 @@ } }, { - "files": ["*.test.ts", "*.test.js"], - "extends": ["plugin:jest/recommended"], - "env": { "jest": true } + "files": [ + "*.test.ts", + "*.test.js" + ], + "extends": [ + "plugin:jest/recommended" + ], + "env": { + "jest": true + } }, { - "files": ["docs/**"], - "plugins": ["@docusaurus"], - "extends": ["plugin:@docusaurus/recommended"] + "files": [ + "docs/**" + ], + "plugins": [ + "@docusaurus" + ], + "extends": [ + "plugin:@docusaurus/recommended" + ] }, { - "files": ["packages/{core,sveltekit}/*.ts"], - "plugins": ["jsdoc"], - "extends": ["plugin:jsdoc/recommended"], + "files": [ + "packages/{core,sveltekit}/*.ts" + ], + "plugins": [ + "jsdoc" + ], + "extends": [ + "plugin:jsdoc/recommended" + ], "rules": { "jsdoc/require-param": "off", "jsdoc/require-returns": "off", "jsdoc/require-jsdoc": [ "warn", - { "publicOnly": true, "enableFixer": false } + { + "publicOnly": true, + "enableFixer": false + } + ], + "jsdoc/no-multi-asterisks": [ + "warn", + { + "allowWhitespace": true + } ], - "jsdoc/no-multi-asterisks": ["warn", { "allowWhitespace": true }], "jsdoc/tag-lines": "off" } }, { - "files": ["packages/frameworks-sveltekit"], - "plugins": ["svelte3"], - "overrides": [{ "files": ["*.svelte"], "processor": "svelte3/svelte3" }], - "parserOptions": { "sourceType": "module", "ecmaVersion": 2020 }, - "env": { "browser": true, "es2017": true, "node": true } + "files": [ + "packages/frameworks-sveltekit" + ], + "plugins": [ + "svelte3" + ], + "overrides": [ + { + "files": [ + "*.svelte" + ], + "processor": "svelte3/svelte3" + } + ], + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 2020 + }, + "env": { + "browser": true, + "es2017": true, + "node": true + } } ], "parserOptions": { "sourceType": "module", "ecmaVersion": "latest", - "ecmaFeatures": { "jsx": true } + "ecmaFeatures": { + "jsx": true + } }, "root": true }, @@ -191,10 +248,14 @@ "apps/dev/nextjs/pages/api/auth/[...nextauth].ts", "docs/{sidebars,docusaurus.config}.js" ], - "options": { "printWidth": 150 } + "options": { + "printWidth": 150 + } }, { - "files": ["**/*package.json"], + "files": [ + "**/*package.json" + ], "options": { "trailingComma": "none" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a477ce3..b10ecb7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,7 +27,7 @@ importers: eslint-plugin-svelte3: ^4.0.0 prettier: 2.8.1 prettier-plugin-svelte: ^2.8.1 - turbo: 1.6.3 + turbo: 1.8.8 typescript: 4.9.4 devDependencies: '@actions/core': 1.10.0 @@ -48,7 +48,7 @@ importers: eslint-plugin-svelte3: 4.0.0_eslint@8.30.0 prettier: 2.8.1 prettier-plugin-svelte: 2.8.1_prettier@2.8.1 - turbo: 1.6.3 + turbo: 1.8.8 typescript: 4.9.4 apps/dev/nextjs: @@ -30907,65 +30907,65 @@ packages: engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} dev: true - /turbo-darwin-64/1.6.3: - resolution: {integrity: sha512-QmDIX0Yh1wYQl0bUS0gGWwNxpJwrzZU2GIAYt3aOKoirWA2ecnyb3R6ludcS1znfNV2MfunP+l8E3ncxUHwtjA==} + /turbo-darwin-64/1.8.8: + resolution: {integrity: sha512-18cSeIm7aeEvIxGyq7PVoFyEnPpWDM/0CpZvXKHpQ6qMTkfNt517qVqUTAwsIYqNS8xazcKAqkNbvU1V49n65Q==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-darwin-arm64/1.6.3: - resolution: {integrity: sha512-75DXhFpwE7CinBbtxTxH08EcWrxYSPFow3NaeFwsG8aymkWXF+U2aukYHJA6I12n9/dGqf7yRXzkF0S/9UtdyQ==} + /turbo-darwin-arm64/1.8.8: + resolution: {integrity: sha512-ruGRI9nHxojIGLQv1TPgN7ud4HO4V8mFBwSgO6oDoZTNuk5ybWybItGR+yu6fni5vJoyMHXOYA2srnxvOc7hjQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /turbo-linux-64/1.6.3: - resolution: {integrity: sha512-O9uc6J0yoRPWdPg9THRQi69K6E2iZ98cRHNvus05lZbcPzZTxJYkYGb5iagCmCW/pq6fL4T4oLWAd6evg2LGQA==} + /turbo-linux-64/1.8.8: + resolution: {integrity: sha512-N/GkHTHeIQogXB1/6ZWfxHx+ubYeb8Jlq3b/3jnU4zLucpZzTQ8XkXIAfJG/TL3Q7ON7xQ8yGOyGLhHL7MpFRg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-linux-arm64/1.6.3: - resolution: {integrity: sha512-dCy667qqEtZIhulsRTe8hhWQNCJO0i20uHXv7KjLHuFZGCeMbWxB8rsneRoY+blf8+QNqGuXQJxak7ayjHLxiA==} + /turbo-linux-arm64/1.8.8: + resolution: {integrity: sha512-hKqLbBHgUkYf2Ww8uBL9UYdBFQ5677a7QXdsFhONXoACbDUPvpK4BKlz3NN7G4NZ+g9dGju+OJJjQP0VXRHb5w==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /turbo-windows-64/1.6.3: - resolution: {integrity: sha512-lKRqwL3mrVF09b9KySSaOwetehmGknV9EcQTF7d2dxngGYYX1WXoQLjFP9YYH8ZV07oPm+RUOAKSCQuDuMNhiA==} + /turbo-windows-64/1.8.8: + resolution: {integrity: sha512-2ndjDJyzkNslXxLt+PQuU21AHJWc8f6MnLypXy3KsN4EyX/uKKGZS0QJWz27PeHg0JS75PVvhfFV+L9t9i+Yyg==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /turbo-windows-arm64/1.6.3: - resolution: {integrity: sha512-BXY1sDPEA1DgPwuENvDCD8B7Hb0toscjus941WpL8CVd10hg9pk/MWn9CNgwDO5Q9ks0mw+liDv2EMnleEjeNA==} + /turbo-windows-arm64/1.8.8: + resolution: {integrity: sha512-xCA3oxgmW9OMqpI34AAmKfOVsfDljhD5YBwgs0ZDsn5h3kCHhC4x9W5dDk1oyQ4F5EXSH3xVym5/xl1J6WRpUg==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /turbo/1.6.3: - resolution: {integrity: sha512-FtfhJLmEEtHveGxW4Ye/QuY85AnZ2ZNVgkTBswoap7UMHB1+oI4diHPNyqrQLG4K1UFtCkjOlVoLsllUh/9QRw==} + /turbo/1.8.8: + resolution: {integrity: sha512-qYJ5NjoTX+591/x09KgsDOPVDUJfU9GoS+6jszQQlLp1AHrf1wRFA3Yps8U+/HTG03q0M4qouOfOLtRQP4QypA==} hasBin: true requiresBuild: true optionalDependencies: - turbo-darwin-64: 1.6.3 - turbo-darwin-arm64: 1.6.3 - turbo-linux-64: 1.6.3 - turbo-linux-arm64: 1.6.3 - turbo-windows-64: 1.6.3 - turbo-windows-arm64: 1.6.3 + turbo-darwin-64: 1.8.8 + turbo-darwin-arm64: 1.8.8 + turbo-linux-64: 1.8.8 + turbo-linux-arm64: 1.8.8 + turbo-windows-64: 1.8.8 + turbo-windows-arm64: 1.8.8 dev: true /tweetnacl/0.14.5: From 71bb6f259030f0e54a6857ee6a5af40a7e099709 Mon Sep 17 00:00:00 2001 From: Prana Adiwira Date: Wed, 12 Apr 2023 17:37:31 +0700 Subject: [PATCH 79/80] fix(providers): Use the proper check for Reddit (#7224) Reddit expects the `state` parameter https://github.com/reddit-archive/reddit/wiki/OAuth2#authorization --- packages/core/src/providers/reddit.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/providers/reddit.js b/packages/core/src/providers/reddit.js index 2343618e..b067ba70 100644 --- a/packages/core/src/providers/reddit.js +++ b/packages/core/src/providers/reddit.js @@ -7,6 +7,7 @@ export default function Reddit(options) { authorization: "https://www.reddit.com/api/v1/authorize?scope=identity", token: "https://www.reddit.com/api/v1/access_token", userinfo: "https://oauth.reddit.com/api/v1/me", + checks: ["state"], style: { logo: "/reddit.svg", bg: "#fff", From b31f2af66c77751f2114806bd34fc4036a7e7808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Wed, 12 Apr 2023 12:40:55 +0200 Subject: [PATCH 80/80] feat: misc improvements (#7228) * tweak types, fix typos * filter non-oauth files when generating provider types * allow implicit config invoke * remove workaround for multiple cookie settings in Next.js * feat: return `null` when session does not exist * error on missing checks when configured --- packages/core/scripts/generate-providers.js | 3 +- packages/core/src/errors.ts | 3 +- packages/core/src/jwt.ts | 13 ++- packages/core/src/lib/assert.ts | 12 +- packages/core/src/lib/index.ts | 1 + packages/core/src/lib/oauth/callback.ts | 31 ++---- packages/core/src/lib/oauth/checks.ts | 115 ++++++++++++-------- packages/core/src/lib/providers.ts | 3 +- packages/core/src/lib/routes/callback.ts | 1 - packages/core/src/lib/routes/session.ts | 6 +- packages/core/src/lib/web.ts | 1 - packages/core/src/providers/index.ts | 25 +++-- packages/core/src/providers/oauth.ts | 4 +- packages/core/src/types.ts | 10 +- 14 files changed, 125 insertions(+), 103 deletions(-) diff --git a/packages/core/scripts/generate-providers.js b/packages/core/scripts/generate-providers.js index f8bef7df..631b1e77 100644 --- a/packages/core/scripts/generate-providers.js +++ b/packages/core/scripts/generate-providers.js @@ -5,10 +5,11 @@ const providersPath = join(process.cwd(), "src/providers") const files = readdirSync(providersPath, "utf8") +const nonOAuthFile = ["oauth-types", "oauth", "index", "email", "credentials"] const providers = files.map((file) => { const strippedProviderName = file.substring(0, file.indexOf(".")) return `"${strippedProviderName}"` -}).filter((provider) => provider !== '"oauth-types"' && provider !== '"index"') +}).filter((provider) => !nonOAuthFile.includes(provider.replace(/"/g, ''))) const result = ` // THIS FILE IS AUTOGENERATED. DO NOT EDIT. diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 771bcdf6..35589432 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -1,6 +1,5 @@ interface ErrorCause extends Record {} -/** @internal */ export class AuthError extends Error { constructor(message: string | Error | ErrorCause, cause?: ErrorCause) { if (message instanceof Error) { @@ -91,7 +90,7 @@ export class InvalidCallbackUrl extends AuthError {} export class InvalidEndpoints extends AuthError {} /** @todo */ -export class InvalidState extends AuthError {} +export class InvalidCheck extends AuthError {} /** @todo */ export class JWTSessionError extends AuthError {} diff --git a/packages/core/src/jwt.ts b/packages/core/src/jwt.ts index a849f21b..73f566ce 100644 --- a/packages/core/src/jwt.ts +++ b/packages/core/src/jwt.ts @@ -48,9 +48,10 @@ const DEFAULT_MAX_AGE = 30 * 24 * 60 * 60 // 30 days const now = () => (Date.now() / 1000) | 0 /** Issues a JWT. By default, the JWT is encrypted using "A256GCM". */ -export async function encode(params: JWTEncodeParams) { +export async function encode(params: JWTEncodeParams) { const { token = {}, secret, maxAge = DEFAULT_MAX_AGE } = params const encryptionSecret = await getDerivedEncryptionKey(secret) + // @ts-expect-error `jose` allows any object as payload. return await new EncryptJWT(token) .setProtectedHeader({ alg: "dir", enc: "A256GCM" }) .setIssuedAt() @@ -60,14 +61,16 @@ export async function encode(params: JWTEncodeParams) { } /** Decodes a Auth.js issued JWT. */ -export async function decode(params: JWTDecodeParams): Promise { +export async function decode( + params: JWTDecodeParams +): Promise { const { token, secret } = params if (!token) return null const encryptionSecret = await getDerivedEncryptionKey(secret) const { payload } = await jwtDecrypt(token, encryptionSecret, { clockTolerance: 15, }) - return payload + return payload as Payload } export interface GetTokenParams { @@ -179,9 +182,9 @@ export interface DefaultJWT extends Record { */ export interface JWT extends Record, DefaultJWT {} -export interface JWTEncodeParams { +export interface JWTEncodeParams { /** The JWT payload. */ - token?: JWT + token?: Payload /** The secret used to encode the Auth.js issued JWT. */ secret: string /** diff --git a/packages/core/src/lib/assert.ts b/packages/core/src/lib/assert.ts index 28bd9af2..a21b4c7b 100644 --- a/packages/core/src/lib/assert.ts +++ b/packages/core/src/lib/assert.ts @@ -101,7 +101,8 @@ export function assertConfig( ) } - for (const provider of options.providers) { + for (const p of options.providers) { + const provider = typeof p === "function" ? p() : p if ( (provider.type === "oauth" || provider.type === "oidc") && !(provider.issuer ?? provider.options?.issuer) @@ -127,7 +128,7 @@ export function assertConfig( if (hasCredentials) { const dbStrategy = options.session?.strategy === "database" const onlyCredentials = !options.providers.some( - (p) => p.type !== "credentials" + (p) => (typeof p === "function" ? p() : p).type !== "credentials" ) if (dbStrategy && onlyCredentials) { return new UnsupportedStrategy( @@ -135,9 +136,10 @@ export function assertConfig( ) } - const credentialsNoAuthorize = options.providers.some( - (p) => p.type === "credentials" && !p.authorize - ) + const credentialsNoAuthorize = options.providers.some((p) => { + const provider = typeof p === "function" ? p() : p + return provider.type === "credentials" && !provider.authorize + }) if (credentialsNoAuthorize) { return new MissingAuthorize( "Must define an authorize() handler to use credentials authentication provider" diff --git a/packages/core/src/lib/index.ts b/packages/core/src/lib/index.ts index d4e35836..1bcb468b 100644 --- a/packages/core/src/lib/index.ts +++ b/packages/core/src/lib/index.ts @@ -11,6 +11,7 @@ import type { ResponseInternal, } from "../types.js" +/** @internal */ export async function AuthInternal< Body extends string | Record | any[] >( diff --git a/packages/core/src/lib/oauth/callback.ts b/packages/core/src/lib/oauth/callback.ts index 0552b52c..3eca8f6a 100644 --- a/packages/core/src/lib/oauth/callback.ts +++ b/packages/core/src/lib/oauth/callback.ts @@ -73,7 +73,7 @@ export async function handleOAuth( const state = await checks.state.use(cookies, resCookies, options) - const parameters = o.validateAuthResponse( + const codeGrantParams = o.validateAuthResponse( as, client, new URLSearchParams(query), @@ -81,36 +81,22 @@ export async function handleOAuth( ) /** https://www.rfc-editor.org/rfc/rfc6749#section-4.1.2.1 */ - if (o.isOAuth2Error(parameters)) { + if (o.isOAuth2Error(codeGrantParams)) { logger.debug("OAuthCallbackError", { providerId: provider.id, - ...parameters, + ...codeGrantParams, }) - throw new OAuthCallbackError(parameters.error) + throw new OAuthCallbackError(codeGrantParams.error) } - const codeVerifier = await checks.pkce.use( - cookies?.[options.cookies.pkceCodeVerifier.name], - options - ) - - if (codeVerifier) resCookies.push(codeVerifier.cookie) - - // TODO: - const nonce = await checks.nonce.use( - cookies?.[options.cookies.nonce.name], - options - ) - if (nonce && provider.type === "oidc") { - resCookies.push(nonce.cookie) - } + const codeVerifier = await checks.pkce.use(cookies, resCookies, options) let codeGrantResponse = await o.authorizationCodeGrantRequest( as, client, - parameters, + codeGrantParams, provider.callbackUrl, - codeVerifier?.codeVerifier ?? "auth" // TODO: review fallback code verifier + codeVerifier ?? "auth" // TODO: review fallback code verifier ) if (provider.token?.conform) { @@ -131,11 +117,12 @@ export async function handleOAuth( let tokens: TokenSet if (provider.type === "oidc") { + const nonce = await checks.nonce.use(cookies, resCookies, options) const result = await o.processAuthorizationCodeOpenIDResponse( as, client, codeGrantResponse, - nonce?.value ?? o.expectNoNonce + nonce ?? o.expectNoNonce ) if (o.isOAuth2Error(result)) { diff --git a/packages/core/src/lib/oauth/checks.ts b/packages/core/src/lib/oauth/checks.ts index d0f336d9..1234bfc6 100644 --- a/packages/core/src/lib/oauth/checks.ts +++ b/packages/core/src/lib/oauth/checks.ts @@ -1,14 +1,17 @@ import * as o from "oauth4webapi" -import * as jwt from "../../jwt.js" +import { InvalidCheck } from "../../errors.js" +import { encode, decode } from "../../jwt.js" import type { + CookiesOptions, InternalOptions, RequestInternal, - CookiesOptions, } from "../../types.js" import type { Cookie } from "../cookie.js" -import { InvalidState } from "../../errors.js" +interface CheckPayload { + value: string +} /** Returns a signed cookie. */ export async function signCookie( @@ -25,7 +28,11 @@ export async function signCookie( expires.setTime(expires.getTime() + maxAge * 1000) return { name: cookies[type].name, - value: await jwt.encode({ ...options.jwt, maxAge, token: { value } }), + value: await encode({ + ...options.jwt, + maxAge, + token: { value }, + }), options: { ...cookies[type].options, expires }, } } @@ -44,34 +51,43 @@ export const pkce = { ) return { cookie, value } }, - /** - * Returns code_verifier if provider uses PKCE, + * Returns code_verifier if the provider is configured to use PKCE, * and clears the container cookie afterwards. + * An error is thrown if the code_verifier is missing or invalid. + * @see https://www.rfc-editor.org/rfc/rfc7636 + * @see https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#pkce */ async use( - codeVerifier: string | undefined, + cookies: RequestInternal["cookies"], + resCookies: Cookie[], options: InternalOptions<"oauth"> - ): Promise<{ codeVerifier: string; cookie: Cookie } | undefined> { - const { cookies, provider } = options + ): Promise { + const { provider } = options - if (!provider?.checks?.includes("pkce") || !codeVerifier) { - return - } + if (!provider?.checks?.includes("pkce")) return - const pkce = (await jwt.decode({ + const codeVerifier = cookies?.[options.cookies.pkceCodeVerifier.name] + + if (!codeVerifier) + throw new InvalidCheck("PKCE code_verifier cookie was missing.") + + const value = await decode({ ...options.jwt, token: codeVerifier, - })) as any + }) - return { - codeVerifier: pkce?.value ?? undefined, - cookie: { - name: cookies.pkceCodeVerifier.name, - value: "", - options: { ...cookies.pkceCodeVerifier.options, maxAge: 0 }, - }, - } + if (!value?.value) + throw new InvalidCheck("PKCE code_verifier value could not be parsed.") + + // Clear the pkce code verifier cookie after use + resCookies.push({ + name: options.cookies.pkceCodeVerifier.name, + value: "", + options: { ...options.cookies.pkceCodeVerifier.options, maxAge: 0 }, + }) + + return value.value }, } @@ -86,26 +102,29 @@ export const state = { return { cookie, value } }, /** - * Returns state from the saved cookie - * if the provider supports states, + * Returns state if the provider is configured to use state, * and clears the container cookie afterwards. + * An error is thrown if the state is missing or invalid. + * @see https://www.rfc-editor.org/rfc/rfc6749#section-10.12 + * @see https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1 */ async use( cookies: RequestInternal["cookies"], resCookies: Cookie[], options: InternalOptions<"oauth"> ): Promise { - const { provider, jwt } = options + const { provider } = options if (!provider.checks.includes("state")) return const state = cookies?.[options.cookies.state.name] - if (!state) throw new InvalidState("State was missing from the cookies.") + if (!state) throw new InvalidCheck("State cookie was missing.") // IDEA: Let the user do something with the returned state - const value = (await jwt.decode({ ...options.jwt, token: state })) as any + const value = await decode({ ...options.jwt, token: state }) - if (!value?.value) throw new InvalidState("Could not parse state cookie.") + if (!value?.value) + throw new InvalidCheck("State value could not be parsed.") // Clear the state cookie after use resCookies.push({ @@ -128,28 +147,36 @@ export const nonce = { return { cookie, value } }, /** - * Returns nonce from if the provider supports nonce, + * Returns nonce if the provider is configured to use nonce, * and clears the container cookie afterwards. + * An error is thrown if the nonce is missing or invalid. + * @see https://openid.net/specs/openid-connect-core-1_0.html#NonceNotes + * @see https://danielfett.de/2020/05/16/pkce-vs-nonce-equivalent-or-not/#nonce */ async use( - nonce: string | undefined, + cookies: RequestInternal["cookies"], + resCookies: Cookie[], options: InternalOptions<"oauth"> - ): Promise<{ value: string; cookie: Cookie } | undefined> { - const { cookies, provider } = options + ): Promise { + const { provider } = options - if (!provider?.checks?.includes("nonce") || !nonce) { - return - } + if (!provider?.checks?.includes("nonce")) return - const value = (await jwt.decode({ ...options.jwt, token: nonce })) as any + const nonce = cookies?.[options.cookies.nonce.name] + if (!nonce) throw new InvalidCheck("Nonce cookie was missing.") - return { - value: value?.value ?? undefined, - cookie: { - name: cookies.nonce.name, - value: "", - options: { ...cookies.nonce.options, maxAge: 0 }, - }, - } + const value = await decode({ ...options.jwt, token: nonce }) + + if (!value?.value) + throw new InvalidCheck("Nonce value could not be parsed.") + + // Clear the nonce cookie after use + resCookies.push({ + name: options.cookies.nonce.name, + value: "", + options: { ...options.cookies.nonce.options, maxAge: 0 }, + }) + + return value.value }, } diff --git a/packages/core/src/lib/providers.ts b/packages/core/src/lib/providers.ts index 13d4bc92..33eab75b 100644 --- a/packages/core/src/lib/providers.ts +++ b/packages/core/src/lib/providers.ts @@ -23,7 +23,8 @@ export default function parseProviders(params: { } { const { url, providerId } = params - const providers = params.providers.map((provider) => { + const providers = params.providers.map((p) => { + const provider = typeof p === "function" ? p() : p const { options: userOptions, ...defaults } = provider const id = (userOptions?.id ?? defaults.id) as string diff --git a/packages/core/src/lib/routes/callback.ts b/packages/core/src/lib/routes/callback.ts index 7a81683b..eb9a4c82 100644 --- a/packages/core/src/lib/routes/callback.ts +++ b/packages/core/src/lib/routes/callback.ts @@ -139,7 +139,6 @@ export async function callback(params: { }) } - // @ts-expect-error await events.signIn?.({ user, account, profile, isNewUser }) // Handle first logins on new accounts diff --git a/packages/core/src/lib/routes/session.ts b/packages/core/src/lib/routes/session.ts index a7a67ad8..eff5ec1b 100644 --- a/packages/core/src/lib/routes/session.ts +++ b/packages/core/src/lib/routes/session.ts @@ -9,7 +9,7 @@ import type { SessionStore } from "../cookie.js" export async function session( sessionStore: SessionStore, options: InternalOptions -): Promise> { +): Promise> { const { adapter, jwt, @@ -19,8 +19,8 @@ export async function session( session: { strategy: sessionStrategy, maxAge: sessionMaxAge }, } = options - const response: ResponseInternal = { - body: {}, + const response: ResponseInternal = { + body: null, headers: { "Content-Type": "application/json" }, cookies: [], } diff --git a/packages/core/src/lib/web.ts b/packages/core/src/lib/web.ts index fc1a782f..fb93c7c2 100644 --- a/packages/core/src/lib/web.ts +++ b/packages/core/src/lib/web.ts @@ -78,7 +78,6 @@ export function toResponse(res: ResponseInternal): Response { const cookieHeader = serialize(name, value, options) if (headers.has("Set-Cookie")) headers.append("Set-Cookie", cookieHeader) else headers.set("Set-Cookie", cookieHeader) - // headers.set("Set-Cookie", cookieHeader) // TODO: Remove. Seems to be a bug with Headers in the runtime }) let body = res.body diff --git a/packages/core/src/providers/index.ts b/packages/core/src/providers/index.ts index 8f0093f2..8b100f73 100644 --- a/packages/core/src/providers/index.ts +++ b/packages/core/src/providers/index.ts @@ -44,6 +44,12 @@ export interface CommonProviderOptions { type: ProviderType } +interface InternalProviderOptions { + /** Used to deep merge user-provided config with the default config + */ + options?: Record +} + /** * Must be a supported authentication provider config: * - {@link OAuthConfig} @@ -57,17 +63,14 @@ export interface CommonProviderOptions { * @see [Credentials guide](https://authjs.dev/guides/providers/credentials) */ export type Provider

= ( - | OIDCConfig

- | OAuth2Config

- | EmailConfig - | CredentialsConfig -) & { - /** - * Used to deep merge user-provided config with the default config - * @internal - */ - options: Record -} + | ((OIDCConfig

| OAuth2Config

| EmailConfig | CredentialsConfig) & + InternalProviderOptions) + | (( + ...args: any + ) => (OAuth2Config

| OIDCConfig

| EmailConfig | CredentialsConfig) & + InternalProviderOptions) +) & + InternalProviderOptions export type BuiltInProviders = Record< OAuthProviderType, diff --git a/packages/core/src/providers/oauth.ts b/packages/core/src/providers/oauth.ts index b123fc8d..34fb7f26 100644 --- a/packages/core/src/providers/oauth.ts +++ b/packages/core/src/providers/oauth.ts @@ -19,7 +19,7 @@ type UrlParams = Record type EndpointRequest = ( context: C & { - /** Provider is passed for convenience, ans also contains the `callbackUrl`. */ + /** Provider is passed for convenience, and also contains the `callbackUrl`. */ provider: OAuthConfigInternal

& { signinUrl: string callbackUrl: string @@ -183,7 +183,6 @@ export type OAuthEndpointType = "authorization" | "token" | "userinfo" /** * We parsed `authorization`, `token` and `userinfo` * to always contain a valid `URL`, with the params - * @internal */ export type OAuthConfigInternal = Omit< OAuthConfig, @@ -193,6 +192,7 @@ export type OAuthConfigInternal = Omit< token?: { url: URL request?: TokenEndpointHandler["request"] + /** @internal */ conform?: TokenEndpointHandler["conform"] } userinfo?: { url: URL; request?: UserinfoEndpointHandler["request"] } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 555bbdaa..81a9d92a 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -121,10 +121,10 @@ export interface Account extends Partial { /** The OAuth profile returned from your provider */ export interface Profile { - sub?: string - name?: string - email?: string - image?: string + sub?: string | null + name?: string | null + email?: string | null + image?: string | null } /** [Documentation](https://authjs.dev/guides/basics/callbacks) */ @@ -406,7 +406,7 @@ export interface RequestInternal { /** @internal */ export interface ResponseInternal< - Body extends string | Record | any[] = any + Body extends string | Record | any[] | null = any > { status?: number headers?: Headers | HeadersInit