diff --git a/README.md b/README.md index e39b3dc46c..00cf803dab 100644 --- a/README.md +++ b/README.md @@ -25,10 +25,10 @@ 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.

- Don't want to manage auth yourself? Check out Clerk → + Sponsored Don't want to manage auth yourself? Check out Clerk →

@@ -96,13 +96,6 @@ We have an [OpenCollective](https://opencollective.com/nextauth) for companies a
Clerk
💵 - - - WorkOS Logo -
-
WorkOS
- 💵 - FusionAuth Logo @@ -183,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 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. 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/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 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/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/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 ac959af1ba..88bfc8bc12 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: "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..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,18 +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; +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: rgb(229 231 235 / 0.5) !important; + color: #a1a1a1; } -.theme-doc-markdown.markdown { - > p:first-of-type { - :last-child { - img { - width: 48px; - height: 48px; - } - } - } +html[data-theme="dark"] .sponsoredBadge { + background-color: #242526 !important; + color: #696969; } diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js index 358f04d5b4..70ae10f819 100644 --- a/docs/src/pages/index.js +++ b/docs/src/pages/index.js @@ -168,13 +168,16 @@ export default function Home() {
- 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..c5e51d4702 100644 --- a/docs/src/pages/index.module.css +++ b/docs/src/pages/index.module.css @@ -122,10 +122,37 @@ .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; +} + +@media screen and (max-width: 689px) { + .heroClerk div { + flex-direction: column; + } +} + +.sponsoredBadge { + font-size: 0.6rem; + line-height: 1rem; + border-radius: 2rem; + padding-inline: 0.5rem; + padding-block: 0.25rem; + background-color: rgb(229 231 235 / 0.5) !important; + color: #696969; +} + +[data-theme="dark"] .sponsoredBadge { + background-color: #242526 !important; } 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/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/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(); + }) }) 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 + ) }) }) 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'}