From 31789e88accdbf8aa9cd9f93b575f7827b230d94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 8 Mar 2024 11:37:14 +0000 Subject: [PATCH 01/13] docs: Update contributors.md --- docs/docs/contributors.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/contributors.md b/docs/docs/contributors.md index a041c3c0a3..761dad7ded 100644 --- a/docs/docs/contributors.md +++ b/docs/docs/contributors.md @@ -43,3 +43,7 @@ More information can be found at: https://opencollective.com/nextauth - In 2021, efforts have started to move NextAuth.js to other frameworks and to support as many databases and providers as possible. - In 2022, BalΓ‘zs OrbΓ‘n created Auth.js based on NextAuth.js, a runtime/framework independent core library that is the base of all Auth.js libraries going forward. + +## Notes + +The Auth.js/NextAuth.js project is not provided by, nor otherwise affiliated with Vercel Inc. or its subsidiaries. Any contributions to this project by individuals affiliated with Vercel are made in their personal capacity. From cf3902c307d1b56c87fc893adb9968908a59cb5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 8 Mar 2024 11:41:21 +0000 Subject: [PATCH 02/13] docs: Update README.md --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e39b3dc46c..c5a3e9845e 100644 --- a/README.md +++ b/README.md @@ -96,13 +96,6 @@ We have an [OpenCollective](https://opencollective.com/nextauth) for companies a
Clerk
πŸ’΅ - - - WorkOS Logo -
-
WorkOS
- πŸ’΅ - FusionAuth Logo @@ -175,6 +168,9 @@ We have an [OpenCollective](https://opencollective.com/nextauth) for companies a - πŸ’΅ Financial Sponsor - ☁️ Infrastructure Support +> [!NOTE] +> The Auth.js/NextAuth.js project is not provided by, nor otherwise affiliated with Vercel Inc. or its subsidiaries. Any contributions to this project by individuals affiliated with Vercel are made in their personal capacity. +
From 435d097ddc52cfa6b984f68dd9062142ef3ed43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 8 Mar 2024 12:56:52 +0100 Subject: [PATCH 03/13] docs: update sponsor mentions --- README.md | 2 +- docs/docs/sponsors.mdx | 11 +---------- docs/sidebars.ts | 2 +- docs/src/pages/index.js | 2 +- 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c5a3e9845e..d8db5fba15 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ See
authjs.dev for our framework-specific libraries, or check out next-auth.js.org for next-auth (Next.js).

- Don't want to manage auth yourself? Check out Clerk β†’ + (sponsored) Don't want to manage auth yourself? Check out Clerk β†’

diff --git a/docs/docs/sponsors.mdx b/docs/docs/sponsors.mdx index 44a585b367..ba790cc4fa 100644 --- a/docs/docs/sponsors.mdx +++ b/docs/docs/sponsors.mdx @@ -20,16 +20,7 @@ It would not be possible without the generous support of our sponsors. ## Gold Sponsors πŸ₯‡ -
-{[ - ["https://workos.com", "https://avatars.githubusercontent.com/u/47638084?s=200&v=4", "WorkOS"] -].map(([href, src, name]) => ( - - {`${name} - {name} - -))} -
+[Become](#become-a-sponsor) a Gold Sponsor! ## Silver Sponsors πŸ₯ˆ diff --git a/docs/sidebars.ts b/docs/sidebars.ts index ac959af1ba..37e2acbf1f 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -8,7 +8,7 @@ import { existsSync } from "fs" const clerk: PropSidebarItemLink = { type: "link", href: "https://clerk.com?utm_source=sponsorship&utm_medium=docs&utm_campaign=authjs&utm_content=nav", - label: "Hosted Auth (Clerk)", + label: "(sponsored) Hosted Auth (Clerk)", } export default { diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index 358f04d5b4..c260e12821 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -168,7 +168,7 @@ export default function Home() {
- Looking for a hosted alternative? + (sponsored )Looking for a hosted alternative? Date: Fri, 8 Mar 2024 12:01:26 +0000 Subject: [PATCH 04/13] docs: Update index.js --- docs/src/pages/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index c260e12821..6306e2ce94 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -168,7 +168,7 @@ export default function Home() {
- (sponsored )Looking for a hosted alternative? + (sponsored) Looking for a hosted alternative? Date: Fri, 8 Mar 2024 13:20:11 +0100 Subject: [PATCH 05/13] docs: Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d8db5fba15..048a8d1e11 100644 --- a/README.md +++ b/README.md @@ -168,9 +168,6 @@ We have an [OpenCollective](https://opencollective.com/nextauth) for companies a - πŸ’΅ Financial Sponsor - ☁️ Infrastructure Support -> [!NOTE] -> The Auth.js/NextAuth.js project is not provided by, nor otherwise affiliated with Vercel Inc. or its subsidiaries. Any contributions to this project by individuals affiliated with Vercel are made in their personal capacity. -
@@ -179,6 +176,9 @@ We have an [OpenCollective](https://opencollective.com/nextauth) for companies a 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). +> [!NOTE] +> The Auth.js/NextAuth.js project is not provided by, nor otherwise affiliated with Vercel Inc. or its subsidiaries. Any contributions to this project by individuals affiliated with Vercel are made in their personal capacity. + ## License ISC From 6f8b98e6b60b40b33241b653d777a0ee70c5bce7 Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Fri, 8 Mar 2024 15:47:02 +0100 Subject: [PATCH 06/13] chore(docs): update sponsor badge styling (#10253) --- README.md | 2 +- docs/docs/getting-started/adapters.mdx | 6 +- docs/docs/getting-started/introduction.mdx | 6 +- docs/package.json | 20 +- docs/sidebars.ts | 7 +- docs/src/css/index.css | 14 + docs/src/pages/index.js | 17 +- docs/src/pages/index.module.css | 21 +- pnpm-lock.yaml | 554 ++++++++------------- 9 files changed, 282 insertions(+), 365 deletions(-) diff --git a/README.md b/README.md index 048a8d1e11..54ffdccca9 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Auth.js is a set of open-source packages that are built on standard Web APIs for authentication in modern applications with any framework on any platform in any JS runtime.

- See authjs.dev for our framework-specific libraries, or check out next-auth.js.org for next-auth (Next.js). + See authjs.dev for our documentation and more information.

(sponsored) Don't want to manage auth yourself? Check out Clerk β†’ diff --git a/docs/docs/getting-started/adapters.mdx b/docs/docs/getting-started/adapters.mdx index cbc6ecf969..1229838025 100644 --- a/docs/docs/getting-started/adapters.mdx +++ b/docs/docs/getting-started/adapters.mdx @@ -17,11 +17,11 @@ Below you can see a list of official adapters that are distributed as their own If you don't find an adapter for the database or service you use, you can always create one yourself (and optionally open a PR so anyone can make use of it). Have a look at our guide on [how to create a database adapter](/guides/adapters/creating-a-database-adapter). ::: -

+
{manifest.adapters.map(({ id, name, img }) => ( - + -

{name} Adapter

+

{name} Adapter

))}
diff --git a/docs/docs/getting-started/introduction.mdx b/docs/docs/getting-started/introduction.mdx index a4a7572230..91bd084fab 100644 --- a/docs/docs/getting-started/introduction.mdx +++ b/docs/docs/getting-started/introduction.mdx @@ -9,14 +9,14 @@ import manifest from "../../manifest.mjs" Auth.js is a complete open-source authentication solution for web applications. Check out the live demos of Auth.js in action: -
+
{manifest.frameworks // TODO: Add Auth.js Core example .filter((f) => f.id !== "core") .map(({ id, name, url, logo }) => ( - + -

{name}

+

{name}

))}
diff --git a/docs/package.json b/docs/package.json index 957061424a..31b68ecff7 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,16 +26,16 @@ "styled-components": "5.3.6" }, "devDependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/eslint-plugin": "3.0.0", - "@docusaurus/module-type-aliases": "3.0.0", - "@docusaurus/preset-classic": "3.0.0", - "@docusaurus/remark-plugin-npm2yarn": "3.0.0", - "@docusaurus/theme-classic": "3.0.0", - "@docusaurus/theme-common": "3.0.0", - "@docusaurus/theme-mermaid": "3.0.0", - "@docusaurus/tsconfig": "3.0.0", - "@docusaurus/types": "3.0.0", + "@docusaurus/core": "3.1.1", + "@docusaurus/eslint-plugin": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/preset-classic": "3.1.1", + "@docusaurus/remark-plugin-npm2yarn": "3.1.1", + "@docusaurus/theme-classic": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-mermaid": "3.1.1", + "@docusaurus/tsconfig": "3.1.1", + "@docusaurus/types": "3.1.1", "docusaurus-plugin-typedoc": "1.0.0-next.22", "typedoc": "0.25.3", "typedoc-plugin-markdown": "4.0.0-next.29", diff --git a/docs/sidebars.ts b/docs/sidebars.ts index 37e2acbf1f..d91d567f00 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -6,9 +6,10 @@ import manifest from "./manifest.mjs" import { existsSync } from "fs" const clerk: PropSidebarItemLink = { - type: "link", - href: "https://clerk.com?utm_source=sponsorship&utm_medium=docs&utm_campaign=authjs&utm_content=nav", - label: "(sponsored) Hosted Auth (Clerk)", + type: "html", + value: + 'Hosted Auth (Clerk)
Sponsored
', + defaultStyle: true, } export default { diff --git a/docs/src/css/index.css b/docs/src/css/index.css index 985efaca80..42d486ede8 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -303,3 +303,17 @@ html[data-theme="dark"] #carbonads .carbon-poweredby { } } } + +.sponsoredBadge { + display: inline-block; + width: max-content; + font-size: 0.75rem; + border-radius: 0.25rem; + padding-inline: 0.5rem; + padding-block: 0.25rem; + background-color: #e1e1e1; +} + +[data-theme="dark"] .sponsoredBadge { + background-color: #242526; +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index 6306e2ce94..70ae10f819 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -168,13 +168,16 @@ export default function Home() {
- (sponsored) Looking for a hosted alternative? - - Try Clerk β†’ - +
+ Looking for a hosted alternative? + + Try Clerk β†’ + +
+
Sponsored
diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index bb0553ec38..bfaa70a1b2 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -122,10 +122,29 @@ .heroClerk { display: flex; + flex-direction: column; align-items: center; justify-content: center; gap: 0.5rem; font-size: 1.2rem; position: relative; - z-index: 1000; + z-index: 2; +} + +.heroClerk div { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.sponsoredBadge { + font-size: 0.75rem; + border-radius: 0.25rem; + padding-inline: 0.5rem; + padding-block: 0.25rem; + background-color: #e1e1e1; +} + +[data-theme="dark"] .sponsoredBadge { + background-color: #242526; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6dc825b46..c100a7b54e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -197,35 +197,35 @@ importers: version: 5.3.6(@babel/core@7.23.9)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) devDependencies: '@docusaurus/core': - specifier: 3.0.0 - version: 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + specifier: 3.1.1 + version: 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@docusaurus/eslint-plugin': - specifier: 3.0.0 - version: 3.0.0(eslint@8.30.0)(typescript@5.2.2) + specifier: 3.1.1 + version: 3.1.1(eslint@8.30.0)(typescript@5.2.2) '@docusaurus/module-type-aliases': - specifier: 3.0.0 - version: 3.0.0(react-dom@18.2.0)(react@18.2.0) + specifier: 3.1.1 + version: 3.1.1(react-dom@18.2.0)(react@18.2.0) '@docusaurus/preset-classic': - specifier: 3.0.0 - version: 3.0.0(@algolia/client-search@4.22.1)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) + specifier: 3.1.1 + version: 3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) '@docusaurus/remark-plugin-npm2yarn': - specifier: 3.0.0 - version: 3.0.0 + specifier: 3.1.1 + version: 3.1.1 '@docusaurus/theme-classic': - specifier: 3.0.0 - version: 3.0.0(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + specifier: 3.1.1 + version: 3.1.1(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@docusaurus/theme-common': - specifier: 3.0.0 - version: 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + specifier: 3.1.1 + version: 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@docusaurus/theme-mermaid': - specifier: 3.0.0 - version: 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + specifier: 3.1.1 + version: 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@docusaurus/tsconfig': - specifier: 3.0.0 - version: 3.0.0 + specifier: 3.1.1 + version: 3.1.1 '@docusaurus/types': - specifier: 3.0.0 - version: 3.0.0(react-dom@18.2.0)(react@18.2.0) + specifier: 3.1.1 + version: 3.1.1(react-dom@18.2.0)(react@18.2.0) docusaurus-plugin-typedoc: specifier: 1.0.0-next.22 version: 1.0.0-next.22(typedoc-plugin-markdown@4.0.0-next.29) @@ -3319,8 +3319,8 @@ packages: - '@algolia/client-search' dev: true - /@docusaurus/core@3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-bHWtY55tJTkd6pZhHrWz1MpWuwN4edZe0/UWgFF7PW/oJeDZvLSXKqwny3L91X1/LGGoypBGkeZn8EOuKeL4yQ==} + /@docusaurus/core@3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==} engines: {node: '>=18.0'} hasBin: true peerDependencies: @@ -3337,13 +3337,13 @@ packages: '@babel/runtime': 7.23.9 '@babel/runtime-corejs3': 7.23.9 '@babel/traverse': 7.23.9 - '@docusaurus/cssnano-preset': 3.0.0 - '@docusaurus/logger': 3.0.0 - '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/cssnano-preset': 3.1.1 + '@docusaurus/logger': 3.1.1 + '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 autoprefixer: 10.4.17(postcss@8.4.33) @@ -3393,7 +3393,6 @@ packages: tslib: 2.6.2 update-notifier: 6.0.2 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.90.0) - wait-on: 7.2.0 webpack: 5.90.0 webpack-bundle-analyzer: 4.10.1 webpack-dev-server: 4.15.1(webpack@5.90.0) @@ -3419,8 +3418,8 @@ packages: - webpack-cli dev: true - /@docusaurus/cssnano-preset@3.0.0: - resolution: {integrity: sha512-FHiRfwmVvIVdIGsHcijUOaX7hMn0mugVYB7m4GkpYI6Mi56zwQV4lH5p7DxcW5CUYNWMVxz2loWSCiWEm5ikwA==} + /@docusaurus/cssnano-preset@3.1.1: + resolution: {integrity: sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==} engines: {node: '>=18.0'} dependencies: cssnano-preset-advanced: 5.3.10(postcss@8.4.33) @@ -3429,8 +3428,8 @@ packages: tslib: 2.6.2 dev: true - /@docusaurus/eslint-plugin@3.0.0(eslint@8.30.0)(typescript@5.2.2): - resolution: {integrity: sha512-wQzKwbvKkXzSEcWPKItIBhaOQe38/fHkUhiGNsM3xQq2WJ7/CdgKR3avjHJHz2hqpfSNvU5gLHYQFfgfDZ6Flw==} + /@docusaurus/eslint-plugin@3.1.1(eslint@8.30.0)(typescript@5.2.2): + resolution: {integrity: sha512-seOuNvqXVxM4hWs9NzUgLnlVvc0Rk9N+C5fZ5gVTk5hc5JlyJNZNWh85TU+XsLogbA5odjJSEDKOhv8SDGmWRg==} engines: {node: '>=18.0'} peerDependencies: eslint: '>=6' @@ -3443,16 +3442,16 @@ packages: - typescript dev: true - /@docusaurus/logger@3.0.0: - resolution: {integrity: sha512-6eX0eOfioMQCk+qgCnHvbLLuyIAA+r2lSID6d6JusiLtDKmYMfNp3F4yyE8bnb0Abmzt2w68XwptEFYyALSAXw==} + /@docusaurus/logger@3.1.1: + resolution: {integrity: sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==} engines: {node: '>=18.0'} dependencies: chalk: 4.1.2 tslib: 2.6.2 dev: true - /@docusaurus/mdx-loader@3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-JkGge6WYDrwjNgMxwkb6kNQHnpISt5L1tMaBWFDBKeDToFr5Kj29IL35MIQm0RfrnoOfr/29RjSH4aRtvlAR0A==} + /@docusaurus/mdx-loader@3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 @@ -3460,9 +3459,9 @@ packages: dependencies: '@babel/parser': 7.23.9 '@babel/traverse': 7.23.9 - '@docusaurus/logger': 3.0.0 - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/logger': 3.1.1 + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) '@mdx-js/mdx': 3.0.0 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 @@ -3495,14 +3494,14 @@ packages: - webpack-cli dev: true - /@docusaurus/module-type-aliases@3.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CfC6CgN4u/ce+2+L1JdsHNyBd8yYjl4De2B2CBj2a9F7WuJ5RjV1ciuU7KDg8uyju+NRVllRgvJvxVUjCdkPiw==} + /@docusaurus/module-type-aliases@3.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A==} peerDependencies: react: '*' react-dom: '*' dependencies: '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) '@types/history': 4.7.11 '@types/react': 18.2.48 '@types/react-router-config': 5.0.11 @@ -3514,24 +3513,25 @@ packages: transitivePeerDependencies: - '@swc/core' - esbuild + - supports-color - uglify-js - webpack-cli dev: true - /@docusaurus/plugin-content-blog@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-iA8Wc3tIzVnROJxrbIsU/iSfixHW16YeW9RWsBw7hgEk4dyGsip9AsvEDXobnRq3lVv4mfdgoS545iGWf1Ip9w==} + /@docusaurus/plugin-content-blog@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.0.0 - '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.1.1 + '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -3563,20 +3563,20 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-content-docs@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-MFZsOSwmeJ6rvoZMLieXxPuJsA9M9vn7/mUZmfUzSUTeHAeq+fEqvLltFOxcj4DVVDTYlQhgWYd+PISIWgamKw==} + /@docusaurus/plugin-content-docs@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.0.0 - '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.1.1 + '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -3606,18 +3606,18 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-content-pages@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-EXYHXK2Ea1B5BUmM0DgSwaOYt8EMSzWtYUToNo62Q/EoWxYOQFdWglYnw3n7ZEGyw5Kog4LHaRwlazAdmDomvQ==} + /@docusaurus/plugin-content-pages@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) fs-extra: 11.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3642,31 +3642,29 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-debug@3.0.0(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-gSV07HfQgnUboVEb3lucuVyv5pEoy33E7QXzzn++3kSc/NLEimkjXh3sSnTGOishkxCqlFV9BHfY/VMm5Lko5g==} + /@docusaurus/plugin-debug@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@microlink/react-json-view': 1.23.0(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) fs-extra: 11.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + react-json-view-lite: 1.2.1(react@18.2.0) tslib: 2.6.2 transitivePeerDependencies: - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' - - '@types/react' - bufferutil - csso - debug - - encoding - esbuild - eslint - lightningcss @@ -3678,16 +3676,16 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-google-analytics@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-0zcLK8w+ohmSm1fjUQCqeRsjmQc0gflvXnaVA/QVVCtm2yCiBtkrSGQXqt4MdpD7Xq8mwo3qVd5nhIcvrcebqw==} + /@docusaurus/plugin-google-analytics@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -3710,16 +3708,16 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-google-gtag@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-asEKavw8fczUqvXu/s9kG2m1epLnHJ19W6CCCRZEmpnkZUZKiM8rlkDiEmxApwIc2JDDbIMk+Y2TMkJI8mInbQ==} + /@docusaurus/plugin-google-gtag@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) '@types/gtag.js': 0.0.12 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3743,16 +3741,16 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-google-tag-manager@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-lytgu2eyn+7p4WklJkpMGRhwC29ezj4IjPPmVJ8vGzcSl6JkR1sADTHLG5xWOMuci420xZl9dGEiLTQ8FjCRyA==} + /@docusaurus/plugin-google-tag-manager@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -3775,19 +3773,19 @@ packages: - webpack-cli dev: true - /@docusaurus/plugin-sitemap@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-cfcONdWku56Oi7Hdus2uvUw/RKRRlIGMViiHLjvQ21CEsEqnQ297MRoIgjU28kL7/CXD/+OiANSq3T1ezAiMhA==} + /@docusaurus/plugin-sitemap@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.0.0 - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.1.1 + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) fs-extra: 11.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3812,26 +3810,26 @@ packages: - webpack-cli dev: true - /@docusaurus/preset-classic@3.0.0(@algolia/client-search@4.22.1)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): - resolution: {integrity: sha512-90aOKZGZdi0+GVQV+wt8xx4M4GiDrBRke8NO8nWwytMEXNrxrBxsQYFRD1YlISLJSCiHikKf3Z/MovMnQpnZyg==} + /@docusaurus/preset-classic@3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): + resolution: {integrity: sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-blog': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-pages': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-debug': 3.0.0(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-google-analytics': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-google-gtag': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-google-tag-manager': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-sitemap': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-classic': 3.0.0(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-search-algolia': 3.0.0(@algolia/client-search@4.22.1)(@docusaurus/types@3.0.0)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-blog': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-debug': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-analytics': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-gtag': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-google-tag-manager': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-sitemap': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-classic': 3.1.1(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-search-algolia': 3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -3844,7 +3842,6 @@ packages: - bufferutil - csso - debug - - encoding - esbuild - eslint - lightningcss @@ -3867,8 +3864,8 @@ packages: react: 18.2.0 dev: true - /@docusaurus/remark-plugin-npm2yarn@3.0.0: - resolution: {integrity: sha512-OapBu1mXui1LLc/1RJztl0Syr5sTKX6GWt10HBB5XvCxb9l08IkcQwjzktNLWZAUOr+Xbx6LBINbAgm7yKSUOw==} + /@docusaurus/remark-plugin-npm2yarn@3.1.1: + resolution: {integrity: sha512-3dbQqXIOPIM6EYASWFodG+Ha5i8YGTPKukPYjupQeRzBGWXzunsr1z8voOjm+ljxSgRtgyZ7+q9tlpmYFi7x9A==} engines: {node: '>=18.0'} dependencies: mdast-util-mdx: 3.0.0 @@ -3880,33 +3877,33 @@ packages: - supports-color dev: true - /@docusaurus/theme-classic@3.0.0(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-wWOHSrKMn7L4jTtXBsb5iEJ3xvTddBye5PjYBnWiCkTAlhle2yMdc4/qRXW35Ot+OV/VXu6YFG8XVUJEl99z0A==} + /@docusaurus/theme-classic@3.1.1(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-pages': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-translations': 3.0.0 - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.1.1 + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) '@mdx-js/react': 3.0.0(@types/react@18.2.48)(react@18.2.0) - clsx: 1.2.1 + clsx: 2.1.0 copy-text-to-clipboard: 3.2.0 infima: 0.2.0-alpha.43 lodash: 4.17.21 nprogress: 0.2.0 postcss: 8.4.33 - prism-react-renderer: 2.1.0(react@18.2.0) + prism-react-renderer: 2.3.1(react@18.2.0) prismjs: 1.29.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3934,26 +3931,26 @@ packages: - webpack-cli dev: true - /@docusaurus/theme-common@3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-PahRpCLRK5owCMEqcNtUeTMOkTUCzrJlKA+HLu7f+8osYOni617YurXvHASCsSTxurjXaLz/RqZMnASnqATxIA==} + /@docusaurus/theme-common@3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/mdx-loader': 3.0.0(@docusaurus/types@3.0.0)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-pages': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-common': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) '@types/history': 4.7.11 '@types/react': 18.2.48 '@types/react-router-config': 5.0.11 - clsx: 1.2.1 + clsx: 2.1.0 parse-numeric-range: 1.3.0 - prism-react-renderer: 2.1.0(react@18.2.0) + prism-react-renderer: 2.3.1(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -3978,18 +3975,18 @@ packages: - webpack-cli dev: true - /@docusaurus/theme-mermaid@3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-e5uoGmow5kk5AeiyYFHYGsM5LFg4ClCIIQQcBrD9zs1E8yxTDNX524MylO6klqqCn3TmxJ34RogEg78QnthRng==} + /@docusaurus/theme-mermaid@3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-O6u9/7QX/ZapV4HJJSzNs0Jir1KA/LRLORWYeDvbGswqZNusj6q4iLELrKIClysJ3PB3zWUzyKtI/wjIKiV1vA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/module-type-aliases': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/module-type-aliases': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) mermaid: 10.6.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4013,24 +4010,24 @@ packages: - webpack-cli dev: true - /@docusaurus/theme-search-algolia@3.0.0(@algolia/client-search@4.22.1)(@docusaurus/types@3.0.0)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): - resolution: {integrity: sha512-PyMUNIS9yu0dx7XffB13ti4TG47pJq3G2KE/INvOFb6M0kWh+wwCnucPg4WAOysHOPh+SD9fjlXILoLQstgEIA==} + /@docusaurus/theme-search-algolia@3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.48)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): + resolution: {integrity: sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: '@docsearch/react': 3.5.2(@algolia/client-search@4.22.1)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) - '@docusaurus/core': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.0.0 - '@docusaurus/plugin-content-docs': 3.0.0(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-common': 3.0.0(@docusaurus/types@3.0.0)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-translations': 3.0.0 - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) - '@docusaurus/utils-validation': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/logger': 3.1.1 + '@docusaurus/plugin-content-docs': 3.1.1(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(eslint@8.30.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.1.1 + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) algoliasearch: 4.22.1 algoliasearch-helper: 3.16.2(algoliasearch@4.22.1) - clsx: 1.2.1 + clsx: 2.1.0 eta: 2.2.0 fs-extra: 11.2.0 lodash: 4.17.21 @@ -4061,24 +4058,25 @@ packages: - webpack-cli dev: true - /@docusaurus/theme-translations@3.0.0: - resolution: {integrity: sha512-p/H3+5LdnDtbMU+csYukA6601U1ld2v9knqxGEEV96qV27HsHfP63J9Ta2RBZUrNhQAgrwFzIc9GdDO8P1Baag==} + /@docusaurus/theme-translations@3.1.1: + resolution: {integrity: sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg==} engines: {node: '>=18.0'} dependencies: fs-extra: 11.2.0 tslib: 2.6.2 dev: true - /@docusaurus/tsconfig@3.0.0: - resolution: {integrity: sha512-yR9sng4izFudS+v1xV5yboNfc1hATMDpYp9iYfWggbBDwKSm0J1IdIgkygRnqC/AWs1ARUQUpG0gFotPCE/4Ew==} + /@docusaurus/tsconfig@3.1.1: + resolution: {integrity: sha512-FTBuY3KvaHfMVBgvlPmDQ+KS9Q/bYtVftq2ugou3PgBDJoQmw2aUZ4Sg15HKqLGbfIkxoy9t6cqE4Yw1Ta8Q1A==} dev: true - /@docusaurus/types@3.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Qb+l/hmCOVemReuzvvcFdk84bUmUFyD0Zi81y651ie3VwMrXqC7C0E7yZLKMOsLj/vkqsxHbtkAuYMI89YzNzg==} + /@docusaurus/types@3.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: + '@mdx-js/mdx': 3.0.0 '@types/history': 4.7.11 '@types/react': 18.2.48 commander: 5.1.0 @@ -4092,12 +4090,13 @@ packages: transitivePeerDependencies: - '@swc/core' - esbuild + - supports-color - uglify-js - webpack-cli dev: true - /@docusaurus/utils-common@3.0.0(@docusaurus/types@3.0.0): - resolution: {integrity: sha512-7iJWAtt4AHf4PFEPlEPXko9LZD/dbYnhLe0q8e3GRK1EXZyRASah2lznpMwB3lLmVjq/FR6ZAKF+E0wlmL5j0g==} + /@docusaurus/utils-common@3.1.1(@docusaurus/types@3.1.1): + resolution: {integrity: sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg==} engines: {node: '>=18.0'} peerDependencies: '@docusaurus/types': '*' @@ -4105,16 +4104,16 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) tslib: 2.6.2 dev: true - /@docusaurus/utils-validation@3.0.0(@docusaurus/types@3.0.0): - resolution: {integrity: sha512-MlIGUspB/HBW5CYgHvRhmkZbeMiUWKbyVoCQYvbGN8S19SSzVgzyy97KRpcjCOYYeEdkhmRCUwFBJBlLg3IoNQ==} + /@docusaurus/utils-validation@3.1.1(@docusaurus/types@3.1.1): + resolution: {integrity: sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==} engines: {node: '>=18.0'} dependencies: - '@docusaurus/logger': 3.0.0 - '@docusaurus/utils': 3.0.0(@docusaurus/types@3.0.0) + '@docusaurus/logger': 3.1.1 + '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) joi: 17.12.0 js-yaml: 4.1.0 tslib: 2.6.2 @@ -4127,8 +4126,8 @@ packages: - webpack-cli dev: true - /@docusaurus/utils@3.0.0(@docusaurus/types@3.0.0): - resolution: {integrity: sha512-JwGjh5mtjG9XIAESyPxObL6CZ6LO/yU4OSTpq7Q0x+jN25zi/AMbvLjpSyZzWy+qm5uQiFiIhqFaOxvy+82Ekg==} + /@docusaurus/utils@3.1.1(@docusaurus/types@3.1.1): + resolution: {integrity: sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==} engines: {node: '>=18.0'} peerDependencies: '@docusaurus/types': '*' @@ -4136,8 +4135,8 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/logger': 3.0.0 - '@docusaurus/types': 3.0.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/logger': 3.1.1 + '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) '@svgr/webpack': 6.5.1 escape-string-regexp: 4.0.0 file-loader: 6.2.0(webpack@5.90.0) @@ -6058,23 +6057,6 @@ packages: '@types/react': 18.2.48 react: 18.2.0 - /@microlink/react-json-view@1.23.0(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HYJ1nsfO4/qn8afnAMhuk7+5a1vcjEaS8Gm5Vpr1SqdHDY0yLBJGpA+9DvKyxyVKaUkXzKXt3Mif9RcmFSdtYg==} - peerDependencies: - react: '>= 15' - react-dom: '>= 15' - dependencies: - flux: 4.0.4(react@18.2.0) - react: 18.2.0 - react-base16-styling: 0.6.0 - react-dom: 18.2.0(react@18.2.0) - react-lifecycles-compat: 3.0.4 - react-textarea-autosize: 8.3.4(@types/react@18.2.48)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - encoding - dev: true - /@mikro-orm/core@5.9.7(@mikro-orm/sqlite@5.9.7): resolution: {integrity: sha512-VzbpJPQlwuK6Q/4FkppWNGKvzyYL31Gsw/qskr/GCa/010yLO8u3RQio/Q1EKRi+tNsjhqTPGA1b7OOM+DvpiQ==} engines: {node: '>= 14.0.0'} @@ -9505,7 +9487,7 @@ packages: engines: {node: '>= 6.0.0'} requiresBuild: true dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -9978,16 +9960,6 @@ packages: - debug dev: true - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - dependencies: - follow-redirects: 1.15.5(debug@4.3.4) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true - /axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} dependencies: @@ -10141,10 +10113,6 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} requiresBuild: true - /base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} - dev: true - /base32.js@0.1.0: resolution: {integrity: sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==} engines: {node: '>=0.12.0'} @@ -10648,15 +10616,18 @@ packages: /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + requiresBuild: true /character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + requiresBuild: true /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} /character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + requiresBuild: true /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -10935,6 +10906,12 @@ packages: /clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} + dev: false + + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: true /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} @@ -11972,17 +11949,6 @@ packages: ms: 2.1.3 dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - /debug@4.3.4(supports-color@5.5.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -13827,14 +13793,6 @@ packages: bser: 2.1.1 dev: true - /fbemitter@3.0.0: - resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} - dependencies: - fbjs: 3.0.5 - transitivePeerDependencies: - - encoding - dev: true - /fbjs-css-vars@1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} dev: true @@ -14039,18 +13997,6 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /flux@4.0.4(react@18.2.0): - resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} - peerDependencies: - react: ^15.0.2 || ^16.0.0 || ^17.0.0 - dependencies: - fbemitter: 3.0.0 - fbjs: 3.0.5 - react: 18.2.0 - transitivePeerDependencies: - - encoding - dev: true - /fn-annotate@1.2.0: resolution: {integrity: sha512-j2gv2wkRhQgkJNf1ygdca8ynP3tK+a87bowc+RG81iWTye3yKIOeAkrKYv0Kqyh8yCeSyljOk3ZFelfXUFpirA==} engines: {node: '>=0.10.0'} @@ -15224,7 +15170,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true @@ -15287,7 +15233,7 @@ packages: requiresBuild: true dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15578,9 +15524,11 @@ packages: /is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + requiresBuild: true /is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + requiresBuild: true dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 @@ -15658,6 +15606,7 @@ packages: /is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + requiresBuild: true /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -15706,6 +15655,7 @@ packages: /is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + requiresBuild: true /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} @@ -16363,7 +16313,7 @@ packages: dependencies: '@types/express': 4.17.21 '@types/jsonwebtoken': 9.0.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) jose: 4.15.4 limiter: 1.1.5 lru-memoizer: 2.2.0 @@ -16815,10 +16765,6 @@ packages: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: true - /lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - dev: true - /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true @@ -16826,10 +16772,6 @@ packages: /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - /lodash.flow@3.5.0: - resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} - dev: true - /lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -20787,6 +20729,17 @@ packages: '@types/prismjs': 1.26.3 clsx: 1.2.1 react: 18.2.0 + dev: false + + /prism-react-renderer@2.3.1(react@18.2.0): + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + peerDependencies: + react: '>=16.0.0' + dependencies: + '@types/prismjs': 1.26.3 + clsx: 2.1.0 + react: 18.2.0 + dev: true /prisma@5.8.1: resolution: {integrity: sha512-N6CpjzECnUHZ5beeYpDzkt2rYpEdAeqXX2dweu6BoQaeYkNZrC/WJHM+5MO/uidFHTak8QhkPKBWck1o/4MD4A==} @@ -20817,6 +20770,7 @@ packages: /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + requiresBuild: true dev: false optional: true @@ -20950,6 +20904,9 @@ packages: /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + requiresBuild: true + dev: false + optional: true /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -21026,10 +20983,6 @@ packages: dev: false optional: true - /pure-color@1.3.0: - resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} - dev: true - /pvtsutils@1.3.5: resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} dependencies: @@ -21117,15 +21070,6 @@ packages: strip-json-comments: 2.0.1 dev: true - /react-base16-styling@0.6.0: - resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} - dependencies: - base16: 1.0.0 - lodash.curry: 4.1.1 - lodash.flow: 3.5.0 - pure-color: 1.3.0 - dev: true - /react-dev-utils@12.0.1(eslint@8.30.0)(typescript@5.2.2)(webpack@5.90.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} @@ -21219,8 +21163,13 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - /react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + /react-json-view-lite@1.2.1(react@18.2.0): + resolution: {integrity: sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 dev: true /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.90.0): @@ -21286,20 +21235,6 @@ packages: tiny-warning: 1.0.3 dev: true - /react-textarea-autosize@8.3.4(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.23.9 - react: 18.2.0 - use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.2.48)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - dev: true - /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -21759,7 +21694,7 @@ packages: engines: {node: '>=12'} requiresBuild: true dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) extend: 3.0.2 transitivePeerDependencies: - supports-color @@ -22692,9 +22627,6 @@ packages: /sqlite3@5.1.6: resolution: {integrity: sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==} requiresBuild: true - peerDependenciesMeta: - node-gyp: - optional: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 node-addon-api: 4.3.0 @@ -22710,9 +22642,6 @@ packages: /sqlite3@5.1.7: resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} requiresBuild: true - peerDependenciesMeta: - node-gyp: - optional: true dependencies: bindings: 1.5.0 node-addon-api: 7.1.0 @@ -24572,41 +24501,6 @@ packages: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} dev: true - /use-composed-ref@1.3.0(react@18.2.0): - resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: true - - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.48 - react: 18.2.0 - dev: true - - /use-latest@1.2.1(@types/react@18.2.48)(react@18.2.0): - resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.48 - react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.48)(react@18.2.0) - dev: true - /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} requiresBuild: true @@ -24996,20 +24890,6 @@ packages: - debug dev: true - /wait-on@7.2.0: - resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} - engines: {node: '>=12.0.0'} - hasBin: true - dependencies: - axios: 1.6.7 - joi: 17.12.0 - lodash: 4.17.21 - minimist: 1.2.8 - rxjs: 7.8.1 - transitivePeerDependencies: - - debug - dev: true - /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} From 255403544c2199b138876f4ba10ab0ef03da832a Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Fri, 8 Mar 2024 15:57:46 +0100 Subject: [PATCH 07/13] chore(docs): darkmode `.sponsoredBadge` styles (#10255) --- docs/docusaurus.config.ts | 2 +- docs/src/css/index.css | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index bc7ecdeca3..23e26cfe58 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -222,7 +222,7 @@ export default { ], scripts: [ { - src: "js/clerk.js", + src: "/js/clerk.js", async: true, }, ], diff --git a/docs/src/css/index.css b/docs/src/css/index.css index 42d486ede8..31015e02c6 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -304,7 +304,7 @@ html[data-theme="dark"] #carbonads .carbon-poweredby { } } -.sponsoredBadge { +[data-theme="light"] .sponsoredBadge { display: inline-block; width: max-content; font-size: 0.75rem; @@ -315,5 +315,11 @@ html[data-theme="dark"] #carbonads .carbon-poweredby { } [data-theme="dark"] .sponsoredBadge { + display: inline-block; + width: max-content; + font-size: 0.75rem; + border-radius: 0.25rem; + padding-inline: 0.5rem; + padding-block: 0.25rem; background-color: #242526; } From 6607f129e842b3f3a077ce9910bbc7e6d51dd2e0 Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Fri, 8 Mar 2024 16:14:04 +0100 Subject: [PATCH 08/13] chore(docs): tweak `.sponsoredBadge` styles (#10256) --- docs/src/css/index.css | 8 +++++--- docs/src/pages/index.module.css | 11 +++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/src/css/index.css b/docs/src/css/index.css index 31015e02c6..11a453daf9 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -308,18 +308,20 @@ html[data-theme="dark"] #carbonads .carbon-poweredby { display: inline-block; width: max-content; font-size: 0.75rem; - border-radius: 0.25rem; + border-radius: 2rem; padding-inline: 0.5rem; padding-block: 0.25rem; background-color: #e1e1e1; + color: #696969; } [data-theme="dark"] .sponsoredBadge { display: inline-block; width: max-content; - font-size: 0.75rem; - border-radius: 0.25rem; + font-size: 0.6rem; + border-radius: 2rem; padding-inline: 0.5rem; padding-block: 0.25rem; background-color: #242526; + color: #696969; } diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index bfaa70a1b2..4ef0116c95 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -137,12 +137,19 @@ gap: 0.5rem; } +@media screen and (max-width: 689px) { + .heroClerk div { + flex-direction: column; + } +} + .sponsoredBadge { - font-size: 0.75rem; - border-radius: 0.25rem; + font-size: 0.6rem; + border-radius: 2rem; padding-inline: 0.5rem; padding-block: 0.25rem; background-color: #e1e1e1; + color: #696969; } [data-theme="dark"] .sponsoredBadge { From ac44c3ab9472d149dd2dbde788a8885db87f3a5a Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Fri, 8 Mar 2024 17:24:47 +0100 Subject: [PATCH 09/13] chore(docs): more badge style tweaks (#10257) --- docs/sidebars.ts | 2 +- docs/src/css/index.css | 44 +++++++++++---------------------- docs/src/pages/index.module.css | 5 ++-- 3 files changed, 18 insertions(+), 33 deletions(-) diff --git a/docs/sidebars.ts b/docs/sidebars.ts index d91d567f00..88bfc8bc12 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -8,7 +8,7 @@ import { existsSync } from "fs" const clerk: PropSidebarItemLink = { type: "html", value: - 'Hosted Auth (Clerk)
Sponsored
', + 'Hosted Auth (Clerk)
Sponsored
', defaultStyle: true, } diff --git a/docs/src/css/index.css b/docs/src/css/index.css index 11a453daf9..d735aadfb8 100644 --- a/docs/src/css/index.css +++ b/docs/src/css/index.css @@ -259,6 +259,7 @@ html[data-theme="dark"] hr { line-height: 1.5; text-align: left; } + #carbonads .carbon-poweredby { display: block; padding: 6px 8px; @@ -279,6 +280,11 @@ html[data-theme="dark"] #carbonads .carbon-text { color: #ddd; } +html[data-theme="dark"] #carbonads .carbon-poweredby { + color: #aaa; + background: #1e2021; +} + html[data-theme="dark"] #carbonads > span { background: #1a1a1a; box-shadow: @@ -288,40 +294,18 @@ html[data-theme="dark"] #carbonads > span { 0 0 8px hsl(0deg 0% 0% / 9%); } -html[data-theme="dark"] #carbonads .carbon-poweredby { - color: #aaa; - background: #1e2021; -} - -.theme-doc-markdown.markdown { - > p:first-of-type { - :last-child { - img { - width: 48px; - height: 48px; - } - } - } -} - -[data-theme="light"] .sponsoredBadge { - display: inline-block; - width: max-content; - font-size: 0.75rem; +div.sponsoredBadge { + display: block; + font-size: 0.6rem !important; + line-height: 1rem; border-radius: 2rem; padding-inline: 0.5rem; padding-block: 0.25rem; - background-color: #e1e1e1; - color: #696969; + background-color: rgb(229 231 235 / 0.5) !important; + color: #a1a1a1; } -[data-theme="dark"] .sponsoredBadge { - display: inline-block; - width: max-content; - font-size: 0.6rem; - border-radius: 2rem; - padding-inline: 0.5rem; - padding-block: 0.25rem; - background-color: #242526; +html[data-theme="dark"] .sponsoredBadge { + background-color: #242526 !important; color: #696969; } diff --git a/docs/src/pages/index.module.css b/docs/src/pages/index.module.css index 4ef0116c95..c5e51d4702 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -145,13 +145,14 @@ .sponsoredBadge { font-size: 0.6rem; + line-height: 1rem; border-radius: 2rem; padding-inline: 0.5rem; padding-block: 0.25rem; - background-color: #e1e1e1; + background-color: rgb(229 231 235 / 0.5) !important; color: #696969; } [data-theme="dark"] .sponsoredBadge { - background-color: #242526; + background-color: #242526 !important; } From 6cd0fe8b75e35d5d822ea08d72d12f0f7e035cf0 Mon Sep 17 00:00:00 2001 From: Nico Domino Date: Fri, 8 Mar 2024 17:35:02 +0100 Subject: [PATCH 10/13] chore(docs): update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54ffdccca9..00cf803dab 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ See authjs.dev for our documentation and more information.

- (sponsored) Don't want to manage auth yourself? Check out Clerk β†’ + Sponsored Don't want to manage auth yourself? Check out Clerk β†’

From 9a5416bdf226099c457badd3d7d7d9f922c9b1a7 Mon Sep 17 00:00:00 2001 From: Thang Vu Date: Mon, 11 Mar 2024 21:23:46 +0700 Subject: [PATCH 11/13] test(core): fix failed tests for webauthn (#10281) --- packages/core/src/lib/utils/webauthn-utils.ts | 8 +- packages/core/test/webauthn-utils.test.ts | 840 ++++++++++++------ 2 files changed, 551 insertions(+), 297 deletions(-) diff --git a/packages/core/src/lib/utils/webauthn-utils.ts b/packages/core/src/lib/utils/webauthn-utils.ts index 0c6eeb073b..01ae7f1931 100644 --- a/packages/core/src/lib/utils/webauthn-utils.ts +++ b/packages/core/src/lib/utils/webauthn-utils.ts @@ -218,7 +218,7 @@ export async function verifyAuthenticate( !("id" in data) || typeof data.id !== "string" ) { - throw new AuthError("Invalid WebAuthn Authentication response.") + throw new AuthError("Invalid WebAuthn Authentication response") } // Reset the ID so we smooth out implementation differences @@ -335,7 +335,7 @@ export async function verifyRegister( !("id" in data) || typeof data.id !== "string" ) { - throw new AuthError("Invalid WebAuthn Registration response.") + throw new AuthError("Invalid WebAuthn Registration response") } // Get challenge from request cookies @@ -343,7 +343,7 @@ export async function verifyRegister( await webauthnChallenge.use(options, request.cookies, resCookies) if (!user) { throw new AuthError( - "Missing user registration data in WebAuthn challenge cookie." + "Missing user registration data in WebAuthn challenge cookie" ) } @@ -365,7 +365,7 @@ export async function verifyRegister( // Make sure the response was verified if (!verification.verified || !verification.registrationInfo) { throw new WebAuthnVerificationError( - "WebAuthn registration response could not be verified." + "WebAuthn registration response could not be verified" ) } diff --git a/packages/core/test/webauthn-utils.test.ts b/packages/core/test/webauthn-utils.test.ts index f0d464fa6e..81c7c15c22 100644 --- a/packages/core/test/webauthn-utils.test.ts +++ b/packages/core/test/webauthn-utils.test.ts @@ -7,8 +7,17 @@ import { verifyAuthenticationResponse, verifyRegistrationResponse, } from "@simplewebauthn/server" -import type { Adapter, AdapterAccount, AdapterUser, AdapterAuthenticator } from "../src/adapters" -import WebAuthn, { GetUserInfo, WebAuthnConfig, WebAuthnProviderType } from "../src/providers/webauthn" +import type { + Adapter, + AdapterAccount, + AdapterUser, + AdapterAuthenticator, +} from "../src/adapters" +import WebAuthn, { + GetUserInfo, + WebAuthnConfig, + WebAuthnProviderType, +} from "../src/providers/webauthn" import { WebAuthnAction, assertInternalOptionsWebAuthn, @@ -21,23 +30,33 @@ import { toBase64, stringToTransports, transportsToString, - } from "../src/lib/utils/webauthn-utils" import { webauthnChallenge } from "../src/lib/actions/callback/oauth/checks" -import { InternalOptions, InternalProvider, RequestInternal } from "../src/types" -import { AdapterError, AuthError, InvalidProvider, MissingAdapter, WebAuthnVerificationError } from "../src/errors" +import { + InternalOptions, + InternalProvider, + RequestInternal, +} from "../src/types" +import { + AdapterError, + AuthError, + InvalidProvider, + MissingAdapter, + WebAuthnVerificationError, +} from "../src/errors" import { randomString } from "../src/lib/utils/web" import { PublicKeyCredentialCreationOptionsJSON } from "@simplewebauthn/server/script/deps" import { Cookie } from "../src/lib/utils/cookie" import { randomInt } from "crypto" -const getMockAdapter = () => ({ - getAuthenticator: vi.fn(), - updateAuthenticatorCounter: vi.fn(), - getAccount: vi.fn(), - listAuthenticatorsByUserId: vi.fn(), - getUser: vi.fn(), -}) as unknown as Required +const getMockAdapter = () => + ({ + getAuthenticator: vi.fn(), + updateAuthenticatorCounter: vi.fn(), + getAccount: vi.fn(), + listAuthenticatorsByUserId: vi.fn(), + getUser: vi.fn(), + }) as unknown as Required function getMockOptions( defaultOptions?: Partial, @@ -66,7 +85,9 @@ function getMockOptions( } as InternalOptions & { adapter: Required } } -function createAuthenticator(partial?: Partial): AdapterAuthenticator { +function createAuthenticator( + partial?: Partial +): AdapterAuthenticator { const id = randomString(32) return { userId: randomString(32), @@ -87,7 +108,9 @@ function getExpectedResponse( cookies: Cookie[] = [] ) { const cookie = { - name: "test", value: "test", options: {} + name: "test", + value: "test", + options: {}, } vi.mocked(webauthnChallenge.create).mockResolvedValue({ cookie }) return { @@ -99,25 +122,37 @@ function getExpectedResponse( }, headers: { "Content-Type": "application/json", - } + }, } } /** * Generates default params for verifyAuthenticate and verifyRegister tests */ -function prepareVerifyTest(action: WebAuthnAction, requestData?: Record) { +function prepareVerifyTest( + action: WebAuthnAction, + requestData?: Record +) { const options = getMockOptions() const credentialID = toBase64(new Uint8Array([1, 2, 3, 4, 5])) - requestData ??= { key: "value", id: credentialID, response: { transports: ["ble", "nfc"] } } - const request = { body: { data: JSON.stringify(requestData) }, cookies: "reqcookies" } as unknown as RequestInternal + requestData ??= { + key: "value", + id: credentialID, + response: { transports: ["ble", "nfc"] }, + } + const request = { + body: { data: JSON.stringify(requestData) }, + cookies: "reqcookies", + } as unknown as RequestInternal const cookies = [{ name: "other", value: "value", options: {} }] const authenticator = createAuthenticator({ credentialID, providerAccountId: credentialID, // @ts-expect-error - transports: requestData.response?.transports ? transportsToString(requestData.response?.transports) : "usb,ble,nfc", + transports: requestData.response?.transports + ? transportsToString(requestData.response?.transports) + : "usb,ble,nfc", }) vi.mocked(options.adapter.getAuthenticator).mockResolvedValue(authenticator) @@ -143,7 +178,7 @@ function prepareVerifyTest(action: WebAuthnAction, requestData?: Record ({ webauthnChallenge: { create: vi.fn(), use: vi.fn(), - } + }, })) const defaultWebAuthnConfig = WebAuthn({}) @@ -228,7 +266,9 @@ describe("assertInternalOptionsWebAuthn", () => { it("errors on non-webauthn provider", () => { const options = getMockOptions() options.provider.type = "email" as unknown as WebAuthnProviderType - expect(() => assertInternalOptionsWebAuthn(options)).toThrow(InvalidProvider) + expect(() => assertInternalOptionsWebAuthn(options)).toThrow( + InvalidProvider + ) }) }) @@ -285,7 +325,10 @@ describe("transportsToString", () => { describe("getRelayingParty", () => { it("returns relaying party with default values", () => { const options = getMockOptions() - const relayingParty = options.provider.getRelayingParty(options, {} as RequestInternal) + const relayingParty = options.provider.getRelayingParty( + options, + {} as RequestInternal + ) expect(relayingParty).toEqual({ id: options.url.hostname, @@ -295,14 +338,20 @@ describe("getRelayingParty", () => { }) it("returns relaying party with custom values", () => { - const options = getMockOptions({}, { - relayingParty: { - id: "my-id", - name: "My Relaying Party", - origin: "https://custom.com", + const options = getMockOptions( + {}, + { + relayingParty: { + id: "my-id", + name: "My Relaying Party", + origin: "https://custom.com", + }, } - }) - const relayingParty = options.provider.getRelayingParty(options, {} as RequestInternal) + ) + const relayingParty = options.provider.getRelayingParty( + options, + {} as RequestInternal + ) expect(relayingParty).toEqual({ id: "my-id", @@ -312,13 +361,19 @@ describe("getRelayingParty", () => { }) it("returns relaying party with mixed values", () => { - const options = getMockOptions({}, { - relayingParty: { - id: "my-id", - origin: "https://custom.com", + const options = getMockOptions( + {}, + { + relayingParty: { + id: "my-id", + origin: "https://custom.com", + }, } - }) - const relayingParty = options.provider.getRelayingParty(options, {} as RequestInternal) + ) + const relayingParty = options.provider.getRelayingParty( + options, + {} as RequestInternal + ) expect(relayingParty).toEqual({ id: "my-id", @@ -328,14 +383,20 @@ describe("getRelayingParty", () => { }) it("uses the first value if array by default", () => { - const options = getMockOptions({}, { - relayingParty: { - id: ["other-id", "my-id"], - name: ["Other Relaying Party", "My Relaying Party"], - origin: ["https://other.com", "https://custom.com"], + const options = getMockOptions( + {}, + { + relayingParty: { + id: ["other-id", "my-id"], + name: ["Other Relaying Party", "My Relaying Party"], + origin: ["https://other.com", "https://custom.com"], + }, } - }) - const relayingParty = options.provider.getRelayingParty(options, {} as RequestInternal) + ) + const relayingParty = options.provider.getRelayingParty( + options, + {} as RequestInternal + ) expect(relayingParty).toEqual({ id: "other-id", @@ -345,20 +406,23 @@ describe("getRelayingParty", () => { }) it("accepts custom getRelayingParty function", () => { - const options = getMockOptions({}, { - relayingParty: { - id: "my-id", - origin: "https://custom.com", - }, - getRelayingParty: (opts, req) => { - const id = opts.provider.relayingParty!.id as string - return { - id, - name: req.url.host, - origin: req.url.origin, - } + const options = getMockOptions( + {}, + { + relayingParty: { + id: "my-id", + origin: "https://custom.com", + }, + getRelayingParty: (opts, req) => { + const id = opts.provider.relayingParty!.id as string + return { + id, + name: req.url.host, + origin: req.url.origin, + } + }, } - }) + ) const relayingParty = options.provider.getRelayingParty(options, { url: new URL("https://myapp.com"), } as RequestInternal) @@ -378,94 +442,100 @@ describe("inferWebAuthnOptions", () => { userInfo: Awaited> expected: WebAuthnAction | null }[] = [ - { - action: "authenticate", - loggedIn: true, - userInfo: { user: {}, exists: true }, - expected: "authenticate", - }, - { - action: "authenticate", - loggedIn: false, - userInfo: { user: {}, exists: true }, - expected: "authenticate", - }, - { - action: "authenticate", - loggedIn: false, - userInfo: null, - expected: "authenticate", - }, - { - action: "register", - loggedIn: false, - userInfo: { user: {}, exists: false }, - expected: "register", - }, - { - action: "register", - loggedIn: true, - userInfo: { user: {}, exists: true }, - expected: "register", - }, - { - action: "register", - loggedIn: false, - userInfo: null, - expected: null, - }, - { - action: "register", - loggedIn: false, - userInfo: { user: {}, exists: true }, - expected: null, - }, - { - action: undefined, - loggedIn: false, - userInfo: { user: {}, exists: true }, - expected: "authenticate", - }, - { - action: undefined, - loggedIn: false, - userInfo: { user: {}, exists: false }, - expected: "register", - }, - { - action: undefined, - loggedIn: false, - userInfo: null, - expected: "authenticate", - }, - { - action: undefined, - loggedIn: true, - userInfo: { user: {}, exists: true }, - expected: null, - }, - { - action: undefined, - loggedIn: true, - userInfo: null, - expected: null, - }, - ] + { + action: "authenticate", + loggedIn: true, + userInfo: { user: {}, exists: true }, + expected: "authenticate", + }, + { + action: "authenticate", + loggedIn: false, + userInfo: { user: {}, exists: true }, + expected: "authenticate", + }, + { + action: "authenticate", + loggedIn: false, + userInfo: null, + expected: "authenticate", + }, + { + action: "register", + loggedIn: false, + userInfo: { user: {}, exists: false }, + expected: "register", + }, + { + action: "register", + loggedIn: true, + userInfo: { user: {}, exists: true }, + expected: "register", + }, + { + action: "register", + loggedIn: false, + userInfo: null, + expected: null, + }, + { + action: "register", + loggedIn: false, + userInfo: { user: {}, exists: true }, + expected: null, + }, + { + action: undefined, + loggedIn: false, + userInfo: { user: {}, exists: true }, + expected: "authenticate", + }, + { + action: undefined, + loggedIn: false, + userInfo: { user: {}, exists: false }, + expected: "register", + }, + { + action: undefined, + loggedIn: false, + userInfo: null, + expected: "authenticate", + }, + { + action: undefined, + loggedIn: true, + userInfo: { user: {}, exists: true }, + expected: null, + }, + { + action: undefined, + loggedIn: true, + userInfo: null, + expected: null, + }, + ] - test.each(cases)("(%#) ($action, $userInfo, loggedIn: $loggedIn) = $expected", ({ action, userInfo, expected, loggedIn }) => { - expect(inferWebAuthnOptions(action, loggedIn, userInfo)).toEqual(expected) - }) + test.each(cases)( + "(%#) ($action, $userInfo, loggedIn: $loggedIn) = $expected", + ({ action, userInfo, expected, loggedIn }) => { + expect(inferWebAuthnOptions(action, loggedIn, userInfo)).toEqual(expected) + } + ) }) - describe("getRegistrationResponse", () => { it("generates registration response", async () => { const options = getMockOptions() const user = { id: "123", email: "test@example.com", name: "Test User" } const authenticators = [createAuthenticator(), createAuthenticator()] - const returnedOptions = { challenge: "mychallenge" } as unknown as PublicKeyCredentialCreationOptionsJSON + const returnedOptions = { + challenge: "mychallenge", + } as unknown as PublicKeyCredentialCreationOptionsJSON - vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue(authenticators) + vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue( + authenticators + ) vi.mocked(generateRegistrationOptions).mockResolvedValue(returnedOptions) const rp = options.provider.getRelayingParty(options, {} as RequestInternal) @@ -476,40 +546,66 @@ describe("getRegistrationResponse", () => { userID: expect.any(String), userName: user.email, userDisplayName: user.name, - excludeCredentials: authenticators.map(a => ({ + excludeCredentials: authenticators.map((a) => ({ id: fromBase64(a.credentialID), type: "public-key", transports: stringToTransports(a.transports), })), } const cookies = [{ name: "other", value: "value", options: {} }] - const expectedResponse = getExpectedResponse("register", returnedOptions, cookies) - - expect(await getRegistrationResponse(options, {} as RequestInternal, user, cookies)).toEqual(expectedResponse) - - expect(webauthnChallenge.create).toHaveBeenCalledWith(options, "mychallenge", user) - expect(generateRegistrationOptions).toHaveBeenCalledWith(expectedOptionsParams) - expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith("123") + const expectedResponse = getExpectedResponse( + "register", + returnedOptions, + cookies + ) + + expect( + await getRegistrationResponse( + options, + {} as RequestInternal, + user, + cookies + ) + ).toEqual(expectedResponse) + + expect(webauthnChallenge.create).toHaveBeenCalledWith( + options, + "mychallenge", + user + ) + expect(generateRegistrationOptions).toHaveBeenCalledWith( + expectedOptionsParams + ) + expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith( + "123" + ) }) it("uses provider override options", async () => { - const options = getMockOptions({}, { - registrationOptions: { - // @ts-expect-error - userID: "test", - attestationType: "none", - timeout: 1000, - authenticatorSelection: { - requireResidentKey: true, + const options = getMockOptions( + {}, + { + registrationOptions: { + // @ts-expect-error + userID: "test", + attestationType: "none", + timeout: 1000, + authenticatorSelection: { + requireResidentKey: true, + }, + supportedAlgorithmIDs: [1, 2, 3], }, - supportedAlgorithmIDs: [1, 2, 3], } - }) + ) const user = { id: "123", email: "test@example.com", name: "Test User" } const authenticators = [createAuthenticator(), createAuthenticator()] - const returnedOptions = { challenge: "mychallenge" } as unknown as PublicKeyCredentialCreationOptionsJSON + const returnedOptions = { + challenge: "mychallenge", + } as unknown as PublicKeyCredentialCreationOptionsJSON - vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue(authenticators) + vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue( + authenticators + ) vi.mocked(generateRegistrationOptions).mockResolvedValue(returnedOptions) const rp = options.provider.getRelayingParty(options, {} as RequestInternal) @@ -520,7 +616,7 @@ describe("getRegistrationResponse", () => { userID: expect.any(String), userName: user.email, userDisplayName: user.name, - excludeCredentials: authenticators.map(a => ({ + excludeCredentials: authenticators.map((a) => ({ id: fromBase64(a.credentialID), type: "public-key", transports: stringToTransports(a.transports), @@ -534,17 +630,29 @@ describe("getRegistrationResponse", () => { } const expectedResponse = getExpectedResponse("register", returnedOptions) - expect(await getRegistrationResponse(options, {} as RequestInternal, user)).toEqual(expectedResponse) + expect( + await getRegistrationResponse(options, {} as RequestInternal, user) + ).toEqual(expectedResponse) - expect(webauthnChallenge.create).toHaveBeenCalledWith(options, "mychallenge", user) - expect(generateRegistrationOptions).toHaveBeenCalledWith(expectedOptionsParams) - expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith("123") + expect(webauthnChallenge.create).toHaveBeenCalledWith( + options, + "mychallenge", + user + ) + expect(generateRegistrationOptions).toHaveBeenCalledWith( + expectedOptionsParams + ) + expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith( + "123" + ) }) it("doesn't get authenticators for new users", async () => { const options = getMockOptions() const user = { email: "test@example.com", name: "Test User" } - const returnedOptions = { challenge: "mychallenge" } as unknown as PublicKeyCredentialCreationOptionsJSON + const returnedOptions = { + challenge: "mychallenge", + } as unknown as PublicKeyCredentialCreationOptionsJSON vi.mocked(generateRegistrationOptions).mockResolvedValue(returnedOptions) @@ -560,17 +668,27 @@ describe("getRegistrationResponse", () => { } const expectedResponse = getExpectedResponse("register", returnedOptions) - expect(await getRegistrationResponse(options, {} as RequestInternal, user)).toEqual(expectedResponse) + expect( + await getRegistrationResponse(options, {} as RequestInternal, user) + ).toEqual(expectedResponse) - expect(webauthnChallenge.create).toHaveBeenCalledWith(options, "mychallenge", user) - expect(generateRegistrationOptions).toHaveBeenCalledWith(expectedOptionsParams) + expect(webauthnChallenge.create).toHaveBeenCalledWith( + options, + "mychallenge", + user + ) + expect(generateRegistrationOptions).toHaveBeenCalledWith( + expectedOptionsParams + ) expect(options.adapter.listAuthenticatorsByUserId).not.toHaveBeenCalled() }) it("allows missing userName", async () => { const options = getMockOptions() const user = { email: "test@example.com" } - const returnedOptions = { challenge: "mychallenge" } as unknown as PublicKeyCredentialCreationOptionsJSON + const returnedOptions = { + challenge: "mychallenge", + } as unknown as PublicKeyCredentialCreationOptionsJSON vi.mocked(generateRegistrationOptions).mockResolvedValue(returnedOptions) @@ -586,67 +704,103 @@ describe("getRegistrationResponse", () => { } const expectedResponse = getExpectedResponse("register", returnedOptions) - expect(await getRegistrationResponse(options, {} as RequestInternal, user)).toEqual(expectedResponse) + expect( + await getRegistrationResponse(options, {} as RequestInternal, user) + ).toEqual(expectedResponse) - expect(webauthnChallenge.create).toHaveBeenCalledWith(options, "mychallenge", user) - expect(generateRegistrationOptions).toHaveBeenCalledWith(expectedOptionsParams) + expect(webauthnChallenge.create).toHaveBeenCalledWith( + options, + "mychallenge", + user + ) + expect(generateRegistrationOptions).toHaveBeenCalledWith( + expectedOptionsParams + ) expect(options.adapter.listAuthenticatorsByUserId).not.toHaveBeenCalled() }) }) - describe("getAuthenticationResponse", () => { it("generates authentication response", async () => { const options = getMockOptions() const user = { id: "123", email: "test@example.com", name: "Test User" } const authenticators = [createAuthenticator(), createAuthenticator()] - const returnedOptions = { challenge: "mychallenge" } as unknown as PublicKeyCredentialCreationOptionsJSON + const returnedOptions = { + challenge: "mychallenge", + } as unknown as PublicKeyCredentialCreationOptionsJSON - vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue(authenticators) + vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue( + authenticators + ) vi.mocked(generateAuthenticationOptions).mockResolvedValue(returnedOptions) const rp = options.provider.getRelayingParty(options, {} as RequestInternal) const expectedOptionsParams: GenerateAuthenticationOptionsOpts = { ...defaultWebAuthnConfig.authenticationOptions, rpID: rp.id, - allowCredentials: authenticators.map(a => ({ + allowCredentials: authenticators.map((a) => ({ id: fromBase64(a.credentialID), type: "public-key", transports: stringToTransports(a.transports), })), } const cookies = [{ name: "other", value: "value", options: {} }] - const expectedResponse = getExpectedResponse("authenticate", returnedOptions, cookies) - - expect(await getAuthenticationResponse(options, {} as RequestInternal, user, cookies)).toEqual(expectedResponse) - - expect(webauthnChallenge.create).toHaveBeenCalledWith(options, "mychallenge") - expect(generateAuthenticationOptions).toHaveBeenCalledWith(expectedOptionsParams) - expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith("123") + const expectedResponse = getExpectedResponse( + "authenticate", + returnedOptions, + cookies + ) + + expect( + await getAuthenticationResponse( + options, + {} as RequestInternal, + user, + cookies + ) + ).toEqual(expectedResponse) + + expect(webauthnChallenge.create).toHaveBeenCalledWith( + options, + "mychallenge" + ) + expect(generateAuthenticationOptions).toHaveBeenCalledWith( + expectedOptionsParams + ) + expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith( + "123" + ) }) it("uses provider override options", async () => { - const options = getMockOptions({}, { - authenticationOptions: { - extensions: { - appid: "test", + const options = getMockOptions( + {}, + { + authenticationOptions: { + extensions: { + appid: "test", + }, + timeout: 1000, + userVerification: "required", }, - timeout: 1000, - userVerification: "required", } - }) + ) const user = { id: "123", email: "test@example.com", name: "Test User" } const authenticators = [createAuthenticator(), createAuthenticator()] - const returnedOptions = { challenge: "mychallenge" } as unknown as PublicKeyCredentialCreationOptionsJSON + const returnedOptions = { + challenge: "mychallenge", + } as unknown as PublicKeyCredentialCreationOptionsJSON - vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue(authenticators) + vi.mocked(options.adapter.listAuthenticatorsByUserId).mockResolvedValue( + authenticators + ) vi.mocked(generateAuthenticationOptions).mockResolvedValue(returnedOptions) const rp = options.provider.getRelayingParty(options, {} as RequestInternal) const expectedOptionsParams: GenerateAuthenticationOptionsOpts = { ...defaultWebAuthnConfig.authenticationOptions, rpID: rp.id, - allowCredentials: authenticators.map(a => ({ + allowCredentials: authenticators.map((a) => ({ id: fromBase64(a.credentialID), type: "public-key", transports: stringToTransports(a.transports), @@ -658,19 +812,39 @@ describe("getAuthenticationResponse", () => { }, } const cookies = [{ name: "other", value: "value", options: {} }] - const expectedResponse = getExpectedResponse("authenticate", returnedOptions, cookies) - - expect(await getAuthenticationResponse(options, {} as RequestInternal, user, cookies)).toEqual(expectedResponse) - - expect(webauthnChallenge.create).toHaveBeenCalledWith(options, "mychallenge") - expect(generateAuthenticationOptions).toHaveBeenCalledWith(expectedOptionsParams) - expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith("123") + const expectedResponse = getExpectedResponse( + "authenticate", + returnedOptions, + cookies + ) + + expect( + await getAuthenticationResponse( + options, + {} as RequestInternal, + user, + cookies + ) + ).toEqual(expectedResponse) + + expect(webauthnChallenge.create).toHaveBeenCalledWith( + options, + "mychallenge" + ) + expect(generateAuthenticationOptions).toHaveBeenCalledWith( + expectedOptionsParams + ) + expect(options.adapter.listAuthenticatorsByUserId).toHaveBeenCalledWith( + "123" + ) }) it("accepts undefined user", async () => { const options = getMockOptions() const user = undefined - const returnedOptions = { challenge: "mychallenge" } as unknown as PublicKeyCredentialCreationOptionsJSON + const returnedOptions = { + challenge: "mychallenge", + } as unknown as PublicKeyCredentialCreationOptionsJSON vi.mocked(generateAuthenticationOptions).mockResolvedValue(returnedOptions) @@ -681,12 +855,28 @@ describe("getAuthenticationResponse", () => { allowCredentials: undefined, } const cookies = [{ name: "other", value: "value", options: {} }] - const expectedResponse = getExpectedResponse("authenticate", returnedOptions, cookies) - - expect(await getAuthenticationResponse(options, {} as RequestInternal, user, cookies)).toEqual(expectedResponse) - - expect(webauthnChallenge.create).toHaveBeenCalledWith(options, "mychallenge") - expect(generateAuthenticationOptions).toHaveBeenCalledWith(expectedOptionsParams) + const expectedResponse = getExpectedResponse( + "authenticate", + returnedOptions, + cookies + ) + + expect( + await getAuthenticationResponse( + options, + {} as RequestInternal, + user, + cookies + ) + ).toEqual(expectedResponse) + + expect(webauthnChallenge.create).toHaveBeenCalledWith( + options, + "mychallenge" + ) + expect(generateAuthenticationOptions).toHaveBeenCalledWith( + expectedOptionsParams + ) expect(options.adapter.listAuthenticatorsByUserId).not.toHaveBeenCalled() }) }) @@ -701,7 +891,7 @@ describe("verifyAuthenticate", () => { cookies, credentialID, newCounter, - expectedAuthenticationResponse + expectedAuthenticationResponse, } = prepareVerifyTest("authenticate") expect(await verifyAuthenticate(options, request, cookies)).toEqual({ @@ -709,12 +899,23 @@ describe("verifyAuthenticate", () => { user, }) - expect(options.adapter.getAuthenticator).toHaveBeenCalledWith(credentialID) - expect(webauthnChallenge.use).toHaveBeenCalledWith(options, "reqcookies", cookies) - expect(verifyAuthenticationResponse).toHaveBeenCalledWith(expectedAuthenticationResponse) - expect(options.adapter.updateAuthenticatorCounter).toHaveBeenCalledWith(credentialID, newCounter) - expect(options.adapter.getAccount).toHaveBeenCalledWith(credentialID, "webauthn") + expect(webauthnChallenge.use).toHaveBeenCalledWith( + options, + "reqcookies", + cookies + ) + expect(verifyAuthenticationResponse).toHaveBeenCalledWith( + expectedAuthenticationResponse + ) + expect(options.adapter.updateAuthenticatorCounter).toHaveBeenCalledWith( + credentialID, + newCounter + ) + expect(options.adapter.getAccount).toHaveBeenCalledWith( + credentialID, + "webauthn" + ) expect(options.adapter.getUser).toHaveBeenCalledWith(user.id) }) @@ -725,7 +926,7 @@ describe("verifyAuthenticate", () => { options, request, cookies, - expectedAuthenticationResponse + expectedAuthenticationResponse, } = prepareVerifyTest("authenticate") options.provider.verifyAuthenticationOptions = { ...options.provider.verifyAuthenticationOptions, @@ -746,29 +947,31 @@ describe("verifyAuthenticate", () => { }) it("errors on invalid request body", async () => { - const { - options, - request, - cookies, - } = prepareVerifyTest("authenticate", { "key": "value" }) + const { options, request, cookies } = prepareVerifyTest("authenticate", { + key: "value", + }) - await expect(() => verifyAuthenticate(options, request, cookies)).rejects.toThrowErrorMatchingInlineSnapshot(`[AuthError: Invalid WebAuthn Authentication response. .Read more at https://errors.authjs.dev#autherror]`) + await expect(() => + verifyAuthenticate(options, request, cookies) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[AuthError: Invalid WebAuthn Authentication response. Read more at https://errors.authjs.dev#autherror]` + ) expect(webauthnChallenge.use).not.toHaveBeenCalled() expect(options.adapter.updateAuthenticatorCounter).not.toHaveBeenCalled() }) it("errors on invalid authenticator", async () => { - const { - options, - request, - cookies, - credentialID, - } = prepareVerifyTest("authenticate") + const { options, request, cookies, credentialID } = + prepareVerifyTest("authenticate") vi.mocked(options.adapter.getAuthenticator).mockResolvedValue(null) - await expect(() => verifyAuthenticate(options, request, cookies)).rejects.toThrowErrorMatchingInlineSnapshot(`[AuthError: WebAuthn authenticator not found in database: {"credentialID":"AQIDBAU="} .Read more at https://errors.authjs.dev#autherror]`) + await expect(() => + verifyAuthenticate(options, request, cookies) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[AuthError: WebAuthn authenticator not found in database: {"credentialID":"AQIDBAU="}. Read more at https://errors.authjs.dev#autherror]` + ) expect(options.adapter.getAuthenticator).toHaveBeenCalledWith(credentialID) expect(webauthnChallenge.use).not.toHaveBeenCalled() @@ -776,80 +979,87 @@ describe("verifyAuthenticate", () => { }) it("errors on failed response verification", async () => { - const { - options, - request, - cookies, - expectedAuthenticationResponse - } = prepareVerifyTest("authenticate") + const { options, request, cookies, expectedAuthenticationResponse } = + prepareVerifyTest("authenticate") - vi.mocked(verifyAuthenticationResponse).mockRejectedValue(new Error("mytesterror")) + vi.mocked(verifyAuthenticationResponse).mockRejectedValue( + new Error("mytesterror") + ) - await expect(() => verifyAuthenticate(options, request, cookies)).rejects.toThrow(WebAuthnVerificationError) + await expect(() => + verifyAuthenticate(options, request, cookies) + ).rejects.toThrow(WebAuthnVerificationError) - expect(verifyAuthenticationResponse).toHaveBeenCalledWith(expectedAuthenticationResponse) + expect(verifyAuthenticationResponse).toHaveBeenCalledWith( + expectedAuthenticationResponse + ) expect(options.adapter.updateAuthenticatorCounter).not.toHaveBeenCalled() }) it("errors on failed verification verified", async () => { - const { - options, - request, - cookies, - expectedAuthenticationResponse - } = prepareVerifyTest("authenticate") + const { options, request, cookies, expectedAuthenticationResponse } = + prepareVerifyTest("authenticate") // @ts-expect-error - vi.mocked(verifyAuthenticationResponse).mockResolvedValue({ verified: false }) + vi.mocked(verifyAuthenticationResponse).mockResolvedValue({ + verified: false, + }) - await expect(() => verifyAuthenticate(options, request, cookies)).rejects.toThrow(WebAuthnVerificationError) + await expect(() => + verifyAuthenticate(options, request, cookies) + ).rejects.toThrow(WebAuthnVerificationError) - expect(verifyAuthenticationResponse).toHaveBeenCalledWith(expectedAuthenticationResponse) + expect(verifyAuthenticationResponse).toHaveBeenCalledWith( + expectedAuthenticationResponse + ) expect(options.adapter.updateAuthenticatorCounter).not.toHaveBeenCalled() }) it("errors if authenticator update fails", async () => { - const { - options, - request, - cookies, - credentialID, - newCounter - } = prepareVerifyTest("authenticate") + const { options, request, cookies, credentialID, newCounter } = + prepareVerifyTest("authenticate") - vi.mocked(options.adapter.updateAuthenticatorCounter).mockRejectedValue(new Error("mytesterror")) + vi.mocked(options.adapter.updateAuthenticatorCounter).mockRejectedValue( + new Error("mytesterror") + ) - await expect(() => verifyAuthenticate(options, request, cookies)).rejects.toThrowError(AdapterError) + await expect(() => + verifyAuthenticate(options, request, cookies) + ).rejects.toThrowError(AdapterError) - expect(options.adapter.updateAuthenticatorCounter).toHaveBeenCalledWith(credentialID, newCounter) + expect(options.adapter.updateAuthenticatorCounter).toHaveBeenCalledWith( + credentialID, + newCounter + ) }) it("errors if account does not exist", async () => { - const { - options, - request, - cookies, - credentialID, - } = prepareVerifyTest("authenticate") + const { options, request, cookies, credentialID } = + prepareVerifyTest("authenticate") vi.mocked(options.adapter.getAccount).mockResolvedValue(null) - await expect(() => verifyAuthenticate(options, request, cookies)).rejects.toThrowErrorMatchingInlineSnapshot(`[AuthError: WebAuthn account not found in database: {"credentialID":"AQIDBAU=","providerAccountId":"AQIDBAU="} .Read more at https://errors.authjs.dev#autherror]`) + await expect(() => + verifyAuthenticate(options, request, cookies) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[AuthError: WebAuthn account not found in database: {"credentialID":"AQIDBAU=","providerAccountId":"AQIDBAU="}. Read more at https://errors.authjs.dev#autherror]` + ) - expect(options.adapter.getAccount).toHaveBeenCalledWith(credentialID, "webauthn") + expect(options.adapter.getAccount).toHaveBeenCalledWith( + credentialID, + "webauthn" + ) }) it("errors if user does not exist", async () => { - const { - options, - request, - cookies, - user, - } = prepareVerifyTest("authenticate") + const { options, request, cookies, user } = + prepareVerifyTest("authenticate") vi.mocked(options.adapter.getUser).mockResolvedValue(null) - await expect(() => verifyAuthenticate(options, request, cookies)).rejects.toThrow(AuthError) + await expect(() => + verifyAuthenticate(options, request, cookies) + ).rejects.toThrow(AuthError) expect(options.adapter.getUser).toHaveBeenCalledWith(user.id) }) @@ -864,9 +1074,12 @@ describe("verifyRegister", () => { request, cookies, authenticator: { userId: auid, ...authenticator }, - expectedRegistrationResponse + expectedRegistrationResponse, } = prepareVerifyTest("register") - vi.mocked(webauthnChallenge.use).mockResolvedValue({ challenge: "mychallenge", registerData: user }) + vi.mocked(webauthnChallenge.use).mockResolvedValue({ + challenge: "mychallenge", + registerData: user, + }) expect(await verifyRegister(options, request, cookies)).toEqual({ account, @@ -874,8 +1087,14 @@ describe("verifyRegister", () => { authenticator, }) - expect(webauthnChallenge.use).toHaveBeenCalledWith(options, request.cookies, cookies) - expect(verifyRegistrationResponse).toHaveBeenCalledWith(expectedRegistrationResponse) + expect(webauthnChallenge.use).toHaveBeenCalledWith( + options, + request.cookies, + cookies + ) + expect(verifyRegistrationResponse).toHaveBeenCalledWith( + expectedRegistrationResponse + ) }) it("provider overrides verification options", async () => { @@ -886,9 +1105,12 @@ describe("verifyRegister", () => { request, cookies, authenticator: { userId: auid, ...authenticator }, - expectedRegistrationResponse + expectedRegistrationResponse, } = prepareVerifyTest("register") - vi.mocked(webauthnChallenge.use).mockResolvedValue({ challenge: "mychallenge", registerData: user }) + vi.mocked(webauthnChallenge.use).mockResolvedValue({ + challenge: "mychallenge", + registerData: user, + }) options.provider.verifyRegistrationOptions = { ...options.provider.verifyRegistrationOptions, expectedType: "public-key", @@ -916,24 +1138,32 @@ describe("verifyRegister", () => { options, request, cookies, - } = prepareVerifyTest("register", { "key": "value" }) + } = prepareVerifyTest("register", { key: "value" }) - await expect(() => verifyRegister(options, request, cookies)).rejects.toThrowErrorMatchingInlineSnapshot(`[AuthError: Invalid WebAuthn Registration response. .Read more at https://errors.authjs.dev#autherror]`) + await expect(() => + verifyRegister(options, request, cookies) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[AuthError: Invalid WebAuthn Registration response. Read more at https://errors.authjs.dev#autherror]` + ) expect(webauthnChallenge.use).not.toHaveBeenCalled() expect(verifyRegistrationResponse).not.toHaveBeenCalled() }) it("errors on missing registration data in challenge cookie", async () => { - const { - options, - request, - cookies, - } = prepareVerifyTest("register") + const { options, request, cookies } = prepareVerifyTest("register") - await expect(() => verifyRegister(options, request, cookies)).rejects.toThrowErrorMatchingInlineSnapshot(`[AuthError: Missing user registration data in WebAuthn challenge cookie. .Read more at https://errors.authjs.dev#autherror]`) + await expect(() => + verifyRegister(options, request, cookies) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[AuthError: Missing user registration data in WebAuthn challenge cookie. Read more at https://errors.authjs.dev#autherror]` + ) - expect(webauthnChallenge.use).toHaveBeenCalledWith(options, request.cookies, cookies) + expect(webauthnChallenge.use).toHaveBeenCalledWith( + options, + request.cookies, + cookies + ) expect(verifyRegistrationResponse).not.toHaveBeenCalled() }) @@ -945,15 +1175,28 @@ describe("verifyRegister", () => { request, cookies, authenticator: { userId: auid, ...authenticator }, - expectedRegistrationResponse + expectedRegistrationResponse, } = prepareVerifyTest("register") - vi.mocked(webauthnChallenge.use).mockResolvedValue({ challenge: "mychallenge", registerData: user }) - vi.mocked(verifyRegistrationResponse).mockRejectedValue(new Error("mytesterror")) + vi.mocked(webauthnChallenge.use).mockResolvedValue({ + challenge: "mychallenge", + registerData: user, + }) + vi.mocked(verifyRegistrationResponse).mockRejectedValue( + new Error("mytesterror") + ) - await expect(() => verifyRegister(options, request, cookies)).rejects.toThrow(WebAuthnVerificationError) + await expect(() => + verifyRegister(options, request, cookies) + ).rejects.toThrow(WebAuthnVerificationError) - expect(webauthnChallenge.use).toHaveBeenCalledWith(options, request.cookies, cookies) - expect(verifyRegistrationResponse).toHaveBeenCalledWith(expectedRegistrationResponse) + expect(webauthnChallenge.use).toHaveBeenCalledWith( + options, + request.cookies, + cookies + ) + expect(verifyRegistrationResponse).toHaveBeenCalledWith( + expectedRegistrationResponse + ) }) it("errors on failed verification verified", async () => { @@ -964,14 +1207,25 @@ describe("verifyRegister", () => { request, cookies, authenticator: { userId: auid, ...authenticator }, - expectedRegistrationResponse + expectedRegistrationResponse, } = prepareVerifyTest("register") - vi.mocked(webauthnChallenge.use).mockResolvedValue({ challenge: "mychallenge", registerData: user }) + vi.mocked(webauthnChallenge.use).mockResolvedValue({ + challenge: "mychallenge", + registerData: user, + }) vi.mocked(verifyRegistrationResponse).mockResolvedValue({ verified: false }) - await expect(() => verifyRegister(options, request, cookies)).rejects.toThrow(WebAuthnVerificationError) + await expect(() => + verifyRegister(options, request, cookies) + ).rejects.toThrow(WebAuthnVerificationError) - expect(webauthnChallenge.use).toHaveBeenCalledWith(options, request.cookies, cookies) - expect(verifyRegistrationResponse).toHaveBeenCalledWith(expectedRegistrationResponse) + expect(webauthnChallenge.use).toHaveBeenCalledWith( + options, + request.cookies, + cookies + ) + expect(verifyRegistrationResponse).toHaveBeenCalledWith( + expectedRegistrationResponse + ) }) }) From bd57d2255f580432fad841b428b6264ca3f55ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Salih=20Bozk=C4=B1r?= <150898451+MehmetBozkir@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:55:03 +0300 Subject: [PATCH 12/13] chore(docs): fix oauth-tutorial link (#10285) --- docs/docs/getting-started/providers/oauth-tutorial.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/getting-started/providers/oauth-tutorial.mdx b/docs/docs/getting-started/providers/oauth-tutorial.mdx index 8a5648250d..ba11a1a9ac 100644 --- a/docs/docs/getting-started/providers/oauth-tutorial.mdx +++ b/docs/docs/getting-started/providers/oauth-tutorial.mdx @@ -113,7 +113,7 @@ export default function App({ Instances of `useSession` (more on it in the next section) will have access to the session data and status. The `` also keep the session updated and synced between browser tabs and windows. πŸ’ͺ🏽 :::tip -Check our [client docs](reference/nextjs/react/) to learn all the available options for handling sessions on the browser. +Check our [client docs](/reference/nextjs/react) to learn all the available options for handling sessions on the browser. ::: ### Consuming the session via hooks From 4a2d51195c09e5fbc19817f70d589f192a146e6f Mon Sep 17 00:00:00 2001 From: Benjamin Wallberg Date: Thu, 14 Mar 2024 02:45:33 +0100 Subject: [PATCH 13/13] fix(core): cannot parse action at /session (#10094) * fix(core): cannot parse action at /session fix: support apps hosted on subpaths * refactor(core): use const instead of let for detected host & protocol * fix(core): warn if basePath & AUTH_URL path are both provided * refactor: update logger --------- Co-authored-by: Nico Domino Co-authored-by: Thang Vu --- packages/core/src/lib/utils/env.ts | 36 +++++++++++--- packages/core/src/lib/utils/logger.ts | 8 ++- packages/core/test/env.test.ts | 71 ++++++++++++++++++++++++--- 3 files changed, 99 insertions(+), 16 deletions(-) diff --git a/packages/core/src/lib/utils/env.ts b/packages/core/src/lib/utils/env.ts index ab41433f8e..858f75c874 100644 --- a/packages/core/src/lib/utils/env.ts +++ b/packages/core/src/lib/utils/env.ts @@ -1,4 +1,5 @@ import type { AuthAction, AuthConfig } from "../../types.js" +import { logger } from "./logger.js" /** Set default env variables on the config object */ export function setEnvDefaults(envObject: any, config: AuthConfig) { @@ -51,13 +52,34 @@ export function createActionURL( envObject: any, basePath?: string ): URL { - let url = envObject.AUTH_URL ?? envObject.NEXTAUTH_URL - if (!url) { - const host = headers.get("x-forwarded-host") ?? headers.get("host") - if (!host) throw new TypeError("Missing host") - const proto = headers.get("x-forwarded-proto") ?? protocol - url = `${proto === "http" ? "http" : "https"}://${host}${basePath}` + let envUrl = envObject.AUTH_URL ?? envObject.NEXTAUTH_URL + + let url: URL + if (envUrl) { + url = new URL(envUrl) + if (basePath && basePath !== "/" && url.pathname !== "/") { + logger.warn( + url.pathname === basePath + ? "env-url-basepath-redundant" + : "env-url-basepath-mismatch" + ) + url.pathname = "/" + } + } else { + const detectedHost = headers.get("x-forwarded-host") ?? headers.get("host") + const detectedProtocol = + headers.get("x-forwarded-proto") ?? protocol ?? "https" + + url = new URL(`${detectedProtocol}://${detectedHost}`) } - return new URL(`${url.replace(/\/$/, "")}/${action}`) + // remove trailing slash + const sanitizedUrl = url.toString().replace(/\/$/, "") + + if (basePath) { + // remove leading and trailing slash + const sanitizedBasePath = basePath?.replace(/(^\/|\/$)/g, "") ?? "" + return new URL(`${sanitizedUrl}/${sanitizedBasePath}/${action}`) + } + return new URL(`${sanitizedUrl}/${action}`) } diff --git a/packages/core/src/lib/utils/logger.ts b/packages/core/src/lib/utils/logger.ts index 9a0b10c12a..133bd27e30 100644 --- a/packages/core/src/lib/utils/logger.ts +++ b/packages/core/src/lib/utils/logger.ts @@ -1,6 +1,12 @@ import { AuthError } from "../../errors.js" -export type WarningCode = "debug-enabled" | "csrf-disabled" | "experimental-webauthn" +export type WarningCode = + | "debug-enabled" + | "csrf-disabled" + | "experimental-webauthn" + | "env-url-basepath-redundant" + | "env-url-basepath-mismatch" + /** * Override any of the methods, and the rest will use the default logger. diff --git a/packages/core/test/env.test.ts b/packages/core/test/env.test.ts index 22623fa712..0e7b980b25 100644 --- a/packages/core/test/env.test.ts +++ b/packages/core/test/env.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it } from "vitest" +import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from "vitest" import { AuthConfig } from "../src/index.js" import { setEnvDefaults, createActionURL } from "../src/lib/utils/env.js" @@ -93,6 +93,12 @@ describe("config is inferred from environment variables", () => { }) describe("createActionURL", () => { +const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); + + afterEach(() => { + consoleWarnSpy.mockClear() + }) + it.each([ { args: { @@ -144,17 +150,66 @@ describe("createActionURL", () => { args: { action: "signout", protocol: undefined, - headers: new Headers({ - "x-forwarded-host": "example.com", - "x-forwarded-proto": "https", - }), - env: { AUTH_URL: "https://env.com/api/auth/" }, - basePath: "/auth", + headers: new Headers({}), + env: { AUTH_URL: "http://localhost:3000" }, + basePath: "/api/auth", + }, + expected: "http://localhost:3000/api/auth/signout", + }, + { + args: { + action: "signout", + protocol: undefined, + headers: new Headers({}), + env: { AUTH_URL: "https://sub.domain.env.com" }, + basePath: "/api/auth", }, - expected: "https://env.com/api/auth/signout", + expected: "https://sub.domain.env.com/api/auth/signout", + }, + { + args: { + action: "signout", + protocol: undefined, + headers: new Headers({}), + env: { AUTH_URL: "https://sub.domain.env.com/api/auth" }, + basePath: undefined, + }, + expected: "https://sub.domain.env.com/api/auth/signout", }, ])("%j", ({ args, expected }) => { // @ts-expect-error expect(createActionURL(...Object.values(args)).toString()).toBe(expected) + expect(consoleWarnSpy).not.toHaveBeenCalled() }) + + it.each([ + { + args: { + action: "signout", + protocol: undefined, + headers: new Headers({}), + env: { AUTH_URL: "http://localhost:3000/my-app/api/auth/" }, + basePath: "/my-app/api/auth", + }, + expected: "http://localhost:3000/my-app/api/auth/signout", + }, + { + args: { + action: "signout", + protocol: undefined, + headers: new Headers({}), + env: { AUTH_URL: "https://sub.domain.env.com/my-app" }, + basePath: "/api/auth", + }, + expected: "https://sub.domain.env.com/api/auth/signout", + }, + ])("Duplicate path configurations: %j", ({ args, expected }) => { + // @ts-expect-error + expect(createActionURL(...Object.values(args)).toString()).toBe(expected) + expect(consoleWarnSpy).toHaveBeenCalled() + }) + + afterAll(() => { + consoleWarnSpy.mockRestore(); + }) })