diff --git a/.env.example b/.env.example index 1d3dd9e019..12c75fedd5 100644 --- a/.env.example +++ b/.env.example @@ -130,6 +130,9 @@ AZUREAD_TENANT_ID= # OIDC_DISPLAY_NAME= # OIDC_SIGNING_ALGORITHM= +# Configure SAML SSO +# SAML_DATABASE_URL=postgresql://postgres:postgres@localhost:5432/formbricks-saml + # Configure this when you want to ship JS & CSS files from a complete URL instead of the current domain # ASSET_PREFIX_URL= diff --git a/apps/web/.gitignore b/apps/web/.gitignore index ad637ebaa2..09190cb1b2 100644 --- a/apps/web/.gitignore +++ b/apps/web/.gitignore @@ -48,3 +48,6 @@ uploads/ # Sentry Config File .sentryclirc + +# SAML Preloaded Connections +saml-connection/ \ No newline at end of file diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index 8259ceec77..5df93dac6f 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -107,6 +107,11 @@ ENV HOSTNAME "0.0.0.0" RUN mkdir -p /home/nextjs/apps/web/uploads/ VOLUME /home/nextjs/apps/web/uploads/ +# Prepare volume for SAML preloaded connection +RUN mkdir -p /home/nextjs/apps/web/saml-connection +VOLUME /home/nextjs/apps/web/saml-connection + CMD supercronic -quiet /app/docker/cronjobs & \ (cd packages/database && npm run db:migrate:deploy) && \ + (cd packages/database && npm run db:create-saml-database:deploy) && \ exec node apps/web/server.js diff --git a/apps/web/app/api/auth/saml/authorize/route.ts b/apps/web/app/api/auth/saml/authorize/route.ts new file mode 100644 index 0000000000..9ff0fe9e08 --- /dev/null +++ b/apps/web/app/api/auth/saml/authorize/route.ts @@ -0,0 +1,3 @@ +import { GET } from "@/modules/ee/auth/saml/api/authorize/route"; + +export { GET }; diff --git a/apps/web/app/api/auth/saml/callback/route.ts b/apps/web/app/api/auth/saml/callback/route.ts new file mode 100644 index 0000000000..e9620d12fb --- /dev/null +++ b/apps/web/app/api/auth/saml/callback/route.ts @@ -0,0 +1,3 @@ +import { POST } from "@/modules/ee/auth/saml/api/callback/route"; + +export { POST }; diff --git a/apps/web/app/api/auth/saml/token/route.ts b/apps/web/app/api/auth/saml/token/route.ts new file mode 100644 index 0000000000..1dc7398b39 --- /dev/null +++ b/apps/web/app/api/auth/saml/token/route.ts @@ -0,0 +1,3 @@ +import { POST } from "@/modules/ee/auth/saml/api/token/route"; + +export { POST }; diff --git a/apps/web/app/api/auth/saml/userinfo/route.ts b/apps/web/app/api/auth/saml/userinfo/route.ts new file mode 100644 index 0000000000..ed2b670776 --- /dev/null +++ b/apps/web/app/api/auth/saml/userinfo/route.ts @@ -0,0 +1,3 @@ +import { GET } from "@/modules/ee/auth/saml/api/userinfo/route"; + +export { GET }; diff --git a/apps/web/modules/auth/login/components/login-form.tsx b/apps/web/modules/auth/login/components/login-form.tsx index 73f1f58e60..cb9c80815e 100644 --- a/apps/web/modules/auth/login/components/login-form.tsx +++ b/apps/web/modules/auth/login/components/login-form.tsx @@ -39,7 +39,10 @@ interface LoginFormProps { oidcOAuthEnabled: boolean; oidcDisplayName?: string; isMultiOrgEnabled: boolean; - isSSOEnabled: boolean; + isSsoEnabled: boolean; + samlSsoEnabled: boolean; + samlTenant: string; + samlProduct: string; } export const LoginForm = ({ @@ -52,7 +55,10 @@ export const LoginForm = ({ oidcOAuthEnabled, oidcDisplayName, isMultiOrgEnabled, - isSSOEnabled, + isSsoEnabled, + samlSsoEnabled, + samlTenant, + samlProduct, }: LoginFormProps) => { const router = useRouter(); const searchParams = useSearchParams(); @@ -239,13 +245,16 @@ export const LoginForm = ({ )} - {isSSOEnabled && ( + {isSsoEnabled && ( )} diff --git a/apps/web/modules/auth/login/page.tsx b/apps/web/modules/auth/login/page.tsx index c702632bc1..cc70cc03f9 100644 --- a/apps/web/modules/auth/login/page.tsx +++ b/apps/web/modules/auth/login/page.tsx @@ -1,6 +1,10 @@ import { FormWrapper } from "@/modules/auth/components/form-wrapper"; import { Testimonial } from "@/modules/auth/components/testimonial"; -import { getIsMultiOrgEnabled, getIsSSOEnabled } from "@/modules/ee/license-check/lib/utils"; +import { + getIsMultiOrgEnabled, + getIsSamlSsoEnabled, + getisSsoEnabled, +} from "@/modules/ee/license-check/lib/utils"; import { Metadata } from "next"; import { AZURE_OAUTH_ENABLED, @@ -10,6 +14,9 @@ import { OIDC_DISPLAY_NAME, OIDC_OAUTH_ENABLED, PASSWORD_RESET_DISABLED, + SAML_OAUTH_ENABLED, + SAML_PRODUCT, + SAML_TENANT, SIGNUP_ENABLED, } from "@formbricks/lib/constants"; import { LoginForm } from "./components/login-form"; @@ -20,7 +27,13 @@ export const metadata: Metadata = { }; export const LoginPage = async () => { - const [isMultiOrgEnabled, isSSOEnabled] = await Promise.all([getIsMultiOrgEnabled(), getIsSSOEnabled()]); + const [isMultiOrgEnabled, isSsoEnabled, isSamlSsoEnabled] = await Promise.all([ + getIsMultiOrgEnabled(), + getisSsoEnabled(), + getIsSamlSsoEnabled(), + ]); + + const samlSsoEnabled = isSamlSsoEnabled && SAML_OAUTH_ENABLED; return (
@@ -38,7 +51,10 @@ export const LoginPage = async () => { oidcOAuthEnabled={OIDC_OAUTH_ENABLED} oidcDisplayName={OIDC_DISPLAY_NAME} isMultiOrgEnabled={isMultiOrgEnabled} - isSSOEnabled={isSSOEnabled} + isSsoEnabled={isSsoEnabled} + samlSsoEnabled={samlSsoEnabled} + samlTenant={SAML_TENANT} + samlProduct={SAML_PRODUCT} />
diff --git a/apps/web/modules/auth/signup/components/signup-form.tsx b/apps/web/modules/auth/signup/components/signup-form.tsx index 84279edaf3..a6e71bb380 100644 --- a/apps/web/modules/auth/signup/components/signup-form.tsx +++ b/apps/web/modules/auth/signup/components/signup-form.tsx @@ -53,8 +53,11 @@ interface SignupFormProps { emailVerificationDisabled: boolean; defaultOrganizationId?: string; defaultOrganizationRole?: TOrganizationRole; - isSSOEnabled: boolean; + isSsoEnabled: boolean; + samlSsoEnabled: boolean; isTurnstileConfigured: boolean; + samlTenant: string; + samlProduct: string; } export const SignupForm = ({ @@ -72,8 +75,11 @@ export const SignupForm = ({ emailVerificationDisabled, defaultOrganizationId, defaultOrganizationRole, - isSSOEnabled, + isSsoEnabled, + samlSsoEnabled, isTurnstileConfigured, + samlTenant, + samlProduct, }: SignupFormProps) => { const [showLogin, setShowLogin] = useState(false); const searchParams = useSearchParams(); @@ -266,13 +272,16 @@ export const SignupForm = ({ )} - {isSSOEnabled && ( + {isSsoEnabled && ( )} diff --git a/apps/web/modules/auth/signup/page.tsx b/apps/web/modules/auth/signup/page.tsx index 4dfd050866..d4f164fa5a 100644 --- a/apps/web/modules/auth/signup/page.tsx +++ b/apps/web/modules/auth/signup/page.tsx @@ -1,6 +1,10 @@ import { FormWrapper } from "@/modules/auth/components/form-wrapper"; import { Testimonial } from "@/modules/auth/components/testimonial"; -import { getIsMultiOrgEnabled, getIsSSOEnabled } from "@/modules/ee/license-check/lib/utils"; +import { + getIsMultiOrgEnabled, + getIsSamlSsoEnabled, + getisSsoEnabled, +} from "@/modules/ee/license-check/lib/utils"; import { notFound } from "next/navigation"; import { AZURE_OAUTH_ENABLED, @@ -14,6 +18,9 @@ import { OIDC_DISPLAY_NAME, OIDC_OAUTH_ENABLED, PRIVACY_URL, + SAML_OAUTH_ENABLED, + SAML_PRODUCT, + SAML_TENANT, SIGNUP_ENABLED, TERMS_URL, WEBAPP_URL, @@ -24,7 +31,14 @@ import { SignupForm } from "./components/signup-form"; export const SignupPage = async ({ searchParams: searchParamsProps }) => { const searchParams = await searchParamsProps; const inviteToken = searchParams["inviteToken"] ?? null; - const [isMultOrgEnabled, isSSOEnabled] = await Promise.all([getIsMultiOrgEnabled(), getIsSSOEnabled()]); + const [isMultOrgEnabled, isSsoEnabled, isSamlSsoEnabled] = await Promise.all([ + getIsMultiOrgEnabled(), + getisSsoEnabled(), + getIsSamlSsoEnabled(), + ]); + + const samlSsoEnabled = isSamlSsoEnabled && SAML_OAUTH_ENABLED; + const locale = await findMatchingLocale(); if (!inviteToken && (!SIGNUP_ENABLED || !isMultOrgEnabled)) { notFound(); @@ -53,8 +67,11 @@ export const SignupPage = async ({ searchParams: searchParamsProps }) => { emailFromSearchParams={emailFromSearchParams} defaultOrganizationId={DEFAULT_ORGANIZATION_ID} defaultOrganizationRole={DEFAULT_ORGANIZATION_ROLE} - isSSOEnabled={isSSOEnabled} + isSsoEnabled={isSsoEnabled} + samlSsoEnabled={samlSsoEnabled} isTurnstileConfigured={IS_TURNSTILE_CONFIGURED} + samlTenant={SAML_TENANT} + samlProduct={SAML_PRODUCT} />
diff --git a/apps/web/modules/ee/auth/saml/api/authorize/route.ts b/apps/web/modules/ee/auth/saml/api/authorize/route.ts new file mode 100644 index 0000000000..9492508261 --- /dev/null +++ b/apps/web/modules/ee/auth/saml/api/authorize/route.ts @@ -0,0 +1,33 @@ +import { responses } from "@/app/lib/api/response"; +import jackson from "@/modules/ee/auth/saml/lib/jackson"; +import { getIsSamlSsoEnabled } from "@/modules/ee/license-check/lib/utils"; +import type { OAuthReq } from "@boxyhq/saml-jackson"; +import { NextRequest, NextResponse } from "next/server"; + +export const GET = async (req: NextRequest) => { + const jacksonInstance = await jackson(); + if (!jacksonInstance) { + return responses.forbiddenResponse("SAML SSO is not enabled in your Formbricks license"); + } + const { oauthController } = jacksonInstance; + const searchParams = Object.fromEntries(req.nextUrl.searchParams); + const isSamlSsoEnabled = await getIsSamlSsoEnabled(); + + if (!isSamlSsoEnabled) { + return responses.forbiddenResponse("SAML SSO is not enabled in your Formbricks license"); + } + + try { + const { redirect_url } = await oauthController.authorize(searchParams as OAuthReq); + + if (!redirect_url) { + return responses.internalServerErrorResponse("Failed to get redirect URL"); + } + + return NextResponse.redirect(redirect_url); + } catch (err: unknown) { + const errorMessage = err instanceof Error ? err.message : "An unknown error occurred"; + + return responses.internalServerErrorResponse(errorMessage); + } +}; diff --git a/apps/web/modules/ee/auth/saml/api/callback/route.ts b/apps/web/modules/ee/auth/saml/api/callback/route.ts new file mode 100644 index 0000000000..c598aa751f --- /dev/null +++ b/apps/web/modules/ee/auth/saml/api/callback/route.ts @@ -0,0 +1,32 @@ +import { responses } from "@/app/lib/api/response"; +import jackson from "@/modules/ee/auth/saml/lib/jackson"; +import { redirect } from "next/navigation"; + +interface SAMLCallbackBody { + RelayState: string; + SAMLResponse: string; +} + +export const POST = async (req: Request) => { + const jacksonInstance = await jackson(); + if (!jacksonInstance) { + return responses.forbiddenResponse("SAML SSO is not enabled in your Formbricks license"); + } + const { oauthController } = jacksonInstance; + + const formData = await req.formData(); + const body = Object.fromEntries(formData.entries()); + + const { RelayState, SAMLResponse } = body as unknown as SAMLCallbackBody; + + const { redirect_url } = await oauthController.samlResponse({ + RelayState, + SAMLResponse, + }); + + if (!redirect_url) { + return responses.internalServerErrorResponse("Failed to get redirect URL"); + } + + return redirect(redirect_url); +}; diff --git a/apps/web/modules/ee/auth/saml/api/token/route.ts b/apps/web/modules/ee/auth/saml/api/token/route.ts new file mode 100644 index 0000000000..26ba16800e --- /dev/null +++ b/apps/web/modules/ee/auth/saml/api/token/route.ts @@ -0,0 +1,18 @@ +import { responses } from "@/app/lib/api/response"; +import jackson from "@/modules/ee/auth/saml/lib/jackson"; +import { OAuthTokenReq } from "@boxyhq/saml-jackson"; + +export const POST = async (req: Request) => { + const jacksonInstance = await jackson(); + if (!jacksonInstance) { + return responses.forbiddenResponse("SAML SSO is not enabled in your Formbricks license"); + } + const { oauthController } = jacksonInstance; + + const body = await req.formData(); + const formData = Object.fromEntries(body.entries()); + + const response = await oauthController.token(formData as unknown as OAuthTokenReq); + + return Response.json(response); +}; diff --git a/apps/web/modules/ee/auth/saml/api/userinfo/lib/utils.test.ts b/apps/web/modules/ee/auth/saml/api/userinfo/lib/utils.test.ts new file mode 100644 index 0000000000..47bb0bc4a5 --- /dev/null +++ b/apps/web/modules/ee/auth/saml/api/userinfo/lib/utils.test.ts @@ -0,0 +1,87 @@ +import { responses } from "@/app/lib/api/response"; +import { describe, expect, test, vi } from "vitest"; +import { extractAuthToken } from "./utils"; + +vi.mock("@/app/lib/api/response", () => ({ + responses: { + unauthorizedResponse: vi.fn().mockReturnValue(new Error("Unauthorized")), + }, +})); + +describe("extractAuthToken", () => { + test("extracts token from Authorization header with Bearer prefix", () => { + const mockRequest = new Request("https://example.com", { + headers: { + authorization: "Bearer token123", + }, + }); + + const token = extractAuthToken(mockRequest); + expect(token).toBe("token123"); + }); + + test("extracts token from Authorization header with other prefix", () => { + const mockRequest = new Request("https://example.com", { + headers: { + authorization: "Custom token123", + }, + }); + + const token = extractAuthToken(mockRequest); + expect(token).toBe("token123"); + }); + + test("extracts token from query parameter", () => { + const mockRequest = new Request("https://example.com?access_token=token123"); + + const token = extractAuthToken(mockRequest); + expect(token).toBe("token123"); + }); + + test("prioritizes Authorization header over query parameter", () => { + const mockRequest = new Request("https://example.com?access_token=queryToken", { + headers: { + authorization: "Bearer headerToken", + }, + }); + + const token = extractAuthToken(mockRequest); + expect(token).toBe("headerToken"); + }); + + test("throws unauthorized error when no token is found", () => { + const mockRequest = new Request("https://example.com"); + + expect(() => extractAuthToken(mockRequest)).toThrow("Unauthorized"); + expect(responses.unauthorizedResponse).toHaveBeenCalled(); + }); + + test("throws unauthorized error when Authorization header is empty", () => { + const mockRequest = new Request("https://example.com", { + headers: { + authorization: "", + }, + }); + + expect(() => extractAuthToken(mockRequest)).toThrow("Unauthorized"); + expect(responses.unauthorizedResponse).toHaveBeenCalled(); + }); + + test("throws unauthorized error when query parameter is empty", () => { + const mockRequest = new Request("https://example.com?access_token="); + + expect(() => extractAuthToken(mockRequest)).toThrow("Unauthorized"); + expect(responses.unauthorizedResponse).toHaveBeenCalled(); + }); + + test("handles Authorization header with only prefix", () => { + const mockRequest = new Request("https://example.com", { + headers: { + authorization: "Bearer ", + }, + }); + + expect(() => extractAuthToken(mockRequest)).toThrow("Unauthorized"); + expect(responses.unauthorizedResponse).toHaveBeenCalled(); + }); +}); diff --git a/apps/web/modules/ee/auth/saml/api/userinfo/lib/utils.ts b/apps/web/modules/ee/auth/saml/api/userinfo/lib/utils.ts new file mode 100644 index 0000000000..b1eca497e5 --- /dev/null +++ b/apps/web/modules/ee/auth/saml/api/userinfo/lib/utils.ts @@ -0,0 +1,14 @@ +import { responses } from "@/app/lib/api/response"; + +export const extractAuthToken = (req: Request) => { + const authHeader = req.headers.get("authorization"); + const parts = (authHeader || "").split(" "); + if (parts.length > 1) return parts[1]; + + // check for query param + const params = new URL(req.url).searchParams; + const accessToken = params.get("access_token"); + if (accessToken) return accessToken; + + throw responses.unauthorizedResponse(); +}; diff --git a/apps/web/modules/ee/auth/saml/api/userinfo/route.ts b/apps/web/modules/ee/auth/saml/api/userinfo/route.ts new file mode 100644 index 0000000000..80f0863b9c --- /dev/null +++ b/apps/web/modules/ee/auth/saml/api/userinfo/route.ts @@ -0,0 +1,16 @@ +import { responses } from "@/app/lib/api/response"; +import { extractAuthToken } from "@/modules/ee/auth/saml/api/userinfo/lib/utils"; +import jackson from "@/modules/ee/auth/saml/lib/jackson"; + +export const GET = async (req: Request) => { + const jacksonInstance = await jackson(); + if (!jacksonInstance) { + return responses.forbiddenResponse("SAML SSO is not enabled in your Formbricks license"); + } + const { oauthController } = jacksonInstance; + const token = extractAuthToken(req); + + const user = await oauthController.userInfo(token); + + return Response.json(user); +}; diff --git a/apps/web/modules/ee/auth/saml/lib/jackson.ts b/apps/web/modules/ee/auth/saml/lib/jackson.ts new file mode 100644 index 0000000000..09a2e7caad --- /dev/null +++ b/apps/web/modules/ee/auth/saml/lib/jackson.ts @@ -0,0 +1,43 @@ +"use server"; + +import { preloadConnection } from "@/modules/ee/auth/saml/lib/preload-connection"; +import { getIsSamlSsoEnabled } from "@/modules/ee/license-check/lib/utils"; +import type { IConnectionAPIController, IOAuthController, JacksonOption } from "@boxyhq/saml-jackson"; +import { SAML_AUDIENCE, SAML_DATABASE_URL, SAML_PATH, WEBAPP_URL } from "@formbricks/lib/constants"; + +const opts: JacksonOption = { + externalUrl: WEBAPP_URL, + samlAudience: SAML_AUDIENCE, + samlPath: SAML_PATH, + db: { + engine: "sql", + type: "postgres", + url: SAML_DATABASE_URL, + }, +}; + +declare global { + var oauthController: IOAuthController | undefined; + var connectionController: IConnectionAPIController | undefined; +} + +const g = global; + +export default async function init() { + if (!g.oauthController || !g.connectionController) { + const isSamlSsoEnabled = await getIsSamlSsoEnabled(); + if (!isSamlSsoEnabled) return; + + const ret = await (await import("@boxyhq/saml-jackson")).controllers(opts); + + await preloadConnection(ret.connectionAPIController); + + g.oauthController = ret.oauthController; + g.connectionController = ret.connectionAPIController; + } + + return { + oauthController: g.oauthController, + connectionController: g.connectionController, + }; +} diff --git a/apps/web/modules/ee/auth/saml/lib/preload-connection.ts b/apps/web/modules/ee/auth/saml/lib/preload-connection.ts new file mode 100644 index 0000000000..1a7e7f8c17 --- /dev/null +++ b/apps/web/modules/ee/auth/saml/lib/preload-connection.ts @@ -0,0 +1,73 @@ +import { SAMLSSOConnectionWithEncodedMetadata, SAMLSSORecord } from "@boxyhq/saml-jackson"; +import { ConnectionAPIController } from "@boxyhq/saml-jackson/dist/controller/api"; +import fs from "fs/promises"; +import path from "path"; +import { SAML_PRODUCT, SAML_TENANT, SAML_XML_DIR, WEBAPP_URL } from "@formbricks/lib/constants"; + +const getPreloadedConnectionFile = async () => { + const preloadedConnections = await fs.readdir(path.join(SAML_XML_DIR)); + const xmlFiles = preloadedConnections.filter((file) => file.endsWith(".xml")); + if (xmlFiles.length === 0) { + throw new Error("No preloaded connection file found"); + } + return xmlFiles[0]; +}; + +const getPreloadedConnectionMetadata = async () => { + const preloadedConnectionFile = await getPreloadedConnectionFile(); + + const preloadedConnectionMetadata = await fs.readFile( + path.join(SAML_XML_DIR, preloadedConnectionFile), + "utf8" + ); + return preloadedConnectionMetadata; +}; + +const getConnectionPayload = (metadata: string): SAMLSSOConnectionWithEncodedMetadata => { + const encodedRawMetadata = Buffer.from(metadata, "utf8").toString("base64"); + + return { + name: "SAML SSO", + defaultRedirectUrl: `${WEBAPP_URL}/auth/login`, + redirectUrl: [`${WEBAPP_URL}/*`], + tenant: SAML_TENANT, + product: SAML_PRODUCT, + encodedRawMetadata, + }; +}; + +export const preloadConnection = async (connectionController: ConnectionAPIController) => { + try { + const preloadedConnectionMetadata = await getPreloadedConnectionMetadata(); + + if (!preloadedConnectionMetadata) { + console.log("No preloaded connection metadata found"); + return; + } + + const connections = await connectionController.getConnections({ + tenant: SAML_TENANT, + product: SAML_PRODUCT, + }); + + const existingConnection = connections[0]; + + const connection = getConnectionPayload(preloadedConnectionMetadata); + let newConnection: SAMLSSORecord; + try { + newConnection = await connectionController.createSAMLConnection(connection); + } catch (error) { + throw new Error(`Metadata is not valid\n${error.message}`); + } + if (newConnection && existingConnection && newConnection.clientID !== existingConnection.clientID) { + await connectionController.deleteConnections({ + clientID: existingConnection.clientID, + clientSecret: existingConnection.clientSecret, + product: existingConnection.product, + tenant: existingConnection.tenant, + }); + } + } catch (error) { + console.error("Error preloading connection:", error.message); + } +}; diff --git a/apps/web/modules/ee/auth/saml/lib/tests/jackson.test.ts b/apps/web/modules/ee/auth/saml/lib/tests/jackson.test.ts new file mode 100644 index 0000000000..3cbc857b03 --- /dev/null +++ b/apps/web/modules/ee/auth/saml/lib/tests/jackson.test.ts @@ -0,0 +1,110 @@ +import { preloadConnection } from "@/modules/ee/auth/saml/lib/preload-connection"; +import { getIsSamlSsoEnabled } from "@/modules/ee/license-check/lib/utils"; +import { controllers } from "@boxyhq/saml-jackson"; +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; +import { SAML_AUDIENCE, SAML_DATABASE_URL, SAML_PATH, WEBAPP_URL } from "@formbricks/lib/constants"; +import init from "../jackson"; + +vi.mock("@formbricks/lib/constants", () => ({ + SAML_AUDIENCE: "test-audience", + SAML_DATABASE_URL: "test-db-url", + SAML_PATH: "/test-path", + WEBAPP_URL: "https://test-webapp-url.com", +})); + +vi.mock("@/modules/ee/license-check/lib/utils", () => ({ + getIsSamlSsoEnabled: vi.fn(), +})); + +vi.mock("@/modules/ee/auth/saml/lib/preload-connection", () => ({ + preloadConnection: vi.fn(), +})); + +vi.mock("@boxyhq/saml-jackson", () => ({ + controllers: vi.fn(), +})); + +describe("SAML Jackson Initialization", () => { + const mockOAuthController = { name: "mockOAuthController" }; + const mockConnectionController = { name: "mockConnectionController" }; + + beforeEach(() => { + vi.clearAllMocks(); + + global.oauthController = undefined; + global.connectionController = undefined; + + vi.mocked(controllers).mockResolvedValue({ + oauthController: mockOAuthController, + connectionAPIController: mockConnectionController, + } as any); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + test("initialize controllers when SAML SSO is enabled", async () => { + vi.mocked(getIsSamlSsoEnabled).mockResolvedValue(true); + + const result = await init(); + + expect(getIsSamlSsoEnabled).toHaveBeenCalledTimes(1); + + expect(controllers).toHaveBeenCalledWith({ + externalUrl: WEBAPP_URL, + samlAudience: SAML_AUDIENCE, + samlPath: SAML_PATH, + db: { + engine: "sql", + type: "postgres", + url: SAML_DATABASE_URL, + }, + }); + + expect(preloadConnection).toHaveBeenCalledWith(mockConnectionController); + + expect(global.oauthController).toBe(mockOAuthController); + expect(global.connectionController).toBe(mockConnectionController); + + expect(result).toEqual({ + oauthController: mockOAuthController, + connectionController: mockConnectionController, + }); + }); + + test("return early when SAML SSO is disabled", async () => { + vi.mocked(getIsSamlSsoEnabled).mockResolvedValue(false); + + const result = await init(); + + expect(getIsSamlSsoEnabled).toHaveBeenCalledTimes(1); + + expect(controllers).not.toHaveBeenCalled(); + + expect(preloadConnection).not.toHaveBeenCalled(); + + expect(global.oauthController).toBeUndefined(); + expect(global.connectionController).toBeUndefined(); + + expect(result).toBeUndefined(); + }); + + test("reuse existing controllers if already initialized", async () => { + global.oauthController = mockOAuthController as any; + global.connectionController = mockConnectionController as any; + + const result = await init(); + + expect(getIsSamlSsoEnabled).not.toHaveBeenCalled(); + + expect(controllers).not.toHaveBeenCalled(); + + expect(preloadConnection).not.toHaveBeenCalled(); + + expect(result).toEqual({ + oauthController: mockOAuthController, + connectionController: mockConnectionController, + }); + }); +}); diff --git a/apps/web/modules/ee/auth/saml/lib/tests/preload-connection.test.ts b/apps/web/modules/ee/auth/saml/lib/tests/preload-connection.test.ts new file mode 100644 index 0000000000..16663333e1 --- /dev/null +++ b/apps/web/modules/ee/auth/saml/lib/tests/preload-connection.test.ts @@ -0,0 +1,142 @@ +import fs from "fs/promises"; +import path from "path"; +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; +import { SAML_PRODUCT, SAML_TENANT, SAML_XML_DIR, WEBAPP_URL } from "@formbricks/lib/constants"; +import { preloadConnection } from "../preload-connection"; + +vi.mock("@formbricks/lib/constants", () => ({ + SAML_PRODUCT: "test-product", + SAML_TENANT: "test-tenant", + SAML_XML_DIR: "test-xml-dir", + WEBAPP_URL: "https://test-webapp-url.com", +})); + +vi.mock("fs/promises", () => ({ + default: { + readdir: vi.fn(), + readFile: vi.fn(), + }, +})); + +vi.mock("path", () => ({ + default: { + join: vi.fn(), + }, +})); + +vi.mock("@boxyhq/saml-jackson", () => ({ + SAMLSSOConnectionWithEncodedMetadata: vi.fn(), +})); + +vi.mock("@boxyhq/saml-jackson/dist/controller/api", () => ({ + ConnectionAPIController: vi.fn(), +})); + +describe("SAML Preload Connection", () => { + const mockConnectionController = { + getConnections: vi.fn(), + createSAMLConnection: vi.fn(), + deleteConnections: vi.fn(), + }; + + const mockMetadata = "SAML Metadata"; + const mockEncodedMetadata = Buffer.from(mockMetadata, "utf8").toString("base64"); + + const mockExistingConnection = { + clientID: "existing-client-id", + clientSecret: "existing-client-secret", + product: SAML_PRODUCT, + tenant: SAML_TENANT, + }; + + const mockNewConnection = { + clientID: "new-client-id", + clientSecret: "new-client-secret", + }; + + beforeEach(() => { + vi.clearAllMocks(); + + vi.mocked(path.join).mockImplementation((...args) => args.join("/")); + + vi.mocked(fs.readdir).mockResolvedValue(["metadata.xml", "other-file.txt"] as any); + + vi.mocked(fs.readFile).mockResolvedValue(mockMetadata as any); + + mockConnectionController.getConnections.mockResolvedValue([mockExistingConnection]); + + mockConnectionController.createSAMLConnection.mockResolvedValue(mockNewConnection); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + test("preload connection from XML file", async () => { + await preloadConnection(mockConnectionController as any); + + expect(fs.readdir).toHaveBeenCalledWith(path.join(SAML_XML_DIR)); + + expect(fs.readFile).toHaveBeenCalledWith(path.join(SAML_XML_DIR, "metadata.xml"), "utf8"); + + expect(mockConnectionController.getConnections).toHaveBeenCalledWith({ + tenant: SAML_TENANT, + product: SAML_PRODUCT, + }); + + expect(mockConnectionController.createSAMLConnection).toHaveBeenCalledWith({ + name: "SAML SSO", + defaultRedirectUrl: `${WEBAPP_URL}/auth/login`, + redirectUrl: [`${WEBAPP_URL}/*`], + tenant: SAML_TENANT, + product: SAML_PRODUCT, + encodedRawMetadata: mockEncodedMetadata, + }); + + expect(mockConnectionController.deleteConnections).toHaveBeenCalledWith({ + clientID: mockExistingConnection.clientID, + clientSecret: mockExistingConnection.clientSecret, + product: mockExistingConnection.product, + tenant: mockExistingConnection.tenant, + }); + }); + + test("not delete existing connection if client IDs match", async () => { + mockConnectionController.createSAMLConnection.mockResolvedValue({ + clientID: mockExistingConnection.clientID, + }); + + await preloadConnection(mockConnectionController as any); + + expect(mockConnectionController.deleteConnections).not.toHaveBeenCalled(); + }); + + test("handle case when no XML files are found", async () => { + vi.mocked(fs.readdir).mockResolvedValue(["other-file.txt"] as any); + + const consoleErrorSpy = vi.spyOn(console, "error"); + + await preloadConnection(mockConnectionController as any); + + expect(consoleErrorSpy).toHaveBeenCalledWith( + "Error preloading connection:", + expect.stringContaining("No preloaded connection file found") + ); + + expect(mockConnectionController.createSAMLConnection).not.toHaveBeenCalled(); + }); + + test("handle invalid metadata", async () => { + const errorMessage = "Invalid metadata"; + mockConnectionController.createSAMLConnection.mockRejectedValue(new Error(errorMessage)); + + const consoleErrorSpy = vi.spyOn(console, "error"); + + await preloadConnection(mockConnectionController as any); + + expect(consoleErrorSpy).toHaveBeenCalledWith( + "Error preloading connection:", + expect.stringContaining(errorMessage) + ); + }); +}); diff --git a/apps/web/modules/ee/license-check/lib/utils.ts b/apps/web/modules/ee/license-check/lib/utils.ts index eaa620afe7..88beff7ffd 100644 --- a/apps/web/modules/ee/license-check/lib/utils.ts +++ b/apps/web/modules/ee/license-check/lib/utils.ts @@ -90,6 +90,7 @@ const fetchLicenseForE2ETesting = async (): Promise<{ whitelabel: true, removeBranding: true, ai: true, + saml: true, }, lastChecked: currentTime, }; @@ -156,6 +157,7 @@ export const getEnterpriseLicense = async (): Promise<{ removeBranding: false, contacts: false, ai: false, + saml: false, }, lastChecked: new Date(), }; @@ -361,7 +363,7 @@ export const getIsTwoFactorAuthEnabled = async (): Promise => { return licenseFeatures.twoFactorAuth; }; -export const getIsSSOEnabled = async (): Promise => { +export const getisSsoEnabled = async (): Promise => { if (E2E_TESTING) { const previousResult = await fetchLicenseForE2ETesting(); return previousResult && previousResult.features ? previousResult.features.sso : false; @@ -371,6 +373,21 @@ export const getIsSSOEnabled = async (): Promise => { return licenseFeatures.sso; }; +export const getIsSamlSsoEnabled = async (): Promise => { + if (E2E_TESTING) { + const previousResult = await fetchLicenseForE2ETesting(); + return previousResult && previousResult.features + ? previousResult.features.sso && previousResult.features.saml + : false; + } + if (IS_FORMBRICKS_CLOUD) { + return false; + } + const licenseFeatures = await getLicenseFeatures(); + if (!licenseFeatures) return false; + return licenseFeatures.sso && licenseFeatures.saml; +}; + export const getIsOrganizationAIReady = async (billingPlan: Organization["billing"]["plan"]) => { if (!IS_AI_CONFIGURED) return false; if (E2E_TESTING) { diff --git a/apps/web/modules/ee/license-check/types/enterprise-license.ts b/apps/web/modules/ee/license-check/types/enterprise-license.ts index 987da12f39..6c20128432 100644 --- a/apps/web/modules/ee/license-check/types/enterprise-license.ts +++ b/apps/web/modules/ee/license-check/types/enterprise-license.ts @@ -12,6 +12,7 @@ const ZEnterpriseLicenseFeatures = z.object({ removeBranding: z.boolean(), twoFactorAuth: z.boolean(), sso: z.boolean(), + saml: z.boolean(), ai: z.boolean(), }); diff --git a/apps/web/modules/ee/sso/actions.ts b/apps/web/modules/ee/sso/actions.ts new file mode 100644 index 0000000000..c7bad9888a --- /dev/null +++ b/apps/web/modules/ee/sso/actions.ts @@ -0,0 +1,21 @@ +"use server"; + +import { actionClient } from "@/lib/utils/action-client"; +import jackson from "@/modules/ee/auth/saml/lib/jackson"; +import { SAML_PRODUCT, SAML_TENANT } from "@formbricks/lib/constants"; + +export const doesSamlConnectionExistAction = actionClient.action(async () => { + const jacksonInstance = await jackson(); + + if (!jacksonInstance) { + return false; + } + + const { connectionController } = jacksonInstance; + const connection = await connectionController.getConnections({ + product: SAML_PRODUCT, + tenant: SAML_TENANT, + }); + + return connection.length === 1; +}); diff --git a/apps/web/modules/ee/sso/components/azure-button.tsx b/apps/web/modules/ee/sso/components/azure-button.tsx index 730c58c2f4..c6676213ae 100644 --- a/apps/web/modules/ee/sso/components/azure-button.tsx +++ b/apps/web/modules/ee/sso/components/azure-button.tsx @@ -8,7 +8,7 @@ import { useCallback, useEffect } from "react"; import { FORMBRICKS_LOGGED_IN_WITH_LS } from "@formbricks/lib/localStorage"; interface AzureButtonProps { - inviteUrl?: string | null; + inviteUrl?: string; directRedirect?: boolean; lastUsed?: boolean; } diff --git a/apps/web/modules/ee/sso/components/github-button.tsx b/apps/web/modules/ee/sso/components/github-button.tsx index d2a045928f..be497b5e31 100644 --- a/apps/web/modules/ee/sso/components/github-button.tsx +++ b/apps/web/modules/ee/sso/components/github-button.tsx @@ -7,7 +7,7 @@ import { signIn } from "next-auth/react"; import { FORMBRICKS_LOGGED_IN_WITH_LS } from "@formbricks/lib/localStorage"; interface GithubButtonProps { - inviteUrl?: string | null; + inviteUrl?: string; lastUsed?: boolean; } diff --git a/apps/web/modules/ee/sso/components/google-button.tsx b/apps/web/modules/ee/sso/components/google-button.tsx index 3f165dc552..7b8e679e1f 100644 --- a/apps/web/modules/ee/sso/components/google-button.tsx +++ b/apps/web/modules/ee/sso/components/google-button.tsx @@ -7,7 +7,7 @@ import { signIn } from "next-auth/react"; import { FORMBRICKS_LOGGED_IN_WITH_LS } from "@formbricks/lib/localStorage"; interface GoogleButtonProps { - inviteUrl?: string | null; + inviteUrl?: string; lastUsed?: boolean; } diff --git a/apps/web/modules/ee/sso/components/open-id-button.tsx b/apps/web/modules/ee/sso/components/open-id-button.tsx index 50b65c6167..588b452f36 100644 --- a/apps/web/modules/ee/sso/components/open-id-button.tsx +++ b/apps/web/modules/ee/sso/components/open-id-button.tsx @@ -7,7 +7,7 @@ import { useCallback, useEffect } from "react"; import { FORMBRICKS_LOGGED_IN_WITH_LS } from "@formbricks/lib/localStorage"; interface OpenIdButtonProps { - inviteUrl?: string | null; + inviteUrl?: string; lastUsed?: boolean; directRedirect?: boolean; text?: string; diff --git a/apps/web/modules/ee/sso/components/saml-button.tsx b/apps/web/modules/ee/sso/components/saml-button.tsx new file mode 100644 index 0000000000..6167e1cb20 --- /dev/null +++ b/apps/web/modules/ee/sso/components/saml-button.tsx @@ -0,0 +1,61 @@ +"use client"; + +import { doesSamlConnectionExistAction } from "@/modules/ee/sso/actions"; +import { Button } from "@/modules/ui/components/button"; +import { useTranslate } from "@tolgee/react"; +import { LockIcon } from "lucide-react"; +import { signIn } from "next-auth/react"; +import { useState } from "react"; +import toast from "react-hot-toast"; +import { FORMBRICKS_LOGGED_IN_WITH_LS } from "@formbricks/lib/localStorage"; + +interface SamlButtonProps { + inviteUrl?: string; + lastUsed?: boolean; + samlTenant: string; + samlProduct: string; +} + +export const SamlButton = ({ inviteUrl, lastUsed, samlTenant, samlProduct }: SamlButtonProps) => { + const { t } = useTranslate(); + const [isLoading, setIsLoading] = useState(false); + + const handleLogin = async () => { + if (typeof window !== "undefined") { + localStorage.setItem(FORMBRICKS_LOGGED_IN_WITH_LS, "Saml"); + } + setIsLoading(true); + const doesSamlConnectionExist = await doesSamlConnectionExistAction(); + if (!doesSamlConnectionExist?.data) { + toast.error(t("auth.saml_connection_error")); + setIsLoading(false); + return; + } + + signIn( + "saml", + { + redirect: true, + callbackUrl: inviteUrl ? inviteUrl : "/", // redirect after login to / + }, + { + tenant: samlTenant, + product: samlProduct, + } + ); + }; + + return ( + + ); +}; diff --git a/apps/web/modules/ee/sso/components/sso-options.tsx b/apps/web/modules/ee/sso/components/sso-options.tsx index cad0418258..8f3c490520 100644 --- a/apps/web/modules/ee/sso/components/sso-options.tsx +++ b/apps/web/modules/ee/sso/components/sso-options.tsx @@ -1,10 +1,13 @@ "use client"; import { useTranslate } from "@tolgee/react"; +import { useEffect, useState } from "react"; +import { FORMBRICKS_LOGGED_IN_WITH_LS } from "@formbricks/lib/localStorage"; import { AzureButton } from "./azure-button"; import { GithubButton } from "./github-button"; import { GoogleButton } from "./google-button"; import { OpenIdButton } from "./open-id-button"; +import { SamlButton } from "./saml-button"; interface SSOOptionsProps { googleOAuthEnabled: boolean; @@ -13,6 +16,9 @@ interface SSOOptionsProps { oidcOAuthEnabled: boolean; oidcDisplayName?: string; callbackUrl: string; + samlSsoEnabled: boolean; + samlTenant: string; + samlProduct: string; } export const SSOOptions = ({ @@ -22,16 +28,42 @@ export const SSOOptions = ({ oidcOAuthEnabled, oidcDisplayName, callbackUrl, + samlSsoEnabled, + samlTenant, + samlProduct, }: SSOOptionsProps) => { const { t } = useTranslate(); + const [lastLoggedInWith, setLastLoggedInWith] = useState(""); + + useEffect(() => { + if (typeof window !== "undefined") { + setLastLoggedInWith(localStorage.getItem(FORMBRICKS_LOGGED_IN_WITH_LS) || ""); + } + }, []); return (
- {googleOAuthEnabled && } - {githubOAuthEnabled && } - {azureOAuthEnabled && } + {googleOAuthEnabled && ( + + )} + {githubOAuthEnabled && ( + + )} + {azureOAuthEnabled && } {oidcOAuthEnabled && ( - + + )} + {samlSsoEnabled && ( + )}
); diff --git a/apps/web/modules/ee/sso/lib/providers.ts b/apps/web/modules/ee/sso/lib/providers.ts index 1891147d3c..e00baa4ff1 100644 --- a/apps/web/modules/ee/sso/lib/providers.ts +++ b/apps/web/modules/ee/sso/lib/providers.ts @@ -15,6 +15,7 @@ import { OIDC_DISPLAY_NAME, OIDC_ISSUER, OIDC_SIGNING_ALGORITHM, + WEBAPP_URL, } from "@formbricks/lib/constants"; export const getSSOProviders = () => [ @@ -54,6 +55,36 @@ export const getSSOProviders = () => [ }; }, }, + { + id: "saml", + name: "BoxyHQ SAML", + type: "oauth" as const, + version: "2.0", + checks: ["pkce" as const, "state" as const], + authorization: { + url: `${WEBAPP_URL}/api/auth/saml/authorize`, + params: { + scope: "", + response_type: "code", + provider: "saml", + }, + }, + token: `${WEBAPP_URL}/api/auth/saml/token`, + userinfo: `${WEBAPP_URL}/api/auth/saml/userinfo`, + profile(profile) { + return { + id: profile.id, + email: profile.email, + name: [profile.firstName, profile.lastName].filter(Boolean).join(" "), + image: null, + }; + }, + options: { + clientId: "dummy", + clientSecret: "dummy", + }, + allowDangerousEmailAccountLinking: true, + }, ]; export type { IdentityProvider }; diff --git a/apps/web/modules/ee/sso/lib/sso-handlers.ts b/apps/web/modules/ee/sso/lib/sso-handlers.ts index be6433fd44..fffcd3d9d4 100644 --- a/apps/web/modules/ee/sso/lib/sso-handlers.ts +++ b/apps/web/modules/ee/sso/lib/sso-handlers.ts @@ -1,6 +1,7 @@ import { createBrevoCustomer } from "@/modules/auth/lib/brevo"; import { getUserByEmail, updateUser } from "@/modules/auth/lib/user"; import { createUser } from "@/modules/auth/lib/user"; +import { getIsSamlSsoEnabled, getisSsoEnabled } from "@/modules/ee/license-check/lib/utils"; import type { IdentityProvider } from "@prisma/client"; import type { Account } from "next-auth"; import { prisma } from "@formbricks/database"; @@ -12,12 +13,25 @@ import { findMatchingLocale } from "@formbricks/lib/utils/locale"; import type { TUser, TUserNotificationSettings } from "@formbricks/types/user"; export const handleSSOCallback = async ({ user, account }: { user: TUser; account: Account }) => { + const isSsoEnabled = await getisSsoEnabled(); + if (!isSsoEnabled) { + return false; + } + if (!user.email || account.type !== "oauth") { return false; } + let provider = account.provider.toLowerCase().replace("-", "") as IdentityProvider; + + if (provider === "saml") { + const isSamlSsoEnabled = await getIsSamlSsoEnabled(); + if (!isSamlSsoEnabled) { + return false; + } + } + if (account.provider) { - const provider = account.provider.toLowerCase().replace("-", "") as IdentityProvider; // check if accounts for this provider / account Id already exists const existingUserWithAccount = await prisma.user.findFirst({ include: { diff --git a/apps/web/modules/setup/(fresh-instance)/signup/page.tsx b/apps/web/modules/setup/(fresh-instance)/signup/page.tsx index b0af36753c..0f5c3bce31 100644 --- a/apps/web/modules/setup/(fresh-instance)/signup/page.tsx +++ b/apps/web/modules/setup/(fresh-instance)/signup/page.tsx @@ -1,5 +1,5 @@ import { SignupForm } from "@/modules/auth/signup/components/signup-form"; -import { getIsSSOEnabled } from "@/modules/ee/license-check/lib/utils"; +import { getIsSamlSsoEnabled, getisSsoEnabled } from "@/modules/ee/license-check/lib/utils"; import { getTranslate } from "@/tolgee/server"; import { Metadata } from "next"; import { @@ -14,6 +14,9 @@ import { OIDC_DISPLAY_NAME, OIDC_OAUTH_ENABLED, PRIVACY_URL, + SAML_OAUTH_ENABLED, + SAML_PRODUCT, + SAML_TENANT, TERMS_URL, WEBAPP_URL, } from "@formbricks/lib/constants"; @@ -26,7 +29,11 @@ export const metadata: Metadata = { export const SignupPage = async () => { const locale = await findMatchingLocale(); - const isSSOEnabled = await getIsSSOEnabled(); + + const [isSsoEnabled, isSamlSsoEnabled] = await Promise.all([getisSsoEnabled(), getIsSamlSsoEnabled()]); + + const samlSsoEnabled = isSamlSsoEnabled && SAML_OAUTH_ENABLED; + const t = await getTranslate(); return (
@@ -47,8 +54,11 @@ export const SignupPage = async () => { userLocale={locale} defaultOrganizationId={DEFAULT_ORGANIZATION_ID} defaultOrganizationRole={DEFAULT_ORGANIZATION_ROLE} - isSSOEnabled={isSSOEnabled} + isSsoEnabled={isSsoEnabled} + samlSsoEnabled={samlSsoEnabled} isTurnstileConfigured={IS_TURNSTILE_CONFIGURED} + samlTenant={SAML_TENANT} + samlProduct={SAML_PRODUCT} />
); diff --git a/apps/web/package.json b/apps/web/package.json index 072d447d33..b3306a2e8f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@ai-sdk/azure": "1.1.9", + "@boxyhq/saml-jackson": "1.37.1", "@dnd-kit/core": "6.3.1", "@dnd-kit/modifiers": "9.0.0", "@dnd-kit/sortable": "10.0.0", diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1b929709cd..97fa7baf1e 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -111,6 +111,9 @@ x-environment: &environment # OIDC_DISPLAY_NAME: # OIDC_SIGNING_ALGORITHM: + # Set the below to SAML Provider if you want to enable SAML + # SAML_DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks-saml?sslmode=disable" + ########################################## OPTIONAL (THIRD PARTY INTEGRATIONS) ########################################### # Oauth credentials for Notion Integration @@ -185,9 +188,11 @@ services: - 3000:3000 volumes: - uploads:/home/nextjs/apps/web/uploads/ + - ./saml-connection:/home/nextjs/apps/web/saml-connection <<: *environment volumes: postgres: driver: local uploads: + driver: local diff --git a/docs/development/guides/auth-and-provision/setup-saml-with-identity-providers.mdx b/docs/development/guides/auth-and-provision/setup-saml-with-identity-providers.mdx index 373e1c47c6..ddcd112cbf 100644 --- a/docs/development/guides/auth-and-provision/setup-saml-with-identity-providers.mdx +++ b/docs/development/guides/auth-and-provision/setup-saml-with-identity-providers.mdx @@ -1,11 +1,11 @@ --- title: "Setup SAML with Identity Providers" -description: "This guide explains the settings you need to use to configure SAML with your Identity Provider. Once configured, obtain an XML metadata file and upload it on your Formbricks instance." +description: "This guide explains the settings you need to use to configure SAML with your Identity Provider. Once configured, obtain an XML metadata file and use it to configure SAML in Formbricks." --- ### SAML Registration with Identity Providers -This guide explains the settings you need to use to configure SAML with your Identity Provider. Once configured, obtain an XML metadata file and upload it on your Formbricks instance. +This guide explains the settings you need to use to configure SAML with your Identity Provider. Once configured, obtain an XML metadata file and use it to configure SAML in Formbricks. > **Note:** Please do not add a trailing slash at the end of the URLs. Create them exactly as shown below. @@ -23,13 +23,13 @@ This guide explains the settings you need to use to configure SAML with your Ide **Mapping Attributes / Attribute Statements:** -* [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier) -> id +- [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier) -> id -* [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress) -> email +- [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress) -> email -* [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname) -> firstName +- [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname) -> firstName -* [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname) -> lastName +- [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname) -> lastName ### SAML With Okta @@ -38,57 +38,47 @@ This guide explains the settings you need to use to configure SAML with your Ide For example, in Okta, once you create an account, you can click on Applications on the sidebar menu: - + - + - - - + + - **Single Sign-On URL**: `https:///api/auth/saml/callback` or `http://localhost:3000/api/auth/saml/callback` (if you are running Formbricks locally) + - **Audience URI (SP Entity ID)**: `https://saml.formbricks.com` + + - - - - - - - - - - - - + + - - - + + - - + -That's it. Now when you try to login with SSO, your application on Okta will handle the authentication. \ No newline at end of file +That's it. Now when you try to login with SSO, your application on Okta will handle the authentication. diff --git a/docs/images/development/guides/auth-and-provision/okta/actions-button.webp b/docs/images/development/guides/auth-and-provision/okta/actions-button.webp deleted file mode 100644 index 55c85fbee1..0000000000 Binary files a/docs/images/development/guides/auth-and-provision/okta/actions-button.webp and /dev/null differ diff --git a/docs/images/development/guides/auth-and-provision/okta/idp-metadata.webp b/docs/images/development/guides/auth-and-provision/okta/idp-metadata.webp new file mode 100644 index 0000000000..7a68a18c6a Binary files /dev/null and b/docs/images/development/guides/auth-and-provision/okta/idp-metadata.webp differ diff --git a/docs/images/development/guides/auth-and-provision/okta/view-idp-metadata.webp b/docs/images/development/guides/auth-and-provision/okta/view-idp-metadata.webp deleted file mode 100644 index c3a3142487..0000000000 Binary files a/docs/images/development/guides/auth-and-provision/okta/view-idp-metadata.webp and /dev/null differ diff --git a/docs/images/development/guides/auth-and-provision/okta/view-saml-instructions.webp b/docs/images/development/guides/auth-and-provision/okta/view-saml-instructions.webp new file mode 100644 index 0000000000..ef54d8f252 Binary files /dev/null and b/docs/images/development/guides/auth-and-provision/okta/view-saml-instructions.webp differ diff --git a/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings-configure.webp b/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings-configure.webp deleted file mode 100644 index 988b62be21..0000000000 Binary files a/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings-configure.webp and /dev/null differ diff --git a/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings-modal.webp b/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings-modal.webp deleted file mode 100644 index 17b297a8c6..0000000000 Binary files a/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings-modal.webp and /dev/null differ diff --git a/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings.webp b/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings.webp deleted file mode 100644 index bb061af917..0000000000 Binary files a/docs/images/xm-and-surveys/core-features/saml-sso/sso-settings.webp and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.png deleted file mode 100644 index c3119342bf..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.webp new file mode 100644 index 0000000000..f230afe715 Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.png deleted file mode 100644 index a2467e6ee0..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.webp new file mode 100644 index 0000000000..a19de4ca4e Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.png deleted file mode 100644 index d654445a91..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.webp new file mode 100644 index 0000000000..80e608fa2d Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.png deleted file mode 100644 index 8d1fbec002..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.webp new file mode 100644 index 0000000000..79fc0a2c6f Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.png deleted file mode 100644 index 22e7596150..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.webp new file mode 100644 index 0000000000..8cee3555b0 Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.png deleted file mode 100644 index 506249e40f..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.webp new file mode 100644 index 0000000000..1fbda08a4f Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.png deleted file mode 100644 index 36fd804364..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.webp new file mode 100644 index 0000000000..6ff39e5c04 Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.png deleted file mode 100644 index 86bf21c4c1..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.webp new file mode 100644 index 0000000000..6051b54c6a Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.png deleted file mode 100644 index 2ccae0ce24..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.webp new file mode 100644 index 0000000000..a4c388e037 Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.png deleted file mode 100644 index d4c1a7cf2c..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.webp new file mode 100644 index 0000000000..ff4fef841f Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.png deleted file mode 100644 index 1b2153e486..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.webp new file mode 100644 index 0000000000..5129db2539 Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.png deleted file mode 100644 index 9401712616..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.webp new file mode 100644 index 0000000000..7c4361a71e Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.webp differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.png b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.png deleted file mode 100644 index af95612f43..0000000000 Binary files a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.png and /dev/null differ diff --git a/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.webp b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.webp new file mode 100644 index 0000000000..da7e8d5080 Binary files /dev/null and b/docs/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.webp differ diff --git a/docs/self-hosting/configuration/auth-sso/saml-sso.mdx b/docs/self-hosting/configuration/auth-sso/saml-sso.mdx index 25b59234ef..619fea7e19 100644 --- a/docs/self-hosting/configuration/auth-sso/saml-sso.mdx +++ b/docs/self-hosting/configuration/auth-sso/saml-sso.mdx @@ -17,7 +17,7 @@ To learn more about SAML Jackson, please refer to the [BoxyHQ SAML Jackson docum SAML (Security Assertion Markup Language) is an XML-based standard for exchanging authentication and authorization data between an Identity Provider (IdP) and Formbricks. Here's how the integration works with BoxyHQ Jackson embedded into the flow: 1. **Login Initiation:** - The user clicks “Sign in with SAML” on Formbricks. + The user clicks `Continue with SAML SSO` on Formbricks. 2. **Configuration Retrieval via BoxyHQ:** Formbricks requests the SAML connection details from BoxyHQ Jackson. BoxyHQ securely stores and manages the IdP configuration, including endpoints, certificates, and other metadata. @@ -50,7 +50,7 @@ sequenceDiagram Note over FB,BHQ: (Setup phase, done beforehand)
1. Admin configures SAML metadata in Formbricks
2. BoxyHQ stores & manages SAML connection details - U->>FB: Clicks “Sign in with SAML” + U->>FB: Clicks “Continue with SAML SSO" FB->>BHQ: Request SAML connection details BHQ->>FB: Returns SAML configuration (IdP info) FB->>OK: Redirect user to Okta (SAML Auth Request) @@ -67,10 +67,14 @@ sequenceDiagram To configure SAML SSO in Formbricks, follow these steps: -1. **Database Setup:** Configure a dedicated database for SAML by setting the `SAML_DATABASE_URL` environment variable (e.g., `postgresql://postgres:@localhost:5432/formbricks-saml`). If you're using a self-signed certificate for Postgres, include the `sslmode=no-verify` parameter. -2. **Admin Configuration:** Define the SAML administrators by setting `SAML_ADMINS` as a comma-separated list of admin emails. -3. **IdP Application:** Create a SAML application in your IdP by following your provider's instructions([SAML Setup](/development/guides/auth-and-provision/setup-saml-with-identity-providers)) -4. **User Provisioning:** Provision users in your IdP and configure access to the IdP SAML app for all your users (who need access to Formbricks). -5. **Metadata:** Keep the XML metadata from your IdP handy for the next step. -6. **Metadata Upload:** Log in with one of the SAML admin accounts and navigate to **Organization Settings -> Single Sign-On** in Formbricks. Paste the XML metadata from your IdP into the SAML configuration section. -7. **Finalize Setup:** Save your configuration. Provisioned users can now use SAML SSO to access Formbricks. +1. **Database Setup:** Configure a dedicated database for SAML by setting the `SAML_DATABASE_URL` environment variable in your `docker-compose.yml` file (e.g., `postgres://postgres:postgres@postgres:5432/formbricks-saml`). If you're using a self-signed certificate for Postgres, include the `sslmode=disable` parameter. +2. **IdP Application:** Create a SAML application in your IdP by following your provider's instructions([SAML Setup](/development/guides/auth-and-provision/setup-saml-with-identity-providers)) +3. **User Provisioning:** Provision users in your IdP and configure access to the IdP SAML app for all your users (who need access to Formbricks). +4. **Metadata:** Keep the XML metadata from your IdP handy for the next step. +5. **Metadata Setup:** Create a file called `connection.xml` in your self-hosted Formbricks instance's `formbricks/saml-connection` directory and paste the XML metadata from your IdP into it. Please create the directory if it doesn't exist. Your metadata file should start with a tag like this: `<...>` or ``. Please remove any extra text from the metadata. +6. **Restart Formbricks:** Restart Formbricks to apply the changes. You can do this by running `docker compose down` and then `docker compose up -d`. + + + We don't support multiple SAML connections yet. You can only have one SAML connection at a time. If you + change the `connection.xml` file, your existing SAML connection will be overwritten. + diff --git a/docs/self-hosting/configuration/environment-variables.mdx b/docs/self-hosting/configuration/environment-variables.mdx index e4658819bd..be9ab9a783 100644 --- a/docs/self-hosting/configuration/environment-variables.mdx +++ b/docs/self-hosting/configuration/environment-variables.mdx @@ -22,6 +22,7 @@ These variables are present inside your machine’s docker-compose file. Restart | S3_REGION | Region for S3. | optional | (resolved by the AWS SDK) | | S3_BUCKET_NAME | S3 bucket name for data storage. Formbricks enables S3 storage when this is set. | optional (required if S3 is enabled) | | | S3_ENDPOINT_URL | Endpoint for S3. | optional | (resolved by the AWS SDK) | +| SAML_DATABASE_URL | Database URL for SAML. | optional | postgres://postgres:@localhost:5432/formbricks-saml | | PRIVACY_URL | URL for privacy policy. | optional | | | TERMS_URL | URL for terms of service. | optional | | | IMPRINT_URL | URL for imprint. | optional | | @@ -60,4 +61,3 @@ These variables are present inside your machine’s docker-compose file. Restart | CUSTOM_CACHE_DISABLED | Disables custom cache handler if set to 1 (required for deployment on Vercel) | optional | | Note: If you want to configure something that is not possible via above, please open an issue on our GitHub repo here or reach out to us on Github Discussions and we’ll try our best to work out a solution with you. - diff --git a/docs/xm-and-surveys/enterprise-features/saml-sso.mdx b/docs/xm-and-surveys/enterprise-features/saml-sso.mdx index 51eb9f4028..1f929f7bbc 100644 --- a/docs/xm-and-surveys/enterprise-features/saml-sso.mdx +++ b/docs/xm-and-surveys/enterprise-features/saml-sso.mdx @@ -13,30 +13,31 @@ Formbricks supports Security Assertion Markup Language (SAML) SSO. We prioritize ### Setting up SAML login - - Follow the instructions here - [SAML Setup](/development/guides/auth-and-provision/setup-saml-with-identity-providers) + + Follow the instructions here - [SAML + Setup](/development/guides/auth-and-provision/setup-saml-with-identity-providers) - - Ensure that all users who need access to Formbricks have access to the IdP SAML - app. + + Ensure that all users who need access to Formbricks have access to the IdP SAML app. - + Keep the XML metadata from your IdP accessible, as you will need it later. - - Visit `environments//settings/sso`. - + + Set the `SAML_DATABASE_URL` environment variable in your `.env` file to a dedicated database for + SAML(e.g., `postgresql://postgres:@localhost:5432/formbricks-saml`). If you're using a self-signed + certificate for Postgres, include the `sslmode=disable` parameter. - - Click on the `Configure` button for `SSO with SAML`. - + + Create a file called `connection.xml` in the `apps/web/saml-connection` directory and paste the XML + metadata from your IdP into it. Please create the directory if it doesn't exist. Your metadata file should start with a tag like this: `<...>` or ``. Please remove any extra text from the metadata. - - In the SAML configuration section, copy and paste the XML metadata from step - 3 and click on Save. - - - - Once setup is complete, provisioned users can log into Formbricks using SAML. + + Once setup is complete, please restart the Formbricks server and your users can log into Formbricks using SAML. + + + We don't support multiple SAML connections yet. You can only have one SAML connection at a time. If you + change the `connection.xml` file, your existing SAML connection will be overwritten. + diff --git a/docs/xm-and-surveys/surveys/website-app-surveys/actions.mdx b/docs/xm-and-surveys/surveys/website-app-surveys/actions.mdx index 50675261eb..f4d9095442 100644 --- a/docs/xm-and-surveys/surveys/website-app-surveys/actions.mdx +++ b/docs/xm-and-surveys/surveys/website-app-surveys/actions.mdx @@ -44,7 +44,7 @@ Formbricks offers an intuitive No-Code interface that allows you to configure ac - ![Action overview on Formbricks Open Source Survey Solution](/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.png "Action overview on Formbricks Open Source Survey Solution") + ![Action overview on Formbricks Open Source Survey Solution](/images/xm-and-surveys/surveys/website-app-surveys/actions/actions-view.webp "Action overview on Formbricks Open Source Survey Solution") @@ -55,7 +55,7 @@ Formbricks offers an intuitive No-Code interface that allows you to configure ac There are four types of No-Code actions: ### **1. Click Action** -![Add click action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.png "Add click action to open source in app survey") +![Add click action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/click-action.webp "Add click action to open source in app survey") A Click Action is triggered when a user clicks on a specific element within your application. You can define the element's inner text, CSS selector or both to trigger the survey. @@ -66,17 +66,17 @@ A Click Action is triggered when a user clicks on a specific element within your * **Both**: Only if both is true, the action is triggered ### **2. Page View Action** -![Add page view action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.png "Add page view action to open source in app survey") +![Add page view action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/page-view.webp "Add page view action to open source in app survey") This action is triggered when a user visits a page within your application. ### **3. Exit Intent Action** -![Add exit intent action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.png "Add exit intent action to open source in app survey") +![Add exit intent action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/exit-intent.webp "Add exit intent action to open source in app survey") This action is triggered when a user is about to leave your application. It helps capture user feedback before they exit, providing valuable insights into user experiences and potential improvements. ### **4. 50% Scroll Action** -![Add 50% scroll action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.png "Add 50% scroll action to open source in app survey") +![Add 50% scroll action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/scroll.webp "Add 50% scroll action to open source in app survey") This action is triggered when a user scrolls through 50% of a page within your application. It helps capture user feedback at a specific point in their journey, enabling you to gather insights based on user interactions. @@ -108,7 +108,7 @@ For more granular control, you can implement actions directly in your code: First, add the action via the Formbricks web interface to make it available for survey configuration: - ![Add a code action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.png "Add a code action to open source in app survey") + ![Add a code action to open source in app survey](/images/xm-and-surveys/surveys/website-app-surveys/actions/code-action.webp "Add a code action to open source in app survey") diff --git a/docs/xm-and-surveys/surveys/website-app-surveys/advanced-targeting.mdx b/docs/xm-and-surveys/surveys/website-app-surveys/advanced-targeting.mdx index 3feb47b351..963ccb46a2 100644 --- a/docs/xm-and-surveys/surveys/website-app-surveys/advanced-targeting.mdx +++ b/docs/xm-and-surveys/surveys/website-app-surveys/advanced-targeting.mdx @@ -24,7 +24,7 @@ Advanced Targeting helps you achieve a number of goals: To get started, go to the Contacts tab and create a new Segment: - ![Create a new segment](/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.png "Create a new segment") + ![Create a new segment](/images/xm-and-surveys/surveys/website-app-surveys/targeting/contacts.webp "Create a new segment") @@ -35,11 +35,11 @@ Advanced Targeting helps you achieve a number of goals: Create a new survey and go to Settings to change it to Website & App survey: - ![Create a new segment of type in-app](/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.png "Create a new segment") + ![Create a new segment of type in-app](/images/xm-and-surveys/surveys/website-app-surveys/targeting/survey-type.webp "Create a new segment") - ![Choose Segment in Targeting options](/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.png "Choose Segment in Targeting options") + ![Choose Segment in Targeting options](/images/xm-and-surveys/surveys/website-app-surveys/targeting/target-audience.webp "Choose Segment in Targeting options") @@ -52,16 +52,16 @@ There are three means to move Contacts in or out of Segments: **Attributes**, ot 1. **Attributes**: If the value of a specific attribute matches, the user becomes part of the Segment. - ![Attribute filter](/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.png "Attribute filter") + ![Attribute filter](/images/xm-and-surveys/surveys/website-app-surveys/targeting/attribute-filter.webp "Attribute filter") 2. **Segments**: You can nest Segments meaning that if a user is or is not part of another Segment, they can be included or excluded - ![Segments filter](/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.png "Segments filter") + ![Segments filter](/images/xm-and-surveys/surveys/website-app-surveys/targeting/segments-filter.webp "Segments filter") 3. **Devices**: If a user uses a Phone or Desktop, you can include or exclude them - ![Devices filter](/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.png "Devices filter") + ![Devices filter](/images/xm-and-surveys/surveys/website-app-surveys/targeting/device-filter.webp "Devices filter") 4. **Filter Groups:** You can group any of the above conditions in group and connect them logically with `AND` or `OR`. This allows for maximum granularity. \ No newline at end of file diff --git a/docs/xm-and-surveys/surveys/website-app-surveys/show-survey-to-percent-of-users.mdx b/docs/xm-and-surveys/surveys/website-app-surveys/show-survey-to-percent-of-users.mdx index 2987e98eff..dd9d5afa7d 100644 --- a/docs/xm-and-surveys/surveys/website-app-surveys/show-survey-to-percent-of-users.mdx +++ b/docs/xm-and-surveys/surveys/website-app-surveys/show-survey-to-percent-of-users.mdx @@ -24,7 +24,7 @@ To target specific segments of your audience or manage survey exposure, Formbric Enter the desired percentage (from 0.01% to 100%) of users to whom the survey will be shown - ![Set percentage](/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.png "Set percentage") + ![Set percentage](/images/xm-and-surveys/surveys/website-app-surveys/targeting/percentage.webp "Set percentage") diff --git a/packages/database/migration/20250224093617_adds_saml_identity_provider/migration.sql b/packages/database/migration/20250224093617_adds_saml_identity_provider/migration.sql new file mode 100644 index 0000000000..a124bbd105 --- /dev/null +++ b/packages/database/migration/20250224093617_adds_saml_identity_provider/migration.sql @@ -0,0 +1,5 @@ +-- AlterEnum +ALTER TYPE "IdentityProvider" ADD VALUE 'saml'; + +-- AlterTable +ALTER TABLE "Response" ALTER COLUMN "updated_at" SET DEFAULT CURRENT_TIMESTAMP; diff --git a/packages/database/package.json b/packages/database/package.json index 6959785fa3..2a3bbeb157 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -10,9 +10,11 @@ "clean": "rimraf .turbo node_modules", "db:migrate:deploy": "env DATABASE_URL=\"${MIGRATE_DATABASE_URL:-$DATABASE_URL}\" tsx ./src/scripts/apply-migrations.ts", "db:migrate:dev": "dotenv -e ../../.env -- sh -c \"pnpm prisma generate && tsx ./src/scripts/apply-migrations.ts\"", + "db:create-saml-database:deploy": "env SAML_DATABASE_URL=\"${SAML_DATABASE_URL}\" tsx ./src/scripts/create-saml-database.ts", + "db:create-saml-database:dev": "dotenv -e ../../.env -- tsx ./src/scripts/create-saml-database.ts", "db:push": "prisma db push --accept-data-loss", "db:up": "docker compose up -d", - "db:setup": "pnpm db:up && pnpm db:migrate:dev", + "db:setup": "pnpm db:up && pnpm db:migrate:dev && pnpm db:create-saml-database:dev", "db:start": "pnpm db:setup", "db:down": "docker compose down", "format": "prisma format", diff --git a/packages/database/schema.prisma b/packages/database/schema.prisma index d9781e2809..d27fb82741 100644 --- a/packages/database/schema.prisma +++ b/packages/database/schema.prisma @@ -737,6 +737,7 @@ enum IdentityProvider { google azuread openid + saml } /// Stores third-party authentication account information. diff --git a/packages/database/src/scripts/create-saml-database.ts b/packages/database/src/scripts/create-saml-database.ts new file mode 100644 index 0000000000..cc1d7de99e --- /dev/null +++ b/packages/database/src/scripts/create-saml-database.ts @@ -0,0 +1,50 @@ +import { PrismaClient } from "@prisma/client"; + +const createSamlDatabase = async (): Promise => { + const samlDatabaseUrl = process.env.SAML_DATABASE_URL; + + if (!samlDatabaseUrl) { + return; + } + + const urlRegex = + /^(?postgresql|postgres):\/\/(?[^:]+):(?[^@]+)@(?[^:/]+):(?\d+)\/(?[^?]+)(?\?(?.*))?$/; + const urlMatch = urlRegex.exec(samlDatabaseUrl); + const dbName = urlMatch?.groups?.database; + + if (!dbName) { + return; + } + + // Create a Prisma client to connect to the default database + const prisma = new PrismaClient(); + + try { + // Check if the database exists + const result = await prisma.$queryRaw` + SELECT 1 FROM pg_database WHERE datname = ${dbName} + `; + + // If the database exists, the query will return a result + if (Array.isArray(result) && result.length > 0) { + return; + } + + await prisma.$executeRawUnsafe(`CREATE DATABASE "${dbName}"`); + + console.log(`Database '${dbName}' created successfully.`); + } catch (error) { + console.error(`Error creating database '${dbName}':`, error); + return; + } finally { + await prisma.$disconnect(); + } +}; + +createSamlDatabase() + .then(() => { + process.exit(0); + }) + .catch((error: unknown) => { + console.error("Error creating SAML database:", error); + }); diff --git a/packages/lib/constants.ts b/packages/lib/constants.ts index ea2794b1a4..3e6cdcde7d 100644 --- a/packages/lib/constants.ts +++ b/packages/lib/constants.ts @@ -30,6 +30,8 @@ export const AZURE_OAUTH_ENABLED = env.AZUREAD_CLIENT_ID && env.AZUREAD_CLIENT_SECRET && env.AZUREAD_TENANT_ID ? true : false; export const OIDC_OAUTH_ENABLED = env.OIDC_CLIENT_ID && env.OIDC_CLIENT_SECRET && env.OIDC_ISSUER ? true : false; +export const SAML_OAUTH_ENABLED = env.SAML_DATABASE_URL ? true : false; +export const SAML_XML_DIR = "./saml-connection"; export const GITHUB_ID = env.GITHUB_ID; export const GITHUB_SECRET = env.GITHUB_SECRET; @@ -46,6 +48,12 @@ export const OIDC_ISSUER = env.OIDC_ISSUER; export const OIDC_DISPLAY_NAME = env.OIDC_DISPLAY_NAME; export const OIDC_SIGNING_ALGORITHM = env.OIDC_SIGNING_ALGORITHM; +export const SAML_DATABASE_URL = env.SAML_DATABASE_URL; +export const SAML_TENANT = "formbricks.com"; +export const SAML_PRODUCT = "formbricks"; +export const SAML_AUDIENCE = "https://saml.formbricks.com"; +export const SAML_PATH = "/api/auth/saml/callback"; + export const SIGNUP_ENABLED = env.SIGNUP_DISABLED !== "1"; export const EMAIL_AUTH_ENABLED = env.EMAIL_AUTH_DISABLED !== "1"; export const INVITE_DISABLED = env.INVITE_DISABLED === "1"; diff --git a/packages/lib/env.ts b/packages/lib/env.ts index 2b85340d9f..d87e546f69 100644 --- a/packages/lib/env.ts +++ b/packages/lib/env.ts @@ -73,6 +73,7 @@ export const env = createEnv({ S3_SECRET_KEY: z.string().optional(), S3_ENDPOINT_URL: z.string().optional(), S3_FORCE_PATH_STYLE: z.enum(["1", "0"]).optional(), + SAML_DATABASE_URL: z.string().optional(), SIGNUP_DISABLED: z.enum(["1", "0"]).optional(), SLACK_CLIENT_ID: z.string().optional(), SLACK_CLIENT_SECRET: z.string().optional(), @@ -196,6 +197,7 @@ export const env = createEnv({ S3_SECRET_KEY: process.env.S3_SECRET_KEY, S3_ENDPOINT_URL: process.env.S3_ENDPOINT_URL, S3_FORCE_PATH_STYLE: process.env.S3_FORCE_PATH_STYLE, + SAML_DATABASE_URL: process.env.SAML_DATABASE_URL, SIGNUP_DISABLED: process.env.SIGNUP_DISABLED, SLACK_CLIENT_ID: process.env.SLACK_CLIENT_ID, SLACK_CLIENT_SECRET: process.env.SLACK_CLIENT_SECRET, diff --git a/packages/lib/messages/de-DE.json b/packages/lib/messages/de-DE.json index 2d6e45ff76..7964d76c34 100644 --- a/packages/lib/messages/de-DE.json +++ b/packages/lib/messages/de-DE.json @@ -6,6 +6,7 @@ "continue_with_google": "Login mit Google", "continue_with_oidc": "Weiter mit {oidcDisplayName}", "continue_with_openid": "Login mit OpenID", + "continue_with_saml": "Login mit SAML SSO", "forgot-password": { "back_to_login": "Zurück zum Login", "email-sent": { @@ -52,6 +53,7 @@ "new_to_formbricks": "Neu bei Formbricks?", "use_a_backup_code": "Einen Backup-Code verwenden" }, + "saml_connection_error": "Etwas ist schiefgelaufen. Bitte überprüfe die App-Konsole für weitere Details.", "signup": { "captcha_failed": "reCAPTCHA fehlgeschlagen", "have_an_account": "Hast Du ein Konto?", diff --git a/packages/lib/messages/en-US.json b/packages/lib/messages/en-US.json index f867e8545e..a13737b455 100644 --- a/packages/lib/messages/en-US.json +++ b/packages/lib/messages/en-US.json @@ -6,6 +6,7 @@ "continue_with_google": "Continue with Google", "continue_with_oidc": "Continue with {oidcDisplayName}", "continue_with_openid": "Continue with OpenID", + "continue_with_saml": "Continue with SAML SSO", "forgot-password": { "back_to_login": "Back to login", "email-sent": { @@ -52,6 +53,7 @@ "new_to_formbricks": "New to Formbricks?", "use_a_backup_code": "Use a backup code" }, + "saml_connection_error": "Something went wrong. Please check your app console for more details.", "signup": { "captcha_failed": "Captcha failed", "have_an_account": "Have an account?", diff --git a/packages/lib/messages/fr-FR.json b/packages/lib/messages/fr-FR.json index 26e3f1430b..242f4b6803 100644 --- a/packages/lib/messages/fr-FR.json +++ b/packages/lib/messages/fr-FR.json @@ -6,6 +6,7 @@ "continue_with_google": "Continuer avec Google", "continue_with_oidc": "Continuer avec {oidcDisplayName}", "continue_with_openid": "Continuer avec OpenID", + "continue_with_saml": "Continuer avec SAML SSO", "forgot-password": { "back_to_login": "Retour à la connexion", "email-sent": { @@ -52,6 +53,7 @@ "new_to_formbricks": "Nouveau sur Formbricks ?", "use_a_backup_code": "Utiliser un code de secours" }, + "saml_connection_error": "Quelque chose s'est mal passé. Veuillez vérifier la console de votre application pour plus de détails.", "signup": { "captcha_failed": "Captcha échoué", "have_an_account": "Avez-vous un compte ?", diff --git a/packages/lib/messages/pt-BR.json b/packages/lib/messages/pt-BR.json index 510909a717..cf828c4021 100644 --- a/packages/lib/messages/pt-BR.json +++ b/packages/lib/messages/pt-BR.json @@ -6,6 +6,7 @@ "continue_with_google": "Continuar com o Google", "continue_with_oidc": "Continuar com {oidcDisplayName}", "continue_with_openid": "Continuar com OpenID", + "continue_with_saml": "Continuar com SAML SSO", "forgot-password": { "back_to_login": "Voltar para o login", "email-sent": { @@ -52,6 +53,7 @@ "new_to_formbricks": "Novo no Formbricks?", "use_a_backup_code": "Usar um código de backup" }, + "saml_connection_error": "Algo deu errado. Por favor, verifica o console do app para mais detalhes.", "signup": { "captcha_failed": "reCAPTCHA falhou", "have_an_account": "Já tem uma conta?", diff --git a/packages/lib/messages/zh-Hant-TW.json b/packages/lib/messages/zh-Hant-TW.json index c2b1fe6e57..3b2083a0c2 100644 --- a/packages/lib/messages/zh-Hant-TW.json +++ b/packages/lib/messages/zh-Hant-TW.json @@ -6,6 +6,7 @@ "continue_with_google": "使用 Google 繼續", "continue_with_oidc": "使用 '{'oidcDisplayName'}' 繼續", "continue_with_openid": "使用 OpenID 繼續", + "continue_with_saml": "使用 SAML SSO 繼續", "forgot-password": { "back_to_login": "返回登入", "email-sent": { @@ -52,6 +53,7 @@ "new_to_formbricks": "初次使用 Formbricks?", "use_a_backup_code": "使用備份碼" }, + "saml_connection_error": "發生錯誤。請檢查您的 app 主控台以取得更多詳細資料。", "signup": { "captcha_failed": "驗證碼失敗", "have_an_account": "已有帳戶?", diff --git a/packages/types/user.ts b/packages/types/user.ts index dcca944d45..f3b920959d 100644 --- a/packages/types/user.ts +++ b/packages/types/user.ts @@ -41,6 +41,8 @@ export type TUserPassword = z.infer; export type TUserNotificationSettings = z.infer; +const ZUserIdentityProvider = z.enum(["email", "google", "github", "azuread", "openid", "saml"]); + export const ZUser = z.object({ id: z.string(), name: ZUserName, @@ -48,7 +50,7 @@ export const ZUser = z.object({ emailVerified: z.date().nullable(), imageUrl: z.string().url().nullable(), twoFactorEnabled: z.boolean(), - identityProvider: z.enum(["email", "google", "github", "azuread", "openid"]), + identityProvider: ZUserIdentityProvider, createdAt: z.date(), updatedAt: z.date(), role: ZRole.nullable(), @@ -80,7 +82,7 @@ export const ZUserCreateInput = z.object({ emailVerified: z.date().optional(), role: ZRole.optional(), objective: ZUserObjective.nullish(), - identityProvider: z.enum(["email", "google", "github", "azuread", "openid"]).optional(), + identityProvider: ZUserIdentityProvider.optional(), identityProviderAccountId: z.string().optional(), locale: ZUserLocale.optional(), }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc1f6d37b7..326fca1e87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,6 +183,9 @@ importers: '@ai-sdk/azure': specifier: 1.1.9 version: 1.1.9(zod@3.24.1) + '@boxyhq/saml-jackson': + specifier: 1.37.1 + version: 1.37.1(aws-crt@1.25.3)(socks@2.8.4)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) '@dnd-kit/core': specifier: 6.3.1 version: 6.3.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -338,7 +341,7 @@ importers: version: 6.0.1(react@19.0.0) '@vercel/functions': specifier: 1.5.2 - version: 1.5.2(@aws-sdk/credential-provider-web-identity@3.734.0) + version: 1.5.2(@aws-sdk/credential-provider-web-identity@3.734.0(aws-crt@1.25.3)) '@vercel/og': specifier: 0.6.4 version: 0.6.4 @@ -1071,6 +1074,14 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + '@aws-sdk/client-cognito-identity@3.741.0': + resolution: {integrity: sha512-zd1HMnBi/hSGEBHf1qEbjAZSynDWv6XUDW8dFLHaXJCFZiTJ0YLTxxKTGLHmqg969OOHLC7YSGoIiaF1Cpu9Mg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-dynamodb@3.741.0': + resolution: {integrity: sha512-D7/9QLyPWab5LM0X3R/0qTbGvUHY0Z+VAmQuxwdcGSo3497VwkRi97nm3jVRgjXLQibaPq05AXtugSjIj1/OJA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/client-s3@3.741.0': resolution: {integrity: sha512-sZvdbRZ+E9/GcOMUOkZvYvob95N6c9LdzDneXHFASA7OIaEOQxQT1Arimz7JpEhfq/h9K2/j7wNO4jh4x80bmA==} engines: {node: '>=18.0.0'} @@ -1083,6 +1094,10 @@ packages: resolution: {integrity: sha512-SxnDqf3vobdm50OLyAKfqZetv6zzwnSqwIwd3jrbopxxHKqNIM/I0xcYjD6Tn+mPig+u7iRKb9q3QnEooFTlmg==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-cognito-identity@3.741.0': + resolution: {integrity: sha512-EoEO1hxe9WToWvrknnHHIb/N5HQoIj53JAbdRlhDRjedKr7nQu8ELVGn4s0UkXuZc1CAUMlvwdiZpr3NxhcofA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.734.0': resolution: {integrity: sha512-gtRkzYTGafnm1FPpiNO8VBmJrYMoxhDlGPYDVcijzx3DlF8dhWnowuSBCxLSi+MJMx5hvwrX2A+e/q0QAeHqmw==} engines: {node: '>=18.0.0'} @@ -1111,10 +1126,22 @@ packages: resolution: {integrity: sha512-t4OSOerc+ppK541/Iyn1AS40+2vT/qE+MFMotFkhCgCJbApeRF2ozEdnDN6tGmnl4ybcUuxnp9JWLjwDVlR/4g==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-providers@3.741.0': + resolution: {integrity: sha512-X0R46k09GtfOaCwZei6atf5gxFhwuZl7p9T5/LWTNo7rUiAWPLpnxwfDfymHQqTH0u4ShZYCRDHEoOk06wKm6g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/endpoint-cache@3.723.0': + resolution: {integrity: sha512-2+a4WXRc+07uiPR+zJiPGKSOWaNJQNqitkks+6Hhm/haTLJqNVTgY2OWDh2PXvwMNpKB+AlGdhE65Oy6NzUgXg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.734.0': resolution: {integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-endpoint-discovery@3.734.0': + resolution: {integrity: sha512-hE3x9Sbqy64g/lcFIq7BF9IS1tSOyfBCyHf1xBgevWeFIDTWh647URuCNWoEwtw4HMEhO2MDUQcKf1PFh1dNDA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-expect-continue@3.734.0': resolution: {integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==} engines: {node: '>=18.0.0'} @@ -1183,6 +1210,12 @@ packages: resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} engines: {node: '>=18.0.0'} + '@aws-sdk/util-dynamodb@3.741.0': + resolution: {integrity: sha512-UWLz1COTE+mj0pQr/AvRoaG/ADIK0Gym8ds7sR7xPZvCGqeoEl/rGQbCd64/B2AYPwe76OYtdvuu/0/M7y27vw==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@aws-sdk/client-dynamodb': ^3.741.0 + '@aws-sdk/util-endpoints@3.734.0': resolution: {integrity: sha512-w2+/E88NUbqql6uCVAsmMxDQKu7vsKV0KqhlQb0lL+RCq4zy07yXYptVNs13qrnuTfyX7uPXkXrlugvK9R1Ucg==} engines: {node: '>=18.0.0'} @@ -1258,6 +1291,14 @@ packages: resolution: {integrity: sha512-ANpO1iAvcZmpD4QY7/kaE/P2n66pRXsDp3nMUC6Ow3c9KfXOZF7qMU9VgqPw8m7adP7TVIbVyrCEmD9cth3KQQ==} engines: {node: '>=18.0.0'} + '@azure/keyvault-common@2.0.0': + resolution: {integrity: sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==} + engines: {node: '>=18.0.0'} + + '@azure/keyvault-keys@4.9.0': + resolution: {integrity: sha512-ZBP07+K4Pj3kS4TF4XdkqFcspWwBHry3vJSOFM5k5ZABvf7JfiMonvaFk2nBF6xjlEbMpz5PE1g45iTMme0raQ==} + engines: {node: '>=18.0.0'} + '@azure/logger@1.1.4': resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} engines: {node: '>=18.0.0'} @@ -2095,6 +2136,19 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@boxyhq/error-code-mnemonic@0.1.1': + resolution: {integrity: sha512-NmO111OG8GQDE8W/+uSREb67YSqnY2N/tHykGeFoIZc9Leher+lW+jN4U1OXzlc66hwB8yO7WRu2cbYsAKsi9g==} + + '@boxyhq/metrics@0.2.9': + resolution: {integrity: sha512-0TP7jDX8pMy/YrD+0Gy9QI4ZAYh94s4VsYoqSfKJiL06i79hlso+3qC399zLyaB59442FQAV6+x36ZEb9GTXng==} + + '@boxyhq/saml-jackson@1.37.1': + resolution: {integrity: sha512-Bceg8NrhatEvZLIrDj2ALsSMW6/pvURASmdqK/HdpKqOfGKrId8imWrbnWcj0laEqAltc/WjYsI4NeLwpuOytw==} + engines: {node: '>=16', npm: '>=8'} + + '@boxyhq/saml20@1.7.1': + resolution: {integrity: sha512-WOKJKcXhnI69d7qiDgCRTfXC6BFDWUq9qm9av23JAYXj+RN0MYaNVVZo4FHyJ4f0b/SaO97vLub/fjwC56Cb/w==} + '@calcom/embed-core@1.5.1': resolution: {integrity: sha512-wykzh1GKj5xhGxDJeCRJ7OulAgn9GVMYD/mmOBbvn06c3m9Lqoqn09E5kJ+DY+aokUncQPcstNsdiHsURjMuVw==} @@ -2937,6 +2991,22 @@ packages: '@formkit/auto-animate@0.8.2': resolution: {integrity: sha512-SwPWfeRa5veb1hOIBMdzI+73te5puUBHmqqaF1Bu7FjvxlYSz/kJcZKSa9Cg60zL0uRNeJL2SbRxV6Jp6Q1nFQ==} + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@googleapis/admin@23.0.0': + resolution: {integrity: sha512-6UFpKC6A7gPEysbIhJVNPeFc91jt9FGdZLndKLAQjqr6j1k4zOBTf5OMDmmket+h74spuiz18WO/lCTJvSGYNQ==} + engines: {node: '>=12.0.0'} + + '@grpc/grpc-js@1.11.3': + resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -3149,6 +3219,12 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-joda/core@5.6.4': + resolution: {integrity: sha512-ChdLDTYMEoYoiKZMT90wZMEdGvZ2/QZMnhvjvEqeO5oLoxUfSiLzfe6Lhf3g88+MhZ+utbAu7PAxX1sZkLo5pA==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@json2csv/formatters@7.0.6': resolution: {integrity: sha512-hjIk1H1TR4ydU5ntIENEPgoMGW+Q7mJ+537sDFDbsk+Y3EPl2i4NfFVjw0NJRgT+ihm8X30M67mA8AS6jPidSA==} @@ -3229,6 +3305,18 @@ packages: peerDependencies: yjs: '>=13.5.22' + '@libsql/hrana-client@0.4.4': + resolution: {integrity: sha512-BevUg0UBRLs5AEqn0fjrMcl49xCtwuFavgK4MzCb3PTtxpEbQ24oGXctspN9drBiUVmqSZr7go887aiLLzSO3A==} + + '@libsql/isomorphic-fetch@0.1.12': + resolution: {integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==} + + '@libsql/isomorphic-ws@0.1.5': + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + + '@libsql/sqlite3@0.3.1': + resolution: {integrity: sha512-KOOBUuKDjqzteM6QA0W1vnZDfOt5MNMyo2yr4TaH1RcCd7Fsts4lpzfty6FmE1d6QDrRxjRq2ZciO6VdQ9ZF3A==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -3260,6 +3348,9 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} + '@neshca/cache-handler@1.9.0': resolution: {integrity: sha512-dh0x4pdjDKvPRfZF5DZb8TtOUkbBfeTodOUdQsHDuv0oiuqQ3p7GLx38f6bPn8Sa4he8HsWo+rM4S20ZRqr7pA==} peerDependencies: @@ -3343,14 +3434,26 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + '@npmcli/fs@3.1.1': resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + '@opentelemetry/api-logs@0.52.1': resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} engines: {node: '>=14'} + '@opentelemetry/api-logs@0.53.0': + resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} + engines: {node: '>=14'} + '@opentelemetry/api-logs@0.56.0': resolution: {integrity: sha512-Wr39+94UNNG3Ei9nv3pHd4AJ63gq5nSemMRpCd8fPwDL9rN3vK26lzxfH27mw16XzOSO+TpyQwBAMaLxaPWG0g==} engines: {node: '>=14'} @@ -3369,6 +3472,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.26.0': + resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@1.29.0': resolution: {integrity: sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA==} engines: {node: '>=14'} @@ -3381,6 +3490,18 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/exporter-metrics-otlp-grpc@0.53.0': + resolution: {integrity: sha512-2wjAccaG4yBxjfPqDeeXEYymwo1OYybUmBxUutDPeu0ColVkXyHIOxKSdHdn6vAn/v20m4w9E6SrSl4jtuZdiA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.53.0': + resolution: {integrity: sha512-nvZtOk23pZOrTW10Za2WPd9pk4tWDvL6ALlHRFfInpcTjtOgCrv+fQDxpzosa5PeXvYeFFUO5aYCTnwiCX4Dzg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/instrumentation-amqplib@0.45.0': resolution: {integrity: sha512-SlKLsOS65NGMIBG1Lh/hLrMDU9WzTUF25apnV6ZmWZB1bBmUwan7qrwwrTu1cL5LzJWCXOdZPuTaxP7pC9qxnQ==} engines: {node: '>=14'} @@ -3537,10 +3658,34 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 + '@opentelemetry/otlp-exporter-base@0.53.0': + resolution: {integrity: sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.53.0': + resolution: {integrity: sha512-F7RCN8VN+lzSa4fGjewit8Z5fEUpY/lmMVy5EWn2ZpbAabg3EE3sCLuTNfOiooNGnmvzimUPruoeqeko/5/TzQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-transformer@0.53.0': + resolution: {integrity: sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + '@opentelemetry/redis-common@0.36.2': resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} engines: {node: '>=14'} + '@opentelemetry/resources@1.26.0': + resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/resources@1.29.0': resolution: {integrity: sha512-s7mLXuHZE7RQr1wwweGcaRp3Q4UJJ0wazeGlc/N5/XSe6UyXfsh1UQGMADYeg7YwD+cEdMtU1yJAUXdnFzYzyQ==} engines: {node: '>=14'} @@ -3553,18 +3698,36 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-logs@0.53.0': + resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@opentelemetry/sdk-logs@0.56.0': resolution: {integrity: sha512-OS0WPBJF++R/cSl+terUjQH5PebloidB1Jbbecgg2rnCmQbTST9xsRes23bLfDQVRvmegmHqDh884h0aRdJyLw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' + '@opentelemetry/sdk-metrics@1.26.0': + resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-metrics@1.30.1': resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@1.26.0': + resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-trace-base@1.30.1': resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} engines: {node: '>=14'} @@ -3702,6 +3865,36 @@ packages: '@prisma/prisma-schema-wasm@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584': resolution: {integrity: sha512-JFdsnSgBPN8reDTLOI9Vh/6ccCb2aD1LbY/LWQnkcIgNo6IdpzvuM+qRVbBuA6IZP2SdqQI8Lu6RL2P8EFBQUA==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -5113,6 +5306,9 @@ packages: resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} engines: {node: '>=18.0.0'} + '@sqltools/formatter@1.2.5': + resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + '@storybook/addon-a11y@8.4.7': resolution: {integrity: sha512-GpUvXp6n25U1ZSv+hmDC+05BEqxWdlWjQTb/GaboRXZQeMBlze6zckpVb66spjmmtQAIISo0eZxX1+mGcVR7lA==} peerDependencies: @@ -5350,6 +5546,9 @@ packages: resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} engines: {node: '>=12'} + '@tediousjs/connection-string@0.5.0': + resolution: {integrity: sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==} + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -5388,6 +5587,10 @@ packages: '@tolgee/web@6.0.1': resolution: {integrity: sha512-chTq5v4LnGGRjtQVohUewR7jGIyALa1yOLxW5iYPxdbsFGlV1v+SR7nJy60+6xJrXrBOaMNYUR9Ps4dvbXuKsw==} + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + '@trivago/prettier-plugin-sort-imports@5.2.0': resolution: {integrity: sha512-yEIJ7xMKYQwyNRjxSdi4Gs37iszikAjxfky+3hu9bn24u8eHLJNDMAoOTyowp8p6EpSl8IQMdkfBx+WnJTttsw==} engines: {node: '>18.12'} @@ -5524,6 +5727,9 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} @@ -5571,6 +5777,9 @@ packages: '@types/react@19.0.1': resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + '@types/readable-stream@4.0.18': + resolution: {integrity: sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==} + '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} @@ -5604,6 +5813,12 @@ packages: '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@types/ws@8.5.14': resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} @@ -6027,6 +6242,10 @@ packages: '@wojtekmaj/date-utils@1.5.1': resolution: {integrity: sha512-+i7+JmNiE/3c9FKxzWFi2IjRJ+KzZl1QPu6QNrsgaa2MuBgXvUy4gA1TVzf/JMdIIloB76xSKikTWuyYAIVLww==} + '@xmldom/is-dom-node@1.0.1': + resolution: {integrity: sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q==} + engines: {node: '>= 16'} + '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} @@ -6036,6 +6255,10 @@ packages: resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} + '@xmldom/xmldom@0.9.7': + resolution: {integrity: sha512-syvR8iIJjpTZ/stv7l89UAViwGFh6lbheeOaqSxkYx9YNmIVvPTRH+CT/fpykFtUx5N+8eSMDRvggF9J8GEPzQ==} + engines: {node: '>=14.6'} + '@xobotyi/scrollbar-width@1.9.5': resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} @@ -6048,6 +6271,9 @@ packages: '@zeit/schemas@2.36.0': resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -6087,6 +6313,10 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -6209,12 +6439,19 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + app-root-path@3.1.0: + resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} + engines: {node: '>= 6.0.0'} + appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} application-config-path@0.1.1: resolution: {integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==} + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} @@ -6230,6 +6467,11 @@ packages: resolution: {integrity: sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==} engines: {node: '>= 10'} + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -6352,6 +6594,10 @@ packages: aws-crt@1.25.3: resolution: {integrity: sha512-MWV2Yy08xxAZqMJiFE1ZwSrVNq2Hy54SK4ooUx2Ts6DlDzdAizSfgoEKkh7ifyo7j5RVXu3924zAPjC8FBLiSg==} + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} + axe-core@4.10.2: resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} @@ -6477,9 +6723,15 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@6.0.19: + resolution: {integrity: sha512-4Ay3A3oDfGg3GGirhl4s62ebtnk0pJZA5mLp672MPKOQXsWvXjEF4dqdXySjJIs7b9OVr/O8aOo0Lm+xdjo2JA==} + bn.js@4.12.1: resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} @@ -6560,6 +6812,10 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bson@6.10.3: + resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} + engines: {node: '>=16.20.1'} + buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} @@ -6616,6 +6872,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + cacache@18.0.4: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -6746,6 +7006,9 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -6823,6 +7086,11 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -6845,6 +7113,9 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -6891,6 +7162,10 @@ packages: color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -6911,6 +7186,10 @@ packages: command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -6987,6 +7266,9 @@ packages: console-browserify@1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + constants-browserify@1.0.0: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} @@ -7205,6 +7487,10 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -7247,9 +7533,16 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -7463,6 +7756,9 @@ packages: eol@0.9.1: resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -7828,6 +8124,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} @@ -7992,6 +8292,9 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filesize@10.1.6: resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} engines: {node: '>= 10.4.0'} @@ -8162,6 +8465,11 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + gaxios@6.7.1: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} @@ -8170,6 +8478,9 @@ packages: resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} engines: {node: '>=14'} + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} @@ -8239,6 +8550,9 @@ packages: git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -8353,6 +8667,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + hash-base@3.0.5: resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} engines: {node: '>= 0.10'} @@ -8421,6 +8738,9 @@ packages: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -8451,10 +8771,17 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + http-proxy-agent@7.0.0: resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} engines: {node: '>= 14'} @@ -8466,6 +8793,10 @@ packages: https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + https-proxy-agent@5.0.0: + resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} + engines: {node: '>= 6'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -8489,6 +8820,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -8548,6 +8882,9 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -8579,6 +8916,10 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + ip-regex@2.1.0: resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} @@ -8704,6 +9045,9 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -8747,6 +9091,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -8957,6 +9304,9 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -8964,9 +9314,15 @@ packages: jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + js-md4@0.3.2: + resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} + js-sdsl@4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} @@ -8981,6 +9337,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} @@ -9274,6 +9633,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -9355,6 +9717,9 @@ packages: resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} hasBin: true + long@5.3.1: + resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -9379,6 +9744,14 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru.min@1.1.1: + resolution: {integrity: sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + lucide-react@0.468.0: resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==} peerDependencies: @@ -9424,6 +9797,10 @@ packages: make-event-props@1.6.2: resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -9506,6 +9883,9 @@ packages: memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} engines: {node: '>=10'} @@ -9759,6 +10139,10 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -9798,10 +10182,18 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} @@ -9810,6 +10202,10 @@ packages: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -9830,6 +10226,13 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + mixpanel@0.18.0: + resolution: {integrity: sha512-VyUoiLB/S/7abYYHGD5x0LijeuJCUabG8Hb+FvYU3Y99xHf1Qh+s4/pH9lt50fRitAHncWbU1FE01EknUfVVjQ==} + engines: {node: '>=10.0'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -9839,12 +10242,50 @@ packages: engines: {node: '>=10'} hasBin: true + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mnemonist@0.38.3: + resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} + module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} + + mongodb@6.13.0: + resolution: {integrity: sha512-KeESYR5TEaFxOuwRqkOm3XOsMqCSkdeDMjaW5u2nuKfX7rqaofp7JQGoi7sVqQcNJTKuveNbzZtWMstb8ABP6Q==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + motion-dom@11.18.1: resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} @@ -9872,6 +10313,11 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mssql@11.0.1: + resolution: {integrity: sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w==} + engines: {node: '>=18'} + hasBin: true + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -9879,9 +10325,17 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + mysql2@3.12.0: + resolution: {integrity: sha512-C8fWhVysZoH63tJbX8d10IAoYCyXy4fdRFz2Ihrt9jtPILYynFEKUUzpp1U7qxzDc3tMbotvaBH+sl6bFnGZiw==} + engines: {node: '>= 8.0'} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + nano-css@5.6.2: resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==} peerDependencies: @@ -9898,6 +10352,12 @@ packages: engines: {node: ^18 || >=20} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + native-duplexpair@1.0.0: + resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -9982,9 +10442,16 @@ packages: resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} engines: {node: '>=12.0.0'} + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} + engines: {node: '>=10'} + node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} @@ -10028,6 +10495,11 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} @@ -10049,6 +10521,11 @@ packages: resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} engines: {node: '>=6.0.0'} + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -10089,6 +10566,11 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -10101,6 +10583,9 @@ packages: nwsapi@2.2.16: resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + oauth4webapi@3.3.0: + resolution: {integrity: sha512-ZlozhPlFfobzh3hB72gnBFLjXpugl/dljz1fJSRdqaV2r3D5dmi5lg2QWI0LmUYuazmE+b5exsloEv6toUtw9g==} + oauth@0.9.15: resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} @@ -10156,6 +10641,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + obliterator@1.6.1: + resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} + oidc-token-hash@5.0.3: resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} engines: {node: ^10.13.0 || >=12.0.0} @@ -10212,6 +10700,9 @@ packages: openid-client@5.7.1: resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} + openid-client@6.1.7: + resolution: {integrity: sha512-JfY/KvQgOutmG2P+oVNKInE7zIh+im1MQOaO7g5CtNnTWMociA563WweiEMKfR9ry9XG3K2HGvj9wEqhCQkPMg==} + optional@0.1.4: resolution: {integrity: sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==} @@ -10333,6 +10824,15 @@ packages: resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} engines: {node: '>=10'} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} @@ -10414,10 +10914,21 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} + pg-pool@3.7.1: + resolution: {integrity: sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw==} + peerDependencies: + pg: '>=8.0' + pg-protocol@1.7.0: resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==} @@ -10425,6 +10936,18 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} + pg@8.13.1: + resolution: {integrity: sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -10616,6 +11139,11 @@ packages: preact@10.25.2: resolution: {integrity: sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -10762,6 +11290,18 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -10778,6 +11318,10 @@ packages: property-information@7.0.0: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -11080,6 +11624,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} @@ -11109,6 +11657,9 @@ packages: redis@4.7.0: resolution: {integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -11254,6 +11805,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -11402,6 +11957,9 @@ packages: resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==} engines: {node: '>= 0.8.0'} + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + serialize-error@2.1.0: resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} engines: {node: '>=0.10.0'} @@ -11510,6 +12068,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -11543,6 +12107,18 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} @@ -11580,6 +12156,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -11598,12 +12177,26 @@ packages: split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + ssf@0.11.2: resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} engines: {node: '>=0.8'} @@ -11612,6 +12205,10 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + stable-hash@0.0.4: resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} @@ -11878,6 +12475,9 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -11886,6 +12486,14 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} + engines: {node: '>=8.0.0'} + + tedious@18.6.1: + resolution: {integrity: sha512-9AvErXXQTd6l7TDd5EmM+nxbOGyhnmdbp/8c3pw+tjaiSXW9usME90ET/CRG1LN1Y9tPMtz/p83z4Q97B4DDpw==} + engines: {node: '>=18'} + temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} engines: {node: '>=4'} @@ -12170,6 +12778,9 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + turbo-darwin-64@2.3.3: resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} cpu: [x64] @@ -12262,6 +12873,64 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typeorm@0.3.20: + resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==} + engines: {node: '>=16.13.0'} + hasBin: true + peerDependencies: + '@google-cloud/spanner': ^5.18.0 + '@sap/hana-client': ^2.12.25 + better-sqlite3: ^7.1.2 || ^8.0.0 || ^9.0.0 + hdb-pool: ^0.1.6 + ioredis: ^5.0.4 + mongodb: ^5.8.0 + mssql: ^9.1.1 || ^10.0.1 + mysql2: ^2.2.5 || ^3.0.1 + oracledb: ^6.3.0 + pg: ^8.5.1 + pg-native: ^3.0.0 + pg-query-stream: ^4.0.0 + redis: ^3.1.1 || ^4.0.0 + sql.js: ^1.4.0 + sqlite3: ^5.0.3 + ts-node: ^10.7.0 + typeorm-aurora-data-api-driver: ^2.0.0 + peerDependenciesMeta: + '@google-cloud/spanner': + optional: true + '@sap/hana-client': + optional: true + better-sqlite3: + optional: true + hdb-pool: + optional: true + ioredis: + optional: true + mongodb: + optional: true + mssql: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + redis: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + ts-node: + optional: true + typeorm-aurora-data-api-driver: + optional: true + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -12323,10 +12992,16 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + unique-slug@4.0.0: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -12765,6 +13440,9 @@ packages: engines: {node: '>=8'} hasBin: true + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} @@ -12854,6 +13532,13 @@ packages: engines: {node: '>=0.8'} hasBin: true + xml-crypto@6.0.0: + resolution: {integrity: sha512-L3RgnkaDrHaYcCnoENv4Idzt1ZRj5U1z1BDH98QdDTQfssScx8adgxhd9qwyYo+E3fXbQZjEQH7aiXHLVgxGvw==} + engines: {node: '>=16'} + + xml-encryption@3.1.0: + resolution: {integrity: sha512-PV7qnYpoAMXbf1kvQkqMScLeQpjCMixddAKq9PtqVrho8HnYbBOWNfG0kA4R7zxQDo7w9kiYAyzS/ullAyO55Q==} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -12862,6 +13547,10 @@ packages: resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} engines: {node: '>=4.0.0'} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -12877,6 +13566,14 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xpath@0.0.32: + resolution: {integrity: sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==} + engines: {node: '>=0.6.0'} + + xpath@0.0.33: + resolution: {integrity: sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA==} + engines: {node: '>=0.6.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -12908,6 +13605,10 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -12916,6 +13617,10 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -13068,6 +13773,98 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 + '@aws-sdk/client-cognito-identity@3.741.0(aws-crt@1.25.3)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.734.0 + '@aws-sdk/credential-provider-node': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.734.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.734.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.734.0(aws-crt@1.25.3) + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.2 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.3 + '@smithy/middleware-retry': 4.0.4 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.2 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.3 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.4 + '@smithy/util-defaults-mode-node': 4.0.4 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-dynamodb@3.741.0(aws-crt@1.25.3)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.734.0 + '@aws-sdk/credential-provider-node': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/middleware-endpoint-discovery': 3.734.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.734.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.734.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.734.0(aws-crt@1.25.3) + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.2 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.3 + '@smithy/middleware-retry': 4.0.4 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.2 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.3 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.4 + '@smithy/util-defaults-mode-node': 4.0.4 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.2 + '@types/uuid': 9.0.8 + tslib: 2.8.1 + uuid: 9.0.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-s3@3.741.0(aws-crt@1.25.3)': dependencies: '@aws-crypto/sha1-browser': 5.2.0 @@ -13186,6 +13983,16 @@ snapshots: fast-xml-parser: 4.4.1 tslib: 2.8.1 + '@aws-sdk/credential-provider-cognito-identity@3.741.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/client-cognito-identity': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-env@3.734.0': dependencies: '@aws-sdk/core': 3.734.0 @@ -13275,6 +14082,33 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-providers@3.741.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/client-cognito-identity': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/core': 3.734.0 + '@aws-sdk/credential-provider-cognito-identity': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/credential-provider-env': 3.734.0 + '@aws-sdk/credential-provider-http': 3.734.0 + '@aws-sdk/credential-provider-ini': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/credential-provider-node': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/credential-provider-process': 3.734.0 + '@aws-sdk/credential-provider-sso': 3.734.0(aws-crt@1.25.3) + '@aws-sdk/credential-provider-web-identity': 3.734.0(aws-crt@1.25.3) + '@aws-sdk/nested-clients': 3.734.0(aws-crt@1.25.3) + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.2 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/endpoint-cache@3.723.0': + dependencies: + mnemonist: 0.38.3 + tslib: 2.8.1 + '@aws-sdk/middleware-bucket-endpoint@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13285,6 +14119,15 @@ snapshots: '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 + '@aws-sdk/middleware-endpoint-discovery@3.734.0': + dependencies: + '@aws-sdk/endpoint-cache': 3.723.0 + '@aws-sdk/types': 3.734.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@aws-sdk/middleware-expect-continue@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13473,6 +14316,11 @@ snapshots: dependencies: tslib: 2.8.1 + '@aws-sdk/util-dynamodb@3.741.0(@aws-sdk/client-dynamodb@3.741.0(aws-crt@1.25.3))': + dependencies: + '@aws-sdk/client-dynamodb': 3.741.0(aws-crt@1.25.3) + tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13604,6 +14452,36 @@ snapshots: transitivePeerDependencies: - supports-color + '@azure/keyvault-common@2.0.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-client': 1.9.2 + '@azure/core-rest-pipeline': 1.18.2 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/logger': 1.1.4 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/keyvault-keys@4.9.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 + '@azure/core-client': 1.9.2 + '@azure/core-http-compat': 2.1.2 + '@azure/core-lro': 2.7.2 + '@azure/core-paging': 1.6.2 + '@azure/core-rest-pipeline': 1.18.2 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 + '@azure/keyvault-common': 2.0.0 + '@azure/logger': 1.1.4 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@azure/logger@1.1.4': dependencies: tslib: 2.8.1 @@ -14665,6 +15543,77 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@boxyhq/error-code-mnemonic@0.1.1': {} + + '@boxyhq/metrics@0.2.9': + dependencies: + '@grpc/grpc-js': 1.11.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-metrics-otlp-grpc': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + + '@boxyhq/saml-jackson@1.37.1(aws-crt@1.25.3)(socks@2.8.4)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2))': + dependencies: + '@aws-sdk/client-dynamodb': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/credential-providers': 3.741.0(aws-crt@1.25.3) + '@aws-sdk/util-dynamodb': 3.741.0(@aws-sdk/client-dynamodb@3.741.0(aws-crt@1.25.3)) + '@boxyhq/error-code-mnemonic': 0.1.1 + '@boxyhq/metrics': 0.2.9 + '@boxyhq/saml20': 1.7.1 + '@googleapis/admin': 23.0.0(encoding@0.1.13) + '@libsql/sqlite3': 0.3.1(encoding@0.1.13) + axios: 1.7.9 + encoding: 0.1.13 + jose: 5.9.6 + lodash: 4.17.21 + mixpanel: 0.18.0 + mongodb: 6.13.0(@aws-sdk/credential-providers@3.741.0(aws-crt@1.25.3))(socks@2.8.4) + mssql: 11.0.1 + mysql2: 3.12.0 + node-forge: 1.3.1 + openid-client: 6.1.7 + pg: 8.13.1 + redis: 4.7.0 + reflect-metadata: 0.2.2 + ripemd160: 2.0.2 + sqlite3: 5.1.7 + typeorm: 0.3.20(mongodb@6.13.0(@aws-sdk/credential-providers@3.741.0(aws-crt@1.25.3))(socks@2.8.4))(mssql@11.0.1)(mysql2@3.12.0)(pg@8.13.1)(redis@4.7.0)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)) + transitivePeerDependencies: + - '@google-cloud/spanner' + - '@mongodb-js/zstd' + - '@sap/hana-client' + - aws-crt + - better-sqlite3 + - bluebird + - bufferutil + - debug + - gcp-metadata + - hdb-pool + - ioredis + - kerberos + - mongodb-client-encryption + - oracledb + - pg-native + - pg-query-stream + - snappy + - socks + - sql.js + - supports-color + - ts-node + - typeorm-aurora-data-api-driver + - utf-8-validate + + '@boxyhq/saml20@1.7.1': + dependencies: + '@xmldom/xmldom': 0.9.7 + xml-crypto: 6.0.0 + xml-encryption: 3.1.0 + xml2js: 0.6.2 + xmlbuilder: 15.1.1 + '@calcom/embed-core@1.5.1': {} '@calcom/embed-snippet@1.3.1': @@ -15539,6 +16488,28 @@ snapshots: '@formkit/auto-animate@0.8.2': {} + '@gar/promisify@1.1.3': + optional: true + + '@googleapis/admin@23.0.0(encoding@0.1.13)': + dependencies: + googleapis-common: 7.2.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + '@grpc/grpc-js@1.11.3': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.1 + protobufjs: 7.4.0 + yargs: 17.7.2 + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -15769,6 +16740,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@js-joda/core@5.6.4': {} + + '@js-sdsl/ordered-map@4.4.2': {} + '@json2csv/formatters@7.0.6': {} '@json2csv/node@7.0.6': @@ -15927,6 +16902,39 @@ snapshots: lexical: 0.21.0 yjs: 13.6.23 + '@libsql/hrana-client@0.4.4(encoding@0.1.13)': + dependencies: + '@libsql/isomorphic-fetch': 0.1.12(encoding@0.1.13) + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.7 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@libsql/isomorphic-fetch@0.1.12(encoding@0.1.13)': + dependencies: + '@types/node-fetch': 2.6.12 + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + '@libsql/isomorphic-ws@0.1.5': + dependencies: + '@types/ws': 8.5.14 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/sqlite3@0.3.1(encoding@0.1.13)': + dependencies: + '@libsql/hrana-client': 0.4.4(encoding@0.1.13) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.26.7 @@ -15993,6 +17001,10 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} + '@mongodb-js/saslprep@1.2.0': + dependencies: + sparse-bitfield: 3.0.3 + '@neshca/cache-handler@1.9.0(next@15.1.2(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(redis@4.7.0)': dependencies: cluster-key-slot: 1.1.2 @@ -16050,14 +17062,30 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@npmcli/fs@1.1.1': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.3 + optional: true + '@npmcli/fs@3.1.1': dependencies: semver: 7.6.3 + '@npmcli/move-file@1.1.2': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + optional: true + '@opentelemetry/api-logs@0.52.1': dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.53.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.56.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -16070,6 +17098,11 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/core@1.29.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -16080,6 +17113,27 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/exporter-metrics-otlp-grpc@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.11.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-http@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib@0.45.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -16312,8 +17366,39 @@ snapshots: transitivePeerDependencies: - supports-color + '@opentelemetry/otlp-exporter-base@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.11.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + protobufjs: 7.4.0 + '@opentelemetry/redis-common@0.36.2': {} + '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/resources@1.29.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -16326,6 +17411,13 @@ snapshots: '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs@0.56.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -16333,12 +17425,25 @@ snapshots: '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -16584,6 +17689,29 @@ snapshots: '@prisma/prisma-schema-wasm@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584': {} + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.1': {} @@ -18417,6 +19545,8 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@sqltools/formatter@1.2.5': {} + '@storybook/addon-a11y@8.4.7(storybook@8.4.7(prettier@3.4.2))': dependencies: '@storybook/addon-highlight': 8.4.7(storybook@8.4.7(prettier@3.4.2)) @@ -18718,6 +19848,8 @@ snapshots: '@tanstack/table-core@8.20.5': {} + '@tediousjs/connection-string@0.5.0': {} + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.26.2 @@ -18775,6 +19907,9 @@ snapshots: dependencies: '@tolgee/core': 6.0.1 + '@tootallnate/once@1.1.2': + optional: true + '@trivago/prettier-plugin-sort-imports@5.2.0(prettier@3.4.2)': dependencies: '@babel/generator': 7.26.5 @@ -18914,6 +20049,11 @@ snapshots: dependencies: '@types/node': 22.10.2 + '@types/node-fetch@2.6.12': + dependencies: + '@types/node': 22.10.2 + form-data: 4.0.1 + '@types/node-forge@1.3.11': dependencies: '@types/node': 22.10.2 @@ -18972,6 +20112,11 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/readable-stream@4.0.18': + dependencies: + '@types/node': 22.10.2 + safe-buffer: 5.1.2 + '@types/resolve@1.20.6': {} '@types/retry@0.12.0': {} @@ -18997,6 +20142,12 @@ snapshots: '@types/uuid@9.0.8': {} + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + '@types/ws@8.5.14': dependencies: '@types/node': 22.10.2 @@ -19261,7 +20412,7 @@ snapshots: '@urql/core': 5.1.0 wonka: 6.3.4 - '@vercel/functions@1.5.2(@aws-sdk/credential-provider-web-identity@3.734.0)': + '@vercel/functions@1.5.2(@aws-sdk/credential-provider-web-identity@3.734.0(aws-crt@1.25.3))': optionalDependencies: '@aws-sdk/credential-provider-web-identity': 3.734.0(aws-crt@1.25.3) @@ -19602,10 +20753,14 @@ snapshots: '@wojtekmaj/date-utils@1.5.1': {} + '@xmldom/is-dom-node@1.0.1': {} + '@xmldom/xmldom@0.7.13': {} '@xmldom/xmldom@0.8.10': {} + '@xmldom/xmldom@0.9.7': {} + '@xobotyi/scrollbar-width@1.9.5': {} '@xtuc/ieee754@1.2.0': {} @@ -19614,6 +20769,9 @@ snapshots: '@zeit/schemas@2.36.0': {} + abbrev@1.1.1: + optional: true + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -19647,6 +20805,11 @@ snapshots: agent-base@7.1.3: {} + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + optional: true + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -19762,10 +20925,15 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + app-root-path@3.1.0: {} + appdirsjs@1.2.7: {} application-config-path@0.1.1: {} + aproba@2.0.0: + optional: true + arch@2.2.0: {} archiver-utils@2.1.0: @@ -19804,6 +20972,12 @@ snapshots: tar-stream: 2.2.0 zip-stream: 4.1.1 + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + arg@4.1.3: {} arg@5.0.2: {} @@ -19961,6 +21135,8 @@ snapshots: - supports-color - utf-8-validate + aws-ssl-profiles@1.1.2: {} + axe-core@4.10.2: {} axios@1.7.9: @@ -20120,12 +21296,23 @@ snapshots: binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + bl@6.0.19: + dependencies: + '@types/readable-stream': 4.0.18 + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 4.7.0 + bn.js@4.12.1: {} bn.js@5.2.1: {} @@ -20240,6 +21427,8 @@ snapshots: dependencies: node-int64: 0.4.0 + bson@6.10.3: {} + buffer-alloc-unsafe@1.1.0: {} buffer-alloc@1.2.0: @@ -20286,6 +21475,30 @@ snapshots: cac@6.7.14: {} + cacache@15.3.0: + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + optional: true + cacache@18.0.4: dependencies: '@npmcli/fs': 3.1.1 @@ -20433,6 +21646,8 @@ snapshots: dependencies: readdirp: 4.1.1 + chownr@1.1.4: {} + chownr@2.0.0: {} chromatic@11.25.1: {} @@ -20498,6 +21713,15 @@ snapshots: dependencies: restore-cursor: 5.1.0 + cli-highlight@2.1.11: + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + cli-spinners@2.9.2: {} cli-truncate@2.1.0: @@ -20524,6 +21748,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -20573,6 +21803,9 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 + color-support@1.1.3: + optional: true + color@4.2.3: dependencies: color-convert: 2.0.1 @@ -20590,6 +21823,8 @@ snapshots: command-exists@1.2.9: {} + commander@11.1.0: {} + commander@12.1.0: {} commander@2.20.3: {} @@ -20682,6 +21917,9 @@ snapshots: console-browserify@1.2.0: {} + console-control-strings@1.1.0: + optional: true + constants-browserify@1.0.0: {} content-disposition@0.5.2: {} @@ -20903,6 +22141,10 @@ snapshots: dependencies: character-entities: 2.0.2 + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -20947,8 +22189,13 @@ snapshots: delayed-stream@1.0.0: {} + delegates@1.0.0: + optional: true + denodeify@1.2.1: {} + denque@2.1.0: {} + depd@2.0.0: {} dequal@2.0.3: {} @@ -21137,6 +22384,9 @@ snapshots: eol@0.9.1: {} + err-code@2.0.3: + optional: true + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -21385,7 +22635,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.2(eslint@8.57.0) eslint-plugin-react-hooks: 5.1.0(eslint@8.57.0) @@ -21407,7 +22657,7 @@ snapshots: eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0) eslint-import-resolver-node@0.3.9: dependencies: @@ -21429,7 +22679,7 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -21506,7 +22756,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -21806,6 +23056,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + expand-template@2.0.3: {} + expect-type@1.1.0: {} expo-asset@11.0.2(expo@52.0.28(@babel/core@7.26.0)(@babel/preset-env@7.26.7(@babel/core@7.26.0))(encoding@0.1.13)(react-native-webview@13.12.5(react-native@0.76.6(@babel/core@7.26.0)(@babel/preset-env@7.26.7(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9(encoding@0.1.13))(@types/react@18.3.18)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.6(@babel/core@7.26.0)(@babel/preset-env@7.26.7(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9(encoding@0.1.13))(@types/react@18.3.18)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.6(@babel/core@7.26.0)(@babel/preset-env@7.26.7(@babel/core@7.26.0))(@react-native-community/cli-server-api@13.6.9(encoding@0.1.13))(@types/react@18.3.18)(encoding@0.1.13)(react@18.3.1))(react@18.3.1): @@ -22006,6 +23258,8 @@ snapshots: schema-utils: 3.3.0 webpack: 5.97.1 + file-uri-to-path@1.0.0: {} + filesize@10.1.6: {} fill-range@7.1.1: @@ -22180,6 +23434,18 @@ snapshots: functions-have-names@1.2.3: {} + gauge@4.0.4: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + gaxios@6.7.1(encoding@0.1.13): dependencies: extend: 3.0.2 @@ -22199,6 +23465,10 @@ snapshots: - encoding - supports-color + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + generic-pool@3.9.0: {} gensync@1.0.0-beta.2: {} @@ -22259,6 +23529,8 @@ snapshots: git-hooks-list@3.1.0: {} + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -22407,6 +23679,9 @@ snapshots: dependencies: has-symbols: 1.1.0 + has-unicode@2.0.1: + optional: true + hash-base@3.0.5: dependencies: inherits: 2.0.4 @@ -22497,6 +23772,8 @@ snapshots: hex-rgb@4.3.0: {} + highlight.js@10.7.3: {} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -22536,6 +23813,9 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 + http-cache-semantics@4.1.1: + optional: true + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -22544,6 +23824,15 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@4.0.1: + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + optional: true + http-proxy-agent@7.0.0: dependencies: agent-base: 7.1.3 @@ -22560,6 +23849,13 @@ snapshots: https-browserify@1.0.0: {} + https-proxy-agent@5.0.0: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -22587,6 +23883,11 @@ snapshots: human-signals@5.0.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + optional: true + husky@9.1.7: {} hyphenate-style-name@1.1.0: {} @@ -22636,6 +23937,9 @@ snapshots: indent-string@4.0.0: {} + infer-owner@1.0.4: + optional: true + inflight@1.0.6: dependencies: once: 1.4.0 @@ -22668,6 +23972,12 @@ snapshots: dependencies: loose-envify: 1.4.0 + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + optional: true + ip-regex@2.1.0: {} ipaddr.js@1.9.1: {} @@ -22781,6 +24091,9 @@ snapshots: is-interactive@1.0.0: {} + is-lambda@1.0.1: + optional: true + is-map@2.0.3: {} is-nan@1.3.2: @@ -22811,6 +24124,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-property@1.0.2: {} + is-reference@1.2.1: dependencies: '@types/estree': 1.0.6 @@ -23063,12 +24378,18 @@ snapshots: jose@4.15.9: {} + jose@5.9.6: {} + joycon@3.1.1: {} jpeg-js@0.4.4: {} + js-base64@3.7.7: {} + js-cookie@2.2.1: {} + js-md4@0.3.2: {} + js-sdsl@4.3.0: {} js-tokens@4.0.0: {} @@ -23082,6 +24403,9 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@1.1.0: + optional: true + jsc-android@250231.0.0: {} jsc-safe-url@0.2.4: {} @@ -23403,6 +24727,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.castarray@4.4.0: {} lodash.debounce@4.0.8: {} @@ -23468,6 +24794,8 @@ snapshots: dayjs: 1.11.13 yargs: 15.4.1 + long@5.3.1: {} + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -23488,6 +24816,10 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@7.18.3: {} + + lru.min@1.1.1: {} + lucide-react@0.468.0(react@19.0.0): dependencies: react: 19.0.0 @@ -23533,6 +24865,29 @@ snapshots: make-event-props@1.6.2: {} + make-fetch-happen@9.1.0: + dependencies: + agentkeepalive: 4.6.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.4 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -23683,6 +25038,8 @@ snapshots: dependencies: map-or-similar: 1.5.0 + memory-pager@1.5.0: {} + merge-options@3.0.4: dependencies: is-plain-obj: 2.1.0 @@ -24221,6 +25578,8 @@ snapshots: mimic-function@5.0.1: {} + mimic-response@3.1.0: {} + min-indent@1.0.1: {} mini-svg-data-uri@1.4.4: {} @@ -24255,10 +25614,24 @@ snapshots: minimist@1.2.8: {} + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + optional: true + minipass-collect@2.0.1: dependencies: minipass: 7.1.2 + minipass-fetch@1.4.1: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + optional: true + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 @@ -24267,6 +25640,11 @@ snapshots: dependencies: minipass: 3.3.6 + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + optional: true + minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -24282,12 +25660,22 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + mixpanel@0.18.0: + dependencies: + https-proxy-agent: 5.0.0 + transitivePeerDependencies: + - supports-color + + mkdirp-classic@0.5.3: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 mkdirp@1.0.4: {} + mkdirp@2.1.6: {} + mlly@1.7.4: dependencies: acorn: 8.14.0 @@ -24295,8 +25683,26 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 + mnemonist@0.38.3: + dependencies: + obliterator: 1.6.1 + module-details-from-path@1.0.3: {} + mongodb-connection-string-url@3.0.2: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 14.1.0 + + mongodb@6.13.0(@aws-sdk/credential-providers@3.741.0(aws-crt@1.25.3))(socks@2.8.4): + dependencies: + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 + mongodb-connection-string-url: 3.0.2 + optionalDependencies: + '@aws-sdk/credential-providers': 3.741.0(aws-crt@1.25.3) + socks: 2.8.4 + motion-dom@11.18.1: dependencies: motion-utils: 11.18.1 @@ -24343,16 +25749,43 @@ snapshots: ms@2.1.3: {} + mssql@11.0.1: + dependencies: + '@tediousjs/connection-string': 0.5.0 + commander: 11.1.0 + debug: 4.4.0 + rfdc: 1.4.1 + tarn: 3.0.2 + tedious: 18.6.1 + transitivePeerDependencies: + - supports-color + muggle-string@0.4.1: {} mustache@4.2.0: {} + mysql2@3.12.0: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.3.1 + lru.min: 1.1.1 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + named-placeholders@1.1.3: + dependencies: + lru-cache: 7.18.3 + nano-css@5.6.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -24370,6 +25803,10 @@ snapshots: nanoid@5.0.9: {} + napi-build-utils@2.0.0: {} + + native-duplexpair@1.0.0: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -24438,8 +25875,14 @@ snapshots: nocache@3.0.4: {} + node-abi@3.74.0: + dependencies: + semver: 7.6.3 + node-abort-controller@3.1.1: {} + node-addon-api@7.1.1: {} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 @@ -24472,6 +25915,23 @@ snapshots: node-forge@1.3.1: {} + node-gyp@8.4.1: + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + node-html-parser@6.1.13: dependencies: css-select: 5.1.0 @@ -24515,6 +25975,11 @@ snapshots: nodemailer@6.9.16: {} + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + optional: true + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -24558,6 +26023,14 @@ snapshots: dependencies: path-key: 4.0.0 + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + optional: true + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -24573,6 +26046,8 @@ snapshots: nwsapi@2.2.16: {} + oauth4webapi@3.3.0: {} + oauth@0.9.15: {} ob1@0.80.12: @@ -24633,6 +26108,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + obliterator@1.6.1: {} + oidc-token-hash@5.0.3: {} on-finished@2.3.0: @@ -24693,6 +26170,11 @@ snapshots: object-hash: 2.2.0 oidc-token-hash: 5.0.3 + openid-client@6.1.7: + dependencies: + jose: 5.9.6 + oauth4webapi: 3.3.0 + optional@0.1.4: {} optionator@0.9.4: @@ -24838,6 +26320,14 @@ snapshots: dependencies: pngjs: 3.4.0 + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@5.1.1: {} + + parse5@6.0.1: {} + parse5@7.2.1: dependencies: entities: 4.5.0 @@ -24904,8 +26394,17 @@ snapshots: pend@1.2.0: {} + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.7.0: {} + pg-int8@1.0.1: {} + pg-pool@3.7.1(pg@8.13.1): + dependencies: + pg: 8.13.1 + pg-protocol@1.7.0: {} pg-types@2.2.0: @@ -24916,6 +26415,20 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 + pg@8.13.1: + dependencies: + pg-connection-string: 2.7.0 + pg-pool: 3.7.1(pg@8.13.1) + pg-protocol: 1.7.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -25077,6 +26590,21 @@ snapshots: preact@10.25.2: {} + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + prelude-ls@1.2.1: {} prettier-plugin-packagejson@2.5.8(prettier@3.4.2): @@ -25161,6 +26689,15 @@ snapshots: progress@2.0.3: {} + promise-inflight@1.0.1: + optional: true + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + optional: true + promise@7.3.1: dependencies: asap: 2.0.6 @@ -25182,6 +26719,21 @@ snapshots: property-information@7.0.0: {} + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.10.2 + long: 5.3.1 + proxy-from-env@1.1.0: {} public-encrypt@4.0.3: @@ -25616,6 +27168,14 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readdir-glob@1.1.3: dependencies: minimatch: 5.1.6 @@ -25657,6 +27217,8 @@ snapshots: '@redis/search': 1.2.0(@redis/client@1.6.0) '@redis/time-series': 1.1.0(@redis/client@1.6.0) + reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -25826,6 +27388,9 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + retry@0.12.0: + optional: true + retry@0.13.1: {} reusify@1.0.4: {} @@ -26047,6 +27612,8 @@ snapshots: transitivePeerDependencies: - supports-color + seq-queue@0.0.5: {} + serialize-error@2.1.0: {} serialize-javascript@6.0.2: @@ -26205,6 +27772,14 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-plist@1.3.1: dependencies: bplist-creator: 0.1.0 @@ -26243,6 +27818,24 @@ snapshots: slugify@1.6.6: {} + smart-buffer@4.2.0: + optional: true + + socks-proxy-agent@6.2.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0 + socks: 2.8.4 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.4: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + optional: true + sort-object-keys@1.1.3: {} sort-package-json@2.14.0: @@ -26277,6 +27870,10 @@ snapshots: space-separated-tokens@2.0.2: {} + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -26300,12 +27897,30 @@ snapshots: dependencies: readable-stream: 3.6.2 + split2@4.2.0: {} + split@1.0.1: dependencies: through: 2.3.8 sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + + sqlite3@5.1.7: + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + + sqlstring@2.3.3: {} + ssf@0.11.2: dependencies: frac: 1.1.2 @@ -26314,6 +27929,11 @@ snapshots: dependencies: minipass: 7.1.2 + ssri@8.0.1: + dependencies: + minipass: 3.3.6 + optional: true + stable-hash@0.0.4: {} stack-generator@2.0.10: @@ -26605,6 +28225,13 @@ snapshots: tapable@2.2.1: {} + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -26622,6 +28249,23 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tarn@3.0.2: {} + + tedious@18.6.1: + dependencies: + '@azure/core-auth': 1.9.0 + '@azure/identity': 4.6.0 + '@azure/keyvault-keys': 4.9.0 + '@js-joda/core': 5.6.4 + '@types/node': 22.10.2 + bl: 6.0.19 + iconv-lite: 0.6.3 + js-md4: 0.3.2 + native-duplexpair: 1.0.0 + sprintf-js: 1.1.3 + transitivePeerDependencies: + - supports-color + temp-dir@1.0.0: {} temp-dir@2.0.0: {} @@ -26884,6 +28528,10 @@ snapshots: tty-browserify@0.0.1: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + turbo-darwin-64@2.3.3: optional: true @@ -26968,6 +28616,34 @@ snapshots: typedarray@0.0.6: {} + typeorm@0.3.20(mongodb@6.13.0(@aws-sdk/credential-providers@3.741.0(aws-crt@1.25.3))(socks@2.8.4))(mssql@11.0.1)(mysql2@3.12.0)(pg@8.13.1)(redis@4.7.0)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2)): + dependencies: + '@sqltools/formatter': 1.2.5 + app-root-path: 3.1.0 + buffer: 6.0.3 + chalk: 4.1.2 + cli-highlight: 2.1.11 + dayjs: 1.11.13 + debug: 4.4.0 + dotenv: 16.4.7 + glob: 10.4.5 + mkdirp: 2.1.6 + reflect-metadata: 0.2.2 + sha.js: 2.4.11 + tslib: 2.8.1 + uuid: 9.0.1 + yargs: 17.7.2 + optionalDependencies: + mongodb: 6.13.0(@aws-sdk/credential-providers@3.741.0(aws-crt@1.25.3))(socks@2.8.4) + mssql: 11.0.1 + mysql2: 3.12.0 + pg: 8.13.1 + redis: 4.7.0 + sqlite3: 5.1.7 + ts-node: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) + transitivePeerDependencies: + - supports-color + typescript@5.7.2: {} ua-is-frozen@0.1.2: {} @@ -27027,10 +28703,20 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + optional: true + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + optional: true + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 @@ -27516,6 +29202,11 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + widest-line@4.0.1: dependencies: string-width: 5.1.2 @@ -27588,6 +29279,18 @@ snapshots: wmf: 1.0.2 word: 0.3.0 + xml-crypto@6.0.0: + dependencies: + '@xmldom/is-dom-node': 1.0.1 + '@xmldom/xmldom': 0.8.10 + xpath: 0.0.33 + + xml-encryption@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.10 + escape-html: 1.0.3 + xpath: 0.0.32 + xml-name-validator@5.0.0: {} xml2js@0.6.0: @@ -27595,6 +29298,11 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + xmlbuilder@11.0.1: {} xmlbuilder@14.0.0: {} @@ -27603,6 +29311,10 @@ snapshots: xmlchars@2.2.0: {} + xpath@0.0.32: {} + + xpath@0.0.33: {} + xtend@4.0.2: {} y18n@4.0.3: {} @@ -27622,6 +29334,8 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} yargs@15.4.1: @@ -27638,6 +29352,16 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/turbo.json b/turbo.json index e50bdd05b4..149f552630 100644 --- a/turbo.json +++ b/turbo.json @@ -158,6 +158,7 @@ "S3_FORCE_PATH_STYLE", "S3_REGION", "S3_SECRET_KEY", + "SAML_DATABASE_URL", "SENTRY_DSN", "SIGNUP_DISABLED", "SLACK_CLIENT_ID",