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
- 💵
- |
@@ -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).
:::
-
+
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}
-
-))}
-
+[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)',
+ 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() {
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'}
|