diff --git a/.env.example b/.env.example index 3c1e86a566..428a8a016b 100644 --- a/.env.example +++ b/.env.example @@ -211,5 +211,5 @@ UNKEY_ROOT_KEY= # It's used automatically by Sentry during the build for authentication when uploading source maps. # SENTRY_AUTH_TOKEN= -# Disable the user management from UI -# DISABLE_USER_MANAGEMENT=1 \ No newline at end of file +# Configure the minimum role for user management from UI(owner, manager, disabled) +# USER_MANAGEMENT_MINIMUM_ROLE="manager" \ No newline at end of file diff --git a/apps/storybook/package.json b/apps/storybook/package.json index fcf8ed5caf..3ba48446be 100644 --- a/apps/storybook/package.json +++ b/apps/storybook/package.json @@ -11,9 +11,7 @@ "clean": "rimraf .turbo node_modules dist storybook-static" }, "dependencies": { - "eslint-plugin-react-refresh": "0.4.20", - "react": "19.1.0", - "react-dom": "19.1.0" + "eslint-plugin-react-refresh": "0.4.20" }, "devDependencies": { "@chromatic-com/storybook": "3.2.6", diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.test.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.test.tsx index 50af9b6ec8..90b59b44ee 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.test.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.test.tsx @@ -1,487 +1,494 @@ -import { generateResponseTableColumns } from "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTableColumns"; -import { deleteResponseAction } from "@/modules/analysis/components/SingleResponseCard/actions"; -import type { DragEndEvent } from "@dnd-kit/core"; -import { act, cleanup, render, screen } from "@testing-library/react"; +import { ResponseTable } from "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable"; +import { getResponsesDownloadUrlAction } from "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/actions"; +import { getFormattedErrorMessage } from "@/lib/utils/helper"; +import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { afterEach, describe, expect, test, vi } from "vitest"; +import toast from "react-hot-toast"; +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; import { TEnvironment } from "@formbricks/types/environment"; -import { TResponse, TResponseTableData } from "@formbricks/types/responses"; -import { TSurvey, TSurveyQuestion, TSurveyQuestionTypeEnum } from "@formbricks/types/surveys/types"; +import { TResponse } from "@formbricks/types/responses"; +import { TSurvey } from "@formbricks/types/surveys/types"; import { TTag } from "@formbricks/types/tags"; -import { TUser, TUserLocale } from "@formbricks/types/user"; -import { ResponseTable } from "./ResponseTable"; +import { TUserLocale } from "@formbricks/types/user"; -// Hoist variables used in mock factories -const { DndContextMock, SortableContextMock, arrayMoveMock } = vi.hoisted(() => { - const dndMock = vi.fn(({ children, onDragEnd }) => { - // Store the onDragEnd prop to allow triggering it in tests - (dndMock as any).lastOnDragEnd = onDragEnd; - return
{children}
; - }); - const sortableMock = vi.fn(({ children }) => <>{children}); - const moveMock = vi.fn((array, from, to) => { - const newArray = [...array]; - const [item] = newArray.splice(from, 1); - newArray.splice(to, 0, item); - return newArray; - }); - return { - DndContextMock: dndMock, - SortableContextMock: sortableMock, - arrayMoveMock: moveMock, - }; -}); +// Mock react-hot-toast +vi.mock("react-hot-toast", () => ({ + default: { + error: vi.fn(), + success: vi.fn(), + dismiss: vi.fn(), + }, +})); -vi.mock("@dnd-kit/core", async (importOriginal) => { - const actual = await importOriginal(); - return { - ...actual, - DndContext: DndContextMock, - useSensor: vi.fn(), - useSensors: vi.fn(), - closestCenter: vi.fn(), - }; -}); +// Mock components +vi.mock("@/modules/ui/components/button", () => ({ + Button: ({ children, onClick, ...props }: any) => ( + + ), +})); + +// Mock DndContext/SortableContext +vi.mock("@dnd-kit/core", () => ({ + DndContext: ({ children }: any) =>
{children}
, + useSensor: vi.fn(), + useSensors: vi.fn(() => "sensors"), + closestCenter: vi.fn(), + MouseSensor: vi.fn(), + TouchSensor: vi.fn(), + KeyboardSensor: vi.fn(), +})); vi.mock("@dnd-kit/modifiers", () => ({ - restrictToHorizontalAxis: vi.fn(), + restrictToHorizontalAxis: "restrictToHorizontalAxis", })); vi.mock("@dnd-kit/sortable", () => ({ - SortableContext: SortableContextMock, - arrayMove: arrayMoveMock, - horizontalListSortingStrategy: vi.fn(), + SortableContext: ({ children }: any) => <>{children}, + horizontalListSortingStrategy: "horizontalListSortingStrategy", + arrayMove: vi.fn((arr, oldIndex, newIndex) => { + const result = [...arr]; + const [removed] = result.splice(oldIndex, 1); + result.splice(newIndex, 0, removed); + return result; + }), +})); + +// Mock AutoAnimate +vi.mock("@formkit/auto-animate/react", () => ({ + useAutoAnimate: () => [vi.fn()], +})); + +// Mock UI components +vi.mock("@/modules/ui/components/data-table", () => ({ + DataTableHeader: ({ header }: any) => {header.id}, + DataTableSettingsModal: ({ open, setOpen }: any) => + open ? ( +
+ Settings Modal +
+ ) : null, + DataTableToolbar: ({ + table, + deleteRowsAction, + downloadRowsAction, + setIsTableSettingsModalOpen, + setIsExpanded, + isExpanded, + }: any) => ( +
+ + + + + +
+ ), })); -// Mock child components and hooks vi.mock( "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseCardModal", () => ({ - ResponseCardModal: vi.fn(({ open, setOpen, selectedResponseId }) => + ResponseCardModal: ({ open, setOpen }: any) => open ? ( -
- Selected Response ID: {selectedResponseId} - +
+ Response Modal
- ) : null - ), + ) : null, }) ); vi.mock( "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTableCell", () => ({ - ResponseTableCell: vi.fn(({ cell, row, setSelectedResponseId }) => ( - setSelectedResponseId(row.original.responseId)}> - {typeof cell.getValue === "function" ? cell.getValue() : JSON.stringify(cell.getValue())} + ResponseTableCell: ({ cell, row, setSelectedResponseId }: any) => ( + setSelectedResponseId(row.id)}> + Cell Content - )), + ), }) ); -const mockGeneratedColumns = [ - { - id: "select", - header: () => "Select", - cell: vi.fn(() => "SelectCell"), - enableSorting: false, - meta: { type: "select", questionType: null, hidden: false }, - }, - { - id: "createdAt", - header: () => "Created At", - cell: vi.fn(({ row }) => new Date(row.original.createdAt).toISOString()), - enableSorting: true, - meta: { type: "createdAt", questionType: null, hidden: false }, - }, - { - id: "q1", - header: () => "Question 1", - cell: vi.fn(({ row }) => row.original.responseData.q1), - enableSorting: true, - meta: { type: "question", questionType: "openText", hidden: false }, - }, -]; vi.mock( "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTableColumns", () => ({ - generateResponseTableColumns: vi.fn(() => mockGeneratedColumns), + generateResponseTableColumns: vi.fn(() => [ + { id: "select", accessorKey: "select", header: "Select" }, + { id: "createdAt", accessorKey: "createdAt", header: "Created At" }, + { id: "person", accessorKey: "person", header: "Person" }, + { id: "status", accessorKey: "status", header: "Status" }, + ]), }) ); +vi.mock("@/modules/ui/components/table", () => ({ + Table: ({ children, ...props }: any) => {children}
, + TableBody: ({ children, ...props }: any) => {children}, + TableCell: ({ children, ...props }: any) => {children}, + TableHeader: ({ children, ...props }: any) => {children}, + TableRow: ({ children, ...props }: any) => {children}, +})); + +vi.mock("@/modules/ui/components/skeleton", () => ({ + Skeleton: ({ children }: any) =>
{children}
, +})); + +// Mock the actions +vi.mock("@/app/(app)/environments/[environmentId]/surveys/[surveyId]/actions", () => ({ + getResponsesDownloadUrlAction: vi.fn(), +})); + vi.mock("@/modules/analysis/components/SingleResponseCard/actions", () => ({ deleteResponseAction: vi.fn(), })); -vi.mock("@/modules/ui/components/data-table", async (importOriginal) => { - const actual = await importOriginal(); - return { - ...actual, - DataTableToolbar: vi.fn((props) => ( -
- - - - -
- )), - DataTableHeader: vi.fn(({ header }) => ( - header.column.getToggleSortingHandler()?.(new MouseEvent("click"))}> - {typeof header.column.columnDef.header === "function" - ? header.column.columnDef.header(header.getContext()) - : header.column.columnDef.header} - - - )), - DataTableSettingsModal: vi.fn(({ open, setOpen }) => - open ? ( -
- -
- ) : null - ), - }; -}); - -vi.mock("@formkit/auto-animate/react", () => ({ - useAutoAnimate: vi.fn(() => [vi.fn()]), +// Mock helper functions +vi.mock("@/lib/utils/helper", () => ({ + getFormattedErrorMessage: vi.fn(), })); -vi.mock("@tolgee/react", () => ({ - useTranslate: () => ({ - t: vi.fn((key) => key), // Simple pass-through mock - }), -})); - -const localStorageMock = (() => { +// Mock localStorage +const mockLocalStorage = (() => { let store: Record = {}; return { - getItem: vi.fn((key: string) => store[key] || null), - setItem: vi.fn((key: string, value: string) => { - store[key] = value.toString(); + getItem: vi.fn((key) => store[key] || null), + setItem: vi.fn((key, value) => { + store[key] = String(value); }), - clear: () => { + clear: vi.fn(() => { store = {}; - }, - removeItem: vi.fn((key: string) => { + }), + removeItem: vi.fn((key) => { delete store[key]; }), }; })(); -Object.defineProperty(window, "localStorage", { value: localStorageMock }); +Object.defineProperty(window, "localStorage", { value: mockLocalStorage }); -const mockSurvey = { - id: "survey1", - name: "Test Survey", - type: "app", - status: "inProgress", - questions: [ - { - id: "q1", - type: TSurveyQuestionTypeEnum.OpenText, - headline: { default: "Question 1" }, - required: true, - } as unknown as TSurveyQuestion, - ], - hiddenFields: { enabled: true, fieldIds: ["hidden1"] }, - variables: [{ id: "var1", name: "Variable 1", type: "text", value: "default" }], - createdAt: new Date(), - updatedAt: new Date(), - environmentId: "env1", - welcomeCard: { - enabled: false, - headline: { default: "" }, - html: { default: "" }, - timeToFinish: false, - showResponseCount: false, - }, - autoClose: null, - delay: 0, - autoComplete: null, - closeOnDate: null, - displayOption: "displayOnce", - recontactDays: null, - singleUse: { enabled: false, isEncrypted: true }, - triggers: [], - languages: [], - styling: null, - surveyClosedMessage: null, - resultShareKey: null, - displayPercentage: null, -} as unknown as TSurvey; +// Mock Tolgee +vi.mock("@tolgee/react", () => ({ + useTranslate: () => ({ + t: (key: string) => key, + }), +})); -const mockResponses: TResponse[] = [ - { - id: "res1", - surveyId: "survey1", - finished: true, - data: { q1: "Response 1 Text" }, - createdAt: new Date("2023-01-01T10:00:00.000Z"), +// Define mock data for tests +const mockProps = { + data: [ + { responseId: "resp1", createdAt: new Date().toISOString(), status: "completed", person: "Person 1" }, + { responseId: "resp2", createdAt: new Date().toISOString(), status: "completed", person: "Person 2" }, + ] as any[], + survey: { + id: "survey1", + createdAt: new Date(), updatedAt: new Date(), - meta: {}, - singleUseId: null, - ttc: {}, - tags: [], - notes: [], - variables: {}, - language: "en", - contact: null, - contactAttributes: null, - }, - { - id: "res2", - surveyId: "survey1", - finished: false, - data: { q1: "Response 2 Text" }, - createdAt: new Date("2023-01-02T10:00:00.000Z"), - updatedAt: new Date(), - meta: {}, - singleUseId: null, - ttc: {}, - tags: [], - notes: [], - variables: {}, - language: "en", - contact: null, - contactAttributes: null, - }, -]; - -const mockResponseTableData: TResponseTableData[] = [ - { - responseId: "res1", - responseData: { q1: "Response 1 Text" }, - createdAt: new Date("2023-01-01T10:00:00.000Z"), - status: "Completed", - tags: [], - notes: [], - variables: {}, - verifiedEmail: "", - language: "en", - person: null, - contactAttributes: null, - }, - { - responseId: "res2", - responseData: { q1: "Response 2 Text" }, - createdAt: new Date("2023-01-02T10:00:00.000Z"), - status: "Not Completed", - tags: [], - notes: [], - variables: {}, - verifiedEmail: "", - language: "en", - person: null, - contactAttributes: null, - }, -]; - -const mockEnvironment = { - id: "env1", - createdAt: new Date(), - updatedAt: new Date(), - type: "development", - appSetupCompleted: false, -} as unknown as TEnvironment; - -const mockUser = { - id: "user1", - name: "Test User", - email: "user@test.com", - emailVerified: new Date(), - imageUrl: "", - twoFactorEnabled: false, - identityProvider: "email", - createdAt: new Date(), - updatedAt: new Date(), - role: "project_manager", - objective: "other", - notificationSettings: { alert: {}, weeklySummary: {} }, -} as unknown as TUser; - -const mockEnvironmentTags: TTag[] = [ - { id: "tag1", name: "Tag 1", environmentId: "env1", createdAt: new Date(), updatedAt: new Date() }, -]; -const mockLocale: TUserLocale = "en-US"; - -const defaultProps = { - data: mockResponseTableData, - survey: mockSurvey, - responses: mockResponses, - environment: mockEnvironment, - user: mockUser, - environmentTags: mockEnvironmentTags, + name: "name", + type: "link", + environmentId: "env-1", + createdBy: null, + status: "draft", + } as TSurvey, + responses: [ + { id: "resp1", surveyId: "survey1", data: {}, createdAt: new Date(), updatedAt: new Date() }, + { id: "resp2", surveyId: "survey1", data: {}, createdAt: new Date(), updatedAt: new Date() }, + ] as TResponse[], + environment: { id: "env1" } as TEnvironment, + environmentTags: [] as TTag[], isReadOnly: false, fetchNextPage: vi.fn(), - hasMore: true, + hasMore: false, deleteResponses: vi.fn(), updateResponse: vi.fn(), isFetchingFirstPage: false, - locale: mockLocale, + locale: "en" as TUserLocale, }; +// Setup a container for React Testing Library before each test +beforeEach(() => { + const container = document.createElement("div"); + container.id = "test-container"; + document.body.appendChild(container); + + // Reset all toast mocks before each test + vi.mocked(toast.error).mockClear(); + vi.mocked(toast.success).mockClear(); + + // Create a mock anchor element for download tests + const mockAnchor = { + href: "", + click: vi.fn(), + style: {}, + }; + + // Update how we mock the document methods to avoid infinite recursion + const originalCreateElement = document.createElement.bind(document); + vi.spyOn(document, "createElement").mockImplementation((tagName) => { + if (tagName === "a") return mockAnchor as any; + return originalCreateElement(tagName); + }); + + vi.spyOn(document.body, "appendChild").mockReturnValue(null as any); + vi.spyOn(document.body, "removeChild").mockReturnValue(null as any); +}); + +// Cleanup after each test +afterEach(() => { + const container = document.getElementById("test-container"); + if (container) { + document.body.removeChild(container); + } + cleanup(); + vi.restoreAllMocks(); // Restore mocks after each test +}); + describe("ResponseTable", () => { afterEach(() => { - cleanup(); - localStorageMock.clear(); - vi.clearAllMocks(); + cleanup(); // Keep cleanup within describe as per instructions }); - test("renders skeleton when isFetchingFirstPage is true", () => { - render(); - // Check for skeleton elements (implementation detail, might need adjustment) - // For now, check that data is not directly rendered - expect(screen.queryByText("Response 1 Text")).not.toBeInTheDocument(); - // Check if table headers are still there - expect(screen.getByText("Created At")).toBeInTheDocument(); + test("renders the table with data", () => { + const container = document.getElementById("test-container"); + render(, { container: container! }); + expect(screen.getByRole("table")).toBeInTheDocument(); + expect(screen.getByTestId("table-toolbar")).toBeInTheDocument(); }); - test("loads settings from localStorage on mount", () => { - const savedOrder = ["q1", "createdAt", "select"]; - const savedVisibility = { createdAt: false }; - const savedExpanded = true; - localStorageMock.setItem(`${mockSurvey.id}-columnOrder`, JSON.stringify(savedOrder)); - localStorageMock.setItem(`${mockSurvey.id}-columnVisibility`, JSON.stringify(savedVisibility)); - localStorageMock.setItem(`${mockSurvey.id}-rowExpand`, JSON.stringify(savedExpanded)); - - render(); - - // Check if generateResponseTableColumns was called with the loaded expanded state - expect(vi.mocked(generateResponseTableColumns)).toHaveBeenCalledWith( - mockSurvey, - savedExpanded, - false, - expect.any(Function) - ); - }); - - test("saves settings to localStorage when they change", async () => { - const { rerender } = render(); - - // Simulate column order change via DND - const dragEvent: DragEndEvent = { - active: { id: "createdAt" }, - over: { id: "q1" }, - delta: { x: 0, y: 0 }, - activators: { x: 0, y: 0 }, - collisions: null, - overNode: null, - activeNode: null, - } as any; - act(() => { - (DndContextMock as any).lastOnDragEnd?.(dragEvent); - }); - rerender(); // Rerender to reflect state change if necessary for useEffect - expect(localStorageMock.setItem).toHaveBeenCalledWith( - `${mockSurvey.id}-columnOrder`, - JSON.stringify(["select", "q1", "createdAt"]) - ); - - // Simulate visibility change (e.g. via settings modal - direct state change for test) - // This would typically happen via table.setColumnVisibility, which is internal to useReactTable - // For this test, we'll assume a mechanism changes columnVisibility state - // This part is hard to test without deeper mocking of useReactTable or exposing setColumnVisibility - - // Simulate row expansion change - await userEvent.click(screen.getByTestId("toolbar-expand-toggle")); // Toggle to true - expect(localStorageMock.setItem).toHaveBeenCalledWith(`${mockSurvey.id}-rowExpand`, "true"); - }); - - test("handles column drag and drop", () => { - render(); - const dragEvent: DragEndEvent = { - active: { id: "createdAt" }, - over: { id: "q1" }, - delta: { x: 0, y: 0 }, - activators: { x: 0, y: 0 }, - collisions: null, - overNode: null, - activeNode: null, - } as any; - act(() => { - (DndContextMock as any).lastOnDragEnd?.(dragEvent); - }); - expect(arrayMoveMock).toHaveBeenCalledWith(expect.arrayContaining(["createdAt", "q1"]), 1, 2); // Example indices - expect(localStorageMock.setItem).toHaveBeenCalledWith( - `${mockSurvey.id}-columnOrder`, - JSON.stringify(["select", "q1", "createdAt"]) // Based on initial ['select', 'createdAt', 'q1'] - ); - }); - - test("interacts with DataTableToolbar: toggle expand, open settings, delete", async () => { - const deleteResponsesMock = vi.fn(); - const deleteResponseActionMock = vi.mocked(deleteResponseAction); - render(); - - // Toggle expand - await userEvent.click(screen.getByTestId("toolbar-expand-toggle")); - expect(vi.mocked(generateResponseTableColumns)).toHaveBeenCalledWith( - mockSurvey, - true, - false, - expect.any(Function) - ); - expect(localStorageMock.setItem).toHaveBeenCalledWith(`${mockSurvey.id}-rowExpand`, "true"); - - // Open settings - await userEvent.click(screen.getByTestId("toolbar-open-settings")); - expect(screen.getByTestId("data-table-settings-modal")).toBeInTheDocument(); - await userEvent.click(screen.getByText("Close Settings")); - expect(screen.queryByTestId("data-table-settings-modal")).not.toBeInTheDocument(); - - // Delete selected (mock table selection) - // This requires mocking table.getSelectedRowModel().rows - // For simplicity, we assume the toolbar button calls deleteRows correctly - // The mock for DataTableToolbar calls props.deleteRows with hardcoded IDs for now. - // To test properly, we'd need to mock table.getSelectedRowModel - // For now, let's assume the mock toolbar calls it. - // await userEvent.click(screen.getByTestId("toolbar-delete-selected")); - // expect(deleteResponsesMock).toHaveBeenCalledWith(["row1_id", "row2_id"]); // From mock toolbar - - // Delete single action - await userEvent.click(screen.getByTestId("toolbar-delete-single")); - expect(deleteResponseActionMock).toHaveBeenCalledWith({ responseId: "single_response_id" }); - }); - - test("calls fetchNextPage when 'Load More' is clicked", async () => { - const fetchNextPageMock = vi.fn(); - render(); - await userEvent.click(screen.getByText("common.load_more")); - expect(fetchNextPageMock).toHaveBeenCalled(); - }); - - test("does not show 'Load More' if hasMore is false", () => { - render(); - expect(screen.queryByText("common.load_more")).not.toBeInTheDocument(); - }); - - test("shows 'No results' when data is empty", () => { - render(); + test("renders no results message when data is empty", () => { + const container = document.getElementById("test-container"); + render(, { container: container! }); expect(screen.getByText("common.no_results")).toBeInTheDocument(); }); - test("deleteResponse function calls deleteResponseAction", async () => { - render(); - // This function is called by DataTableToolbar's deleteAction prop - // We can trigger it via the mocked DataTableToolbar - await userEvent.click(screen.getByTestId("toolbar-delete-single")); - expect(vi.mocked(deleteResponseAction)).toHaveBeenCalledWith({ responseId: "single_response_id" }); + test("renders load more button when hasMore is true", () => { + const container = document.getElementById("test-container"); + render(, { container: container! }); + expect(screen.getByText("common.load_more")).toBeInTheDocument(); + }); + + test("calls fetchNextPage when load more button is clicked", async () => { + const container = document.getElementById("test-container"); + render(, { container: container! }); + const loadMoreButton = screen.getByText("common.load_more"); + await userEvent.click(loadMoreButton); + expect(mockProps.fetchNextPage).toHaveBeenCalledTimes(1); + }); + + test("opens settings modal when toolbar button is clicked", async () => { + const container = document.getElementById("test-container"); + render(, { container: container! }); + const openSettingsButton = screen.getByTestId("open-settings"); + await userEvent.click(openSettingsButton); + expect(screen.getByTestId("settings-modal")).toBeInTheDocument(); + }); + + test("toggles expanded state when toolbar button is clicked", async () => { + const container = document.getElementById("test-container"); + render(, { container: container! }); + const toggleExpandButton = screen.getByTestId("toggle-expand"); + + // Initially might be null, first click should set it to true + await userEvent.click(toggleExpandButton); + expect(mockLocalStorage.setItem).toHaveBeenCalledWith("survey1-rowExpand", expect.any(String)); + }); + + test("calls downloadSelectedRows with csv format when toolbar button is clicked", async () => { + vi.mocked(getResponsesDownloadUrlAction).mockResolvedValueOnce({ + data: "https://download.url/file.csv", + }); + + const container = document.getElementById("test-container"); + render(, { container: container! }); + const downloadCsvButton = screen.getByTestId("download-csv"); + await userEvent.click(downloadCsvButton); + + expect(getResponsesDownloadUrlAction).toHaveBeenCalledWith({ + surveyId: "survey1", + format: "csv", + filterCriteria: { responseIds: [] }, + }); + + // Check if link was created and clicked + expect(document.createElement).toHaveBeenCalledWith("a"); + const mockLink = document.createElement("a"); + expect(mockLink.href).toBe("https://download.url/file.csv"); + expect(document.body.appendChild).toHaveBeenCalled(); + expect(mockLink.click).toHaveBeenCalled(); + expect(document.body.removeChild).toHaveBeenCalled(); + }); + + test("calls downloadSelectedRows with xlsx format when toolbar button is clicked", async () => { + vi.mocked(getResponsesDownloadUrlAction).mockResolvedValueOnce({ + data: "https://download.url/file.xlsx", + }); + + const container = document.getElementById("test-container"); + render(, { container: container! }); + const downloadXlsxButton = screen.getByTestId("download-xlsx"); + await userEvent.click(downloadXlsxButton); + + expect(getResponsesDownloadUrlAction).toHaveBeenCalledWith({ + surveyId: "survey1", + format: "xlsx", + filterCriteria: { responseIds: [] }, + }); + + // Check if link was created and clicked + expect(document.createElement).toHaveBeenCalledWith("a"); + const mockLink = document.createElement("a"); + expect(mockLink.href).toBe("https://download.url/file.xlsx"); + expect(document.body.appendChild).toHaveBeenCalled(); + expect(mockLink.click).toHaveBeenCalled(); + expect(document.body.removeChild).toHaveBeenCalled(); + }); + + // Test response modal + test("opens and closes response modal when a cell is clicked", async () => { + const container = document.getElementById("test-container"); + render(, { container: container! }); + const cell = screen.getByTestId("cell-resp1_select-resp1"); + await userEvent.click(cell); + expect(screen.getByTestId("response-modal")).toBeInTheDocument(); + // Close the modal + const closeButton = screen.getByText("Close"); + await userEvent.click(closeButton); + + // Modal should be closed now + expect(screen.queryByTestId("response-modal")).not.toBeInTheDocument(); + }); + + test("shows error toast when download action returns error", async () => { + const errorMsg = "Download failed"; + vi.mocked(getResponsesDownloadUrlAction).mockResolvedValueOnce({ + data: undefined, + serverError: errorMsg, + }); + vi.mocked(getFormattedErrorMessage).mockReturnValueOnce(errorMsg); + + // Reset document.createElement spy to fix the last test + vi.mocked(document.createElement).mockClear(); + + const container = document.getElementById("test-container"); + render(, { container: container! }); + const downloadCsvButton = screen.getByTestId("download-csv"); + await userEvent.click(downloadCsvButton); + + await waitFor(() => { + expect(getResponsesDownloadUrlAction).toHaveBeenCalled(); + expect(toast.error).toHaveBeenCalledWith("environments.surveys.responses.error_downloading_responses"); + }); + }); + + test("shows default error toast when download action returns no data", async () => { + vi.mocked(getResponsesDownloadUrlAction).mockResolvedValueOnce({ + data: undefined, + }); + vi.mocked(getFormattedErrorMessage).mockReturnValueOnce(""); + + const container = document.getElementById("test-container"); + render(, { container: container! }); + const downloadCsvButton = screen.getByTestId("download-csv"); + await userEvent.click(downloadCsvButton); + + await waitFor(() => { + expect(getResponsesDownloadUrlAction).toHaveBeenCalled(); + expect(toast.error).toHaveBeenCalledWith("environments.surveys.responses.error_downloading_responses"); + }); + }); + + test("shows error toast when download action throws exception", async () => { + vi.mocked(getResponsesDownloadUrlAction).mockRejectedValueOnce(new Error("Network error")); + + const container = document.getElementById("test-container"); + render(, { container: container! }); + const downloadCsvButton = screen.getByTestId("download-csv"); + await userEvent.click(downloadCsvButton); + + await waitFor(() => { + expect(getResponsesDownloadUrlAction).toHaveBeenCalled(); + expect(toast.error).toHaveBeenCalledWith("environments.surveys.responses.error_downloading_responses"); + }); + }); + + test("does not create download link when download action fails", async () => { + // Clear any previous calls to document.createElement + vi.mocked(document.createElement).mockClear(); + + vi.mocked(getResponsesDownloadUrlAction).mockResolvedValueOnce({ + data: undefined, + serverError: "Download failed", + }); + + // Create a fresh spy for createElement for this test only + const createElementSpy = vi.spyOn(document, "createElement"); + + const container = document.getElementById("test-container"); + render(, { container: container! }); + const downloadCsvButton = screen.getByTestId("download-csv"); + await userEvent.click(downloadCsvButton); + + await waitFor(() => { + expect(getResponsesDownloadUrlAction).toHaveBeenCalled(); + // Check specifically for "a" element creation, not any element + expect(createElementSpy).not.toHaveBeenCalledWith("a"); + }); + }); + + test("loads saved settings from localStorage on mount", () => { + const columnOrder = ["status", "person", "createdAt", "select"]; + const columnVisibility = { status: false }; + const isExpanded = true; + + mockLocalStorage.getItem.mockImplementation((key) => { + if (key === "survey1-columnOrder") return JSON.stringify(columnOrder); + if (key === "survey1-columnVisibility") return JSON.stringify(columnVisibility); + if (key === "survey1-rowExpand") return JSON.stringify(isExpanded); + return null; + }); + + const container = document.getElementById("test-container"); + render(, { container: container! }); + + // Verify localStorage calls + expect(mockLocalStorage.getItem).toHaveBeenCalledWith("survey1-columnOrder"); + expect(mockLocalStorage.getItem).toHaveBeenCalledWith("survey1-columnVisibility"); + expect(mockLocalStorage.getItem).toHaveBeenCalledWith("survey1-rowExpand"); + + // The mock for generateResponseTableColumns returns this order: + // ["select", "createdAt", "person", "status"] + // Only visible columns should be rendered, in this order + const expectedHeaders = ["select", "createdAt", "person"]; + const headers = screen.getAllByTestId(/^header-/); + expect(headers).toHaveLength(expectedHeaders.length); + expectedHeaders.forEach((columnId, index) => { + expect(headers[index]).toHaveAttribute("data-testid", `header-${columnId}`); + }); + + // Verify column visibility is applied + const statusHeader = screen.queryByTestId("header-status"); + expect(statusHeader).not.toBeInTheDocument(); + + // Verify row expansion is applied + const toggleExpandButton = screen.getByTestId("toggle-expand"); + expect(toggleExpandButton).toHaveAttribute("aria-pressed", "true"); }); }); diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx index c2bc2963cf..d901966395 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTable.tsx @@ -3,6 +3,7 @@ import { ResponseCardModal } from "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseCardModal"; import { ResponseTableCell } from "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTableCell"; import { generateResponseTableColumns } from "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/responses/components/ResponseTableColumns"; +import { getResponsesDownloadUrlAction } from "@/app/(app)/environments/[environmentId]/surveys/[surveyId]/actions"; import { deleteResponseAction } from "@/modules/analysis/components/SingleResponseCard/actions"; import { Button } from "@/modules/ui/components/button"; import { @@ -25,15 +26,16 @@ import { import { restrictToHorizontalAxis } from "@dnd-kit/modifiers"; import { SortableContext, arrayMove, horizontalListSortingStrategy } from "@dnd-kit/sortable"; import { useAutoAnimate } from "@formkit/auto-animate/react"; +import * as Sentry from "@sentry/nextjs"; import { VisibilityState, getCoreRowModel, useReactTable } from "@tanstack/react-table"; import { useTranslate } from "@tolgee/react"; import { useEffect, useMemo, useState } from "react"; +import toast from "react-hot-toast"; import { TEnvironment } from "@formbricks/types/environment"; import { TResponse, TResponseTableData } from "@formbricks/types/responses"; import { TSurvey } from "@formbricks/types/surveys/types"; import { TTag } from "@formbricks/types/tags"; -import { TUser } from "@formbricks/types/user"; -import { TUserLocale } from "@formbricks/types/user"; +import { TUser, TUserLocale } from "@formbricks/types/user"; interface ResponseTableProps { data: TResponseTableData[]; @@ -180,6 +182,32 @@ export const ResponseTable = ({ await deleteResponseAction({ responseId }); }; + // Handle downloading selected responses + const downloadSelectedRows = async (responseIds: string[], format: "csv" | "xlsx") => { + try { + const downloadResponse = await getResponsesDownloadUrlAction({ + surveyId: survey.id, + format: format, + filterCriteria: { responseIds }, + }); + + if (downloadResponse?.data) { + const link = document.createElement("a"); + link.href = downloadResponse.data; + link.download = ""; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } else { + toast.error(t("environments.surveys.responses.error_downloading_responses")); + } + } catch (error) { + Sentry.captureException(error); + toast.error(t("environments.surveys.responses.error_downloading_responses")); + } + }; + return (
diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/survey-qr-code.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/survey-qr-code.tsx index 2a74b21961..700739b482 100644 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/survey-qr-code.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/(analysis)/summary/lib/survey-qr-code.tsx @@ -28,7 +28,7 @@ export const useSurveyQRCode = (surveyUrl: string) => { } catch (error) { toast.error(t("environments.surveys.summary.failed_to_generate_qr_code")); } - }, [surveyUrl]); + }, [surveyUrl, t]); const downloadQRCode = () => { try { diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/components/CustomFilter.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/components/CustomFilter.tsx index 484d010efe..87170e17d7 100755 --- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/components/CustomFilter.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/components/CustomFilter.tsx @@ -250,6 +250,7 @@ export const CustomFilter = ({ survey }: CustomFilterProps) => { if (responsesDownloadUrlResponse?.data) { const link = document.createElement("a"); link.href = responsesDownloadUrlResponse.data; + link.download = ""; document.body.appendChild(link); link.click(); document.body.removeChild(link); diff --git a/apps/web/app/api/v1/og/route.tsx b/apps/web/app/api/v1/og/route.tsx index bc8b17d5b7..092a016634 100644 --- a/apps/web/app/api/v1/og/route.tsx +++ b/apps/web/app/api/v1/og/route.tsx @@ -7,39 +7,133 @@ export const GET = async (req: NextRequest) => { return new ImageResponse( ( -
+
-
-
-
-

+
+
+
+

{name}

-
-
- + diff --git a/apps/web/app/sentry/SentryProvider.test.tsx b/apps/web/app/sentry/SentryProvider.test.tsx index 70c66b793e..1756efe45a 100644 --- a/apps/web/app/sentry/SentryProvider.test.tsx +++ b/apps/web/app/sentry/SentryProvider.test.tsx @@ -38,7 +38,7 @@ describe("SentryProvider", () => { expect(initSpy).toHaveBeenCalledWith( expect.objectContaining({ dsn: sentryDsn, - tracesSampleRate: 1, + tracesSampleRate: 0, debug: false, replaysOnErrorSampleRate: 1.0, replaysSessionSampleRate: 0.1, @@ -81,6 +81,26 @@ describe("SentryProvider", () => { expect(screen.getByTestId("child")).toHaveTextContent("Test Content"); }); + test("does not reinitialize Sentry when props change after initial render", () => { + const initSpy = vi.spyOn(Sentry, "init").mockImplementation(() => undefined); + + const { rerender } = render( + +
Test Content
+
+ ); + + expect(initSpy).toHaveBeenCalledTimes(1); + + rerender( + +
Test Content
+
+ ); + + expect(initSpy).toHaveBeenCalledTimes(1); + }); + test("processes beforeSend correctly", () => { const initSpy = vi.spyOn(Sentry, "init").mockImplementation(() => undefined); @@ -109,4 +129,36 @@ describe("SentryProvider", () => { const hintWithoutError = { originalException: undefined }; expect(beforeSend(dummyEvent, hintWithoutError)).toEqual(dummyEvent); }); + + test("processes beforeSend correctly when hint.originalException is not an Error object", () => { + const initSpy = vi.spyOn(Sentry, "init").mockImplementation(() => undefined); + + render( + +
Test Content
+
+ ); + + const config = initSpy.mock.calls[0][0]; + expect(config).toHaveProperty("beforeSend"); + const beforeSend = config.beforeSend; + + if (!beforeSend) { + throw new Error("beforeSend is not defined"); + } + + const dummyEvent = { some: "event" } as unknown as Sentry.ErrorEvent; + + const hintWithString = { originalException: "string exception" }; + expect(() => beforeSend(dummyEvent, hintWithString)).not.toThrow(); + expect(beforeSend(dummyEvent, hintWithString)).toEqual(dummyEvent); + + const hintWithNumber = { originalException: 123 }; + expect(() => beforeSend(dummyEvent, hintWithNumber)).not.toThrow(); + expect(beforeSend(dummyEvent, hintWithNumber)).toEqual(dummyEvent); + + const hintWithNull = { originalException: null }; + expect(() => beforeSend(dummyEvent, hintWithNull)).not.toThrow(); + expect(beforeSend(dummyEvent, hintWithNull)).toEqual(dummyEvent); + }); }); diff --git a/apps/web/app/sentry/SentryProvider.tsx b/apps/web/app/sentry/SentryProvider.tsx index beb2d6c06f..d67b399135 100644 --- a/apps/web/app/sentry/SentryProvider.tsx +++ b/apps/web/app/sentry/SentryProvider.tsx @@ -15,8 +15,8 @@ export const SentryProvider = ({ children, sentryDsn, isEnabled }: SentryProvide Sentry.init({ dsn: sentryDsn, - // Adjust this value in production, or use tracesSampler for greater control - tracesSampleRate: 1, + // No tracing while Sentry doesn't update to telemetry 2.0.0 - https://github.com/getsentry/sentry-javascript/issues/15737 + tracesSampleRate: 0, // Setting this option to true will print useful information to the console while you're setting up Sentry. debug: false, diff --git a/apps/web/lib/constants.ts b/apps/web/lib/constants.ts index 7c1877f808..b72f0d8901 100644 --- a/apps/web/lib/constants.ts +++ b/apps/web/lib/constants.ts @@ -282,4 +282,4 @@ export const SENTRY_DSN = env.SENTRY_DSN; export const PROMETHEUS_ENABLED = env.PROMETHEUS_ENABLED === "1"; -export const DISABLE_USER_MANAGEMENT = env.DISABLE_USER_MANAGEMENT === "1"; +export const USER_MANAGEMENT_MINIMUM_ROLE = env.USER_MANAGEMENT_MINIMUM_ROLE ?? "manager"; diff --git a/apps/web/lib/env.ts b/apps/web/lib/env.ts index c7dc1fd3af..56d1ce8b7b 100644 --- a/apps/web/lib/env.ts +++ b/apps/web/lib/env.ts @@ -104,7 +104,7 @@ export const env = createEnv({ NODE_ENV: z.enum(["development", "production", "test"]).optional(), PROMETHEUS_EXPORTER_PORT: z.string().optional(), PROMETHEUS_ENABLED: z.enum(["1", "0"]).optional(), - DISABLE_USER_MANAGEMENT: z.enum(["1", "0"]).optional(), + USER_MANAGEMENT_MINIMUM_ROLE: z.enum(["owner", "manager", "disabled"]).optional(), }, /* @@ -199,6 +199,6 @@ export const env = createEnv({ NODE_ENV: process.env.NODE_ENV, PROMETHEUS_ENABLED: process.env.PROMETHEUS_ENABLED, PROMETHEUS_EXPORTER_PORT: process.env.PROMETHEUS_EXPORTER_PORT, - DISABLE_USER_MANAGEMENT: process.env.DISABLE_USER_MANAGEMENT, + USER_MANAGEMENT_MINIMUM_ROLE: process.env.USER_MANAGEMENT_MINIMUM_ROLE, }, }); diff --git a/apps/web/lib/membership/utils.ts b/apps/web/lib/membership/utils.ts index 404cf3829f..7b9596ee04 100644 --- a/apps/web/lib/membership/utils.ts +++ b/apps/web/lib/membership/utils.ts @@ -13,3 +13,21 @@ export const getAccessFlags = (role?: TOrganizationRole) => { isMember, }; }; + +export const getUserManagementAccess = ( + role: TOrganizationRole, + minimumRole: "owner" | "manager" | "disabled" +): boolean => { + // If minimum role is "disabled", no one has access + if (minimumRole === "disabled") { + return false; + } + if (minimumRole === "owner") { + return role === "owner"; + } + + if (minimumRole === "manager") { + return role === "owner" || role === "manager"; + } + return false; +}; diff --git a/apps/web/lib/response/utils.ts b/apps/web/lib/response/utils.ts index 85481ec79a..b7997ba6aa 100644 --- a/apps/web/lib/response/utils.ts +++ b/apps/web/lib/response/utils.ts @@ -22,6 +22,43 @@ export const calculateTtcTotal = (ttc: TResponseTtc) => { return result; }; +const createFilterTags = (tags: TResponseFilterCriteria["tags"]) => { + if (!tags) return []; + + const filterTags: Record[] = []; + + if (tags?.applied) { + const appliedTags = tags.applied.map((name) => ({ + tags: { + some: { + tag: { + name, + }, + }, + }, + })); + filterTags.push(appliedTags); + } + + if (tags?.notApplied) { + const notAppliedTags = { + tags: { + every: { + tag: { + name: { + notIn: tags.notApplied, + }, + }, + }, + }, + }; + + filterTags.push(notAppliedTags); + } + + return filterTags.flat(); +}; + export const buildWhereClause = (survey: TSurvey, filterCriteria?: TResponseFilterCriteria) => { const whereClause: Prisma.ResponseWhereInput["AND"] = []; @@ -49,39 +86,9 @@ export const buildWhereClause = (survey: TSurvey, filterCriteria?: TResponseFilt // For Tags if (filterCriteria?.tags) { - const tags: Record[] = []; - - if (filterCriteria?.tags?.applied) { - const appliedTags = filterCriteria.tags.applied.map((name) => ({ - tags: { - some: { - tag: { - name, - }, - }, - }, - })); - tags.push(appliedTags); - } - - if (filterCriteria?.tags?.notApplied) { - const notAppliedTags = { - tags: { - every: { - tag: { - name: { - notIn: filterCriteria.tags.notApplied, - }, - }, - }, - }, - }; - - tags.push(notAppliedTags); - } - + const tagFilters = createFilterTags(filterCriteria.tags); whereClause.push({ - AND: tags.flat(), + AND: tagFilters, }); } @@ -442,6 +449,13 @@ export const buildWhereClause = (survey: TSurvey, filterCriteria?: TResponseFilt AND: data, }); } + + // filter by explicit response IDs + if (filterCriteria?.responseIds) { + whereClause.push({ + id: { in: filterCriteria.responseIds }, + }); + } return { AND: whereClause }; }; diff --git a/apps/web/lib/time.test.ts b/apps/web/lib/time.test.ts index 3143110f95..9eae8ceb1d 100644 --- a/apps/web/lib/time.test.ts +++ b/apps/web/lib/time.test.ts @@ -15,12 +15,20 @@ import { describe("Time Utilities", () => { describe("convertDateString", () => { test("should format date string correctly", () => { - expect(convertDateString("2024-03-20")).toBe("Mar 20, 2024"); + expect(convertDateString("2024-03-20:12:30:00")).toBe("Mar 20, 2024"); }); test("should return empty string for empty input", () => { expect(convertDateString("")).toBe(""); }); + + test("should return null for null input", () => { + expect(convertDateString(null as any)).toBe(null); + }); + + test("should handle invalid date strings", () => { + expect(convertDateString("not-a-date")).toBe("Invalid Date"); + }); }); describe("convertDateTimeString", () => { @@ -73,7 +81,7 @@ describe("Time Utilities", () => { describe("formatDate", () => { test("should format date correctly", () => { - const date = new Date("2024-03-20"); + const date = new Date(2024, 2, 20); // March is month 2 (0-based) expect(formatDate(date)).toBe("March 20, 2024"); }); }); diff --git a/apps/web/lib/time.ts b/apps/web/lib/time.ts index da3f5c27d8..c0d81c088b 100644 --- a/apps/web/lib/time.ts +++ b/apps/web/lib/time.ts @@ -2,11 +2,16 @@ import { formatDistance, intlFormat } from "date-fns"; import { de, enUS, fr, pt, ptBR, zhTW } from "date-fns/locale"; import { TUserLocale } from "@formbricks/types/user"; -export const convertDateString = (dateString: string) => { +export const convertDateString = (dateString: string | null) => { + if (dateString === null) return null; if (!dateString) { return dateString; } + const date = new Date(dateString); + if (isNaN(date.getTime())) { + return "Invalid Date"; + } return intlFormat( date, { diff --git a/apps/web/lib/utils/action-client.ts b/apps/web/lib/utils/action-client.ts index 555336d7f1..8c5c6ba908 100644 --- a/apps/web/lib/utils/action-client.ts +++ b/apps/web/lib/utils/action-client.ts @@ -1,5 +1,6 @@ import { getUser } from "@/lib/user/service"; import { authOptions } from "@/modules/auth/lib/authOptions"; +import * as Sentry from "@sentry/nextjs"; import { getServerSession } from "next-auth"; import { DEFAULT_SERVER_ERROR_MESSAGE, createSafeActionClient } from "next-safe-action"; import { logger } from "@formbricks/logger"; @@ -14,6 +15,8 @@ import { export const actionClient = createSafeActionClient({ handleServerError(e) { + Sentry.captureException(e); + if ( e instanceof ResourceNotFoundError || e instanceof AuthorizationError || diff --git a/apps/web/lib/utils/hooks/useIntervalWhenFocused.ts b/apps/web/lib/utils/hooks/useIntervalWhenFocused.ts index b2b0df42b0..bf800bad1d 100644 --- a/apps/web/lib/utils/hooks/useIntervalWhenFocused.ts +++ b/apps/web/lib/utils/hooks/useIntervalWhenFocused.ts @@ -1,4 +1,4 @@ -import { useEffect, useRef } from "react"; +import { useCallback, useEffect, useRef } from "react"; export const useIntervalWhenFocused = ( callback: () => void, @@ -8,7 +8,7 @@ export const useIntervalWhenFocused = ( ) => { const intervalRef = useRef(null); - const handleFocus = () => { + const handleFocus = useCallback(() => { if (isActive) { if (shouldExecuteImmediately) { // Execute the callback immediately when the tab comes into focus @@ -20,7 +20,7 @@ export const useIntervalWhenFocused = ( callback(); }, intervalDuration); } - }; + }, [isActive, intervalDuration, callback, shouldExecuteImmediately]); const handleBlur = () => { // Clear the interval when the tab loses focus @@ -46,7 +46,7 @@ export const useIntervalWhenFocused = ( window.removeEventListener("focus", handleFocus); window.removeEventListener("blur", handleBlur); }; - }, [isActive, intervalDuration]); + }, [isActive, intervalDuration, handleFocus]); }; export default useIntervalWhenFocused; diff --git a/apps/web/locales/de-DE.json b/apps/web/locales/de-DE.json index 9ae8e4cb51..04c1517c34 100644 --- a/apps/web/locales/de-DE.json +++ b/apps/web/locales/de-DE.json @@ -1667,6 +1667,7 @@ "device": "Gerät", "device_info": "Geräteinfo", "email": "E-Mail", + "error_downloading_responses": "Beim Herunterladen der Antworten ist ein Fehler aufgetreten", "first_name": "Vorname", "how_to_identify_users": "Wie man Benutzer identifiziert", "last_name": "Nachname", @@ -1764,6 +1765,8 @@ "quickstart_web_apps": "Schnellstart: Web-Apps", "quickstart_web_apps_description": "Bitte folge der Schnellstartanleitung, um loszulegen:", "results_are_public": "Ergebnisse sind öffentlich", + "selected_responses_csv": "Ausgewählte Antworten (CSV)", + "selected_responses_excel": "Ausgewählte Antworten (Excel)", "send_preview": "Vorschau senden", "send_to_panel": "An das Panel senden", "setup_instructions": "Einrichtung", diff --git a/apps/web/locales/en-US.json b/apps/web/locales/en-US.json index fa83be87e8..4e845f829a 100644 --- a/apps/web/locales/en-US.json +++ b/apps/web/locales/en-US.json @@ -1667,6 +1667,7 @@ "device": "Device", "device_info": "Device info", "email": "Email", + "error_downloading_responses": "An error occured while downloading responses", "first_name": "First Name", "how_to_identify_users": "How to identify users", "last_name": "Last Name", @@ -1764,6 +1765,8 @@ "quickstart_web_apps": "Quickstart: Web apps", "quickstart_web_apps_description": "Please follow the Quickstart guide to get started:", "results_are_public": "Results are public", + "selected_responses_csv": "Selected responses (CSV)", + "selected_responses_excel": "Selected responses (Excel)", "send_preview": "Send preview", "send_to_panel": "Send to panel", "setup_instructions": "Setup instructions", diff --git a/apps/web/locales/fr-FR.json b/apps/web/locales/fr-FR.json index beeb99bee8..06a52303a9 100644 --- a/apps/web/locales/fr-FR.json +++ b/apps/web/locales/fr-FR.json @@ -1667,6 +1667,7 @@ "device": "Dispositif", "device_info": "Informations sur l'appareil", "email": "Email", + "error_downloading_responses": "Une erreur s'est produite lors du téléchargement des réponses", "first_name": "Prénom", "how_to_identify_users": "Comment identifier les utilisateurs", "last_name": "Nom de famille", @@ -1764,6 +1765,8 @@ "quickstart_web_apps": "Démarrage rapide : Applications web", "quickstart_web_apps_description": "Veuillez suivre le guide de démarrage rapide pour commencer :", "results_are_public": "Les résultats sont publics.", + "selected_responses_csv": "Réponses sélectionnées (CSV)", + "selected_responses_excel": "Réponses sélectionnées (Excel)", "send_preview": "Envoyer un aperçu", "send_to_panel": "Envoyer au panneau", "setup_instructions": "Instructions d'installation", diff --git a/apps/web/locales/pt-BR.json b/apps/web/locales/pt-BR.json index 980ad73d27..94baa75a99 100644 --- a/apps/web/locales/pt-BR.json +++ b/apps/web/locales/pt-BR.json @@ -1667,6 +1667,7 @@ "device": "dispositivo", "device_info": "Informações do dispositivo", "email": "Email", + "error_downloading_responses": "Ocorreu um erro ao baixar respostas", "first_name": "Primeiro Nome", "how_to_identify_users": "Como identificar usuários", "last_name": "Sobrenome", @@ -1764,6 +1765,8 @@ "quickstart_web_apps": "Início rápido: Aplicativos web", "quickstart_web_apps_description": "Por favor, siga o guia de início rápido para começar:", "results_are_public": "Os resultados são públicos", + "selected_responses_csv": "Respostas selecionadas (CSV)", + "selected_responses_excel": "Respostas selecionadas (Excel)", "send_preview": "Enviar prévia", "send_to_panel": "Enviar para o painel", "setup_instructions": "Instruções de configuração", diff --git a/apps/web/locales/pt-PT.json b/apps/web/locales/pt-PT.json index 4fa90ed5be..4cb0be4996 100644 --- a/apps/web/locales/pt-PT.json +++ b/apps/web/locales/pt-PT.json @@ -1667,6 +1667,7 @@ "device": "Dispositivo", "device_info": "Informações do dispositivo", "email": "Email", + "error_downloading_responses": "Ocorreu um erro ao transferir respostas", "first_name": "Primeiro Nome", "how_to_identify_users": "Como identificar utilizadores", "last_name": "Apelido", @@ -1764,6 +1765,8 @@ "quickstart_web_apps": "Início rápido: Aplicações web", "quickstart_web_apps_description": "Por favor, siga o guia de início rápido para começar:", "results_are_public": "Os resultados são públicos", + "selected_responses_csv": "Respostas selecionadas (CSV)", + "selected_responses_excel": "Respostas selecionadas (Excel)", "send_preview": "Enviar pré-visualização", "send_to_panel": "Enviar para painel", "setup_instructions": "Instruções de configuração", diff --git a/apps/web/locales/zh-Hant-TW.json b/apps/web/locales/zh-Hant-TW.json index 9c9ff8ff19..766bfdb91f 100644 --- a/apps/web/locales/zh-Hant-TW.json +++ b/apps/web/locales/zh-Hant-TW.json @@ -1667,6 +1667,7 @@ "device": "裝置", "device_info": "裝置資訊", "email": "電子郵件", + "error_downloading_responses": "下載回應時發生錯誤", "first_name": "名字", "how_to_identify_users": "如何識別使用者", "last_name": "姓氏", @@ -1764,6 +1765,8 @@ "quickstart_web_apps": "快速入門:Web apps", "quickstart_web_apps_description": "請按照 Quickstart 指南開始:", "results_are_public": "結果是公開的", + "selected_responses_csv": "選擇的回應 (CSV)", + "selected_responses_excel": "選擇的回應 (Excel)", "send_preview": "發送預覽", "send_to_panel": "發送到小組", "setup_instructions": "設定說明", diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index 09095ae90a..97178eee2b 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -12,13 +12,12 @@ import { isClientSideApiRoute, isForgotPasswordRoute, isLoginRoute, - isManagementApiRoute, isShareUrlRoute, isSignupRoute, isSyncWithUserIdentificationEndpoint, isVerifyEmailRoute, } from "@/app/middleware/endpoint-validator"; -import { E2E_TESTING, IS_PRODUCTION, RATE_LIMITING_DISABLED, SURVEY_URL, WEBAPP_URL } from "@/lib/constants"; +import { IS_PRODUCTION, RATE_LIMITING_DISABLED, SURVEY_URL, WEBAPP_URL } from "@/lib/constants"; import { isValidCallbackUrl } from "@/lib/utils/url"; import { logApiError } from "@/modules/api/v2/lib/utils"; import { ApiErrorResponseV2 } from "@/modules/api/v2/types/api-error"; @@ -28,24 +27,6 @@ import { NextRequest, NextResponse } from "next/server"; import { v4 as uuidv4 } from "uuid"; import { logger } from "@formbricks/logger"; -const enforceHttps = (request: NextRequest): Response | null => { - const forwardedProto = request.headers.get("x-forwarded-proto") ?? "http"; - if (IS_PRODUCTION && !E2E_TESTING && forwardedProto !== "https") { - const apiError: ApiErrorResponseV2 = { - type: "forbidden", - details: [ - { - field: "", - issue: "Only HTTPS connections are allowed on the management endpoints.", - }, - ], - }; - logApiError(request, apiError); - return NextResponse.json(apiError, { status: 403 }); - } - return null; -}; - const handleAuth = async (request: NextRequest): Promise => { const token = await getToken({ req: request as any }); @@ -132,12 +113,6 @@ export const middleware = async (originalRequest: NextRequest) => { }, }); - // Enforce HTTPS for management endpoints - if (isManagementApiRoute(request.nextUrl.pathname)) { - const httpsResponse = enforceHttps(request); - if (httpsResponse) return httpsResponse; - } - // Handle authentication const authResponse = await handleAuth(request); if (authResponse) return authResponse; diff --git a/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.test.ts b/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.test.ts index 2eaaa7a72d..f923182373 100644 --- a/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.test.ts +++ b/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.test.ts @@ -240,4 +240,126 @@ describe("updateUser", () => { expect(result.state.data).toEqual(expect.objectContaining(mockUserState)); expect(result.messages).toEqual([]); }); + + test("should handle email attribute update with ignoreEmailAttribute flag", async () => { + vi.mocked(getContactByUserIdWithAttributes).mockResolvedValue(mockContact); + const newAttributes = { email: "new@example.com", name: "John Doe" }; + vi.mocked(updateAttributes).mockResolvedValue({ + success: true, + messages: [], + ignoreEmailAttribute: true, + }); + + vi.mocked(getUserState).mockResolvedValue({ + ...mockUserState, + }); + + const result = await updateUser(mockEnvironmentId, mockUserId, "desktop", newAttributes); + + expect(updateAttributes).toHaveBeenCalledWith( + mockContactId, + mockUserId, + mockEnvironmentId, + newAttributes + ); + // Email should not be included in the final attributes + expect(result.state.data).toEqual( + expect.objectContaining({ + ...mockUserState, + }) + ); + }); + + test("should handle failed attribute update gracefully", async () => { + vi.mocked(getContactByUserIdWithAttributes).mockResolvedValue(mockContact); + const newAttributes = { company: "Formbricks" }; + vi.mocked(updateAttributes).mockResolvedValue({ + success: false, + messages: ["Update failed"], + }); + + const result = await updateUser(mockEnvironmentId, mockUserId, "desktop", newAttributes); + + expect(updateAttributes).toHaveBeenCalledWith( + mockContactId, + mockUserId, + mockEnvironmentId, + newAttributes + ); + // Should still return state even if update failed + expect(result.state.data).toEqual(expect.objectContaining(mockUserState)); + expect(result.messages).toEqual(["Update failed"]); + }); + + test("should handle multiple attribute updates correctly", async () => { + vi.mocked(getContactByUserIdWithAttributes).mockResolvedValue(mockContact); + const newAttributes = { + company: "Formbricks", + role: "Developer", + language: "en", + country: "US", + }; + vi.mocked(updateAttributes).mockResolvedValue({ + success: true, + messages: ["Attributes updated successfully"], + }); + + const result = await updateUser(mockEnvironmentId, mockUserId, "desktop", newAttributes); + + expect(updateAttributes).toHaveBeenCalledWith( + mockContactId, + mockUserId, + mockEnvironmentId, + newAttributes + ); + expect(result.state.data?.language).toBe("en"); + expect(result.messages).toEqual(["Attributes updated successfully"]); + }); + + test("should handle contact creation with multiple initial attributes", async () => { + vi.mocked(getContactByUserIdWithAttributes).mockResolvedValue(null); + const initialAttributes = { + userId: mockUserId, + email: "test@example.com", + name: "Test User", + }; + vi.mocked(prisma.contact.create).mockResolvedValue({ + id: mockContactId, + attributes: [ + { attributeKey: { key: "userId" }, value: mockUserId }, + { attributeKey: { key: "email" }, value: "test@example.com" }, + { attributeKey: { key: "name" }, value: "Test User" }, + ], + } as any); + + const result = await updateUser(mockEnvironmentId, mockUserId, "desktop", initialAttributes); + + expect(prisma.contact.create).toHaveBeenCalledWith({ + data: { + environment: { connect: { id: mockEnvironmentId } }, + attributes: { + create: [ + { + attributeKey: { + connect: { key_environmentId: { key: "userId", environmentId: mockEnvironmentId } }, + }, + value: mockUserId, + }, + ], + }, + }, + select: { + id: true, + attributes: { + select: { attributeKey: { select: { key: true } }, value: true }, + }, + }, + }); + expect(contactCache.revalidate).toHaveBeenCalledWith({ + environmentId: mockEnvironmentId, + userId: mockUserId, + id: mockContactId, + }); + expect(result.state.data).toEqual(expect.objectContaining(mockUserState)); + }); }); diff --git a/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.ts b/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.ts index 56846d1970..0ec1c017e1 100644 --- a/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.ts +++ b/apps/web/modules/ee/contacts/api/v1/client/[environmentId]/user/lib/update-user.ts @@ -85,20 +85,26 @@ export const updateUser = async ( } if (shouldUpdate) { - const { success, messages: updateAttrMessages } = await updateAttributes( - contact.id, - userId, - environmentId, - attributes - ); + const { + success, + messages: updateAttrMessages, + ignoreEmailAttribute, + } = await updateAttributes(contact.id, userId, environmentId, attributes); messages = updateAttrMessages ?? []; // If the attributes update was successful and the language attribute was provided, set the language if (success) { + let attributesToUpdate = { ...attributes }; + + if (ignoreEmailAttribute) { + const { email, ...rest } = attributes; + attributesToUpdate = rest; + } + contactAttributes = { ...contactAttributes, - ...attributes, + ...attributesToUpdate, }; if (attributes.language) { diff --git a/apps/web/modules/ee/contacts/components/contacts-table.tsx b/apps/web/modules/ee/contacts/components/contacts-table.tsx index 7a909688a5..7f7645dbf1 100644 --- a/apps/web/modules/ee/contacts/components/contacts-table.tsx +++ b/apps/web/modules/ee/contacts/components/contacts-table.tsx @@ -236,7 +236,7 @@ export const ContactsTable = ({ setIsTableSettingsModalOpen={setIsTableSettingsModalOpen} isExpanded={isExpanded ?? false} table={table} - deleteRows={deleteContacts} + deleteRowsAction={deleteContacts} type="contact" deleteAction={deleteContact} refreshContacts={refreshContacts} diff --git a/apps/web/modules/ee/contacts/lib/attributes.ts b/apps/web/modules/ee/contacts/lib/attributes.ts index b25514a55c..4b6161c043 100644 --- a/apps/web/modules/ee/contacts/lib/attributes.ts +++ b/apps/web/modules/ee/contacts/lib/attributes.ts @@ -13,7 +13,7 @@ export const updateAttributes = async ( userId: string, environmentId: string, contactAttributesParam: TContactAttributes -): Promise<{ success: boolean; messages?: string[] }> => { +): Promise<{ success: boolean; messages?: string[]; ignoreEmailAttribute?: boolean }> => { validateInputs( [contactId, ZId], [userId, ZString], @@ -21,6 +21,8 @@ export const updateAttributes = async ( [contactAttributesParam, ZContactAttributes] ); + let ignoreEmailAttribute = false; + // Fetch contact attribute keys and email check in parallel const [contactAttributeKeys, existingEmailAttribute] = await Promise.all([ getContactAttributeKeys(environmentId), @@ -58,6 +60,10 @@ export const updateAttributes = async ( ? ["The email already exists for this environment and was not updated."] : []; + if (emailExists) { + ignoreEmailAttribute = true; + } + // First, update all existing attributes if (existingAttributes.length > 0) { await prisma.$transaction( @@ -124,5 +130,6 @@ export const updateAttributes = async ( return { success: true, messages, + ignoreEmailAttribute, }; }; diff --git a/apps/web/modules/ee/role-management/actions.test.ts b/apps/web/modules/ee/role-management/actions.test.ts index 3288dbdc75..e9c40d58f8 100644 --- a/apps/web/modules/ee/role-management/actions.test.ts +++ b/apps/web/modules/ee/role-management/actions.test.ts @@ -15,14 +15,14 @@ import { AuthenticationError, OperationNotAllowedError, ValidationError } from " // Mock constants with getter functions to allow overriding in tests let mockIsFormbricksCloud = false; -let mockDisableUserManagement = false; +let mockUserManagementMinimumRole = "owner"; vi.mock("@/lib/constants", () => ({ get IS_FORMBRICKS_CLOUD() { return mockIsFormbricksCloud; }, - get DISABLE_USER_MANAGEMENT() { - return mockDisableUserManagement; + get USER_MANAGEMENT_MINIMUM_ROLE() { + return mockUserManagementMinimumRole; }, })); @@ -62,7 +62,7 @@ describe("Role Management Actions", () => { afterEach(() => { vi.resetAllMocks(); mockIsFormbricksCloud = false; - mockDisableUserManagement = false; + mockUserManagementMinimumRole = "owner"; }); describe("checkRoleManagementPermission", () => { @@ -220,7 +220,7 @@ describe("Role Management Actions", () => { test("throws error if user management is disabled", async () => { vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue({ role: "owner" } as any); - mockDisableUserManagement = true; + mockUserManagementMinimumRole = "disabled"; await expect( updateMembershipAction({ @@ -231,12 +231,12 @@ describe("Role Management Actions", () => { data: { role: "member" }, }, } as any) - ).rejects.toThrow(new OperationNotAllowedError("User management is disabled")); + ).rejects.toThrow(new OperationNotAllowedError("User management is not allowed for your role")); }); test("throws error if billing role is not allowed in self-hosted", async () => { vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue({ role: "owner" } as any); - mockDisableUserManagement = false; + mockUserManagementMinimumRole = "owner"; vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); await expect( @@ -253,7 +253,7 @@ describe("Role Management Actions", () => { test("allows billing role in cloud environment", async () => { vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue({ role: "owner" } as any); - mockDisableUserManagement = false; + mockUserManagementMinimumRole = "owner"; mockIsFormbricksCloud = true; vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); vi.mocked(getOrganization).mockResolvedValue({ billing: { plan: "pro" } } as any); @@ -274,7 +274,7 @@ describe("Role Management Actions", () => { test("throws error if manager tries to assign a role other than member", async () => { vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue({ role: "manager" } as any); - mockDisableUserManagement = false; + mockUserManagementMinimumRole = "manager"; vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); await expect( @@ -291,7 +291,7 @@ describe("Role Management Actions", () => { test("allows manager to assign member role", async () => { vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue({ role: "manager" } as any); - mockDisableUserManagement = false; + mockUserManagementMinimumRole = "manager"; vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); vi.mocked(getOrganization).mockResolvedValue({ billing: { plan: "pro" } } as any); vi.mocked(getRoleManagementPermission).mockResolvedValue(true); @@ -312,7 +312,7 @@ describe("Role Management Actions", () => { test("successful membership update as owner", async () => { vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue({ role: "owner" } as any); - mockDisableUserManagement = false; + mockUserManagementMinimumRole = "owner"; vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); vi.mocked(getOrganization).mockResolvedValue({ billing: { plan: "pro" } } as any); vi.mocked(getRoleManagementPermission).mockResolvedValue(true); diff --git a/apps/web/modules/ee/role-management/actions.ts b/apps/web/modules/ee/role-management/actions.ts index cc82f81f8d..254b994959 100644 --- a/apps/web/modules/ee/role-management/actions.ts +++ b/apps/web/modules/ee/role-management/actions.ts @@ -1,7 +1,8 @@ "use server"; -import { DISABLE_USER_MANAGEMENT, IS_FORMBRICKS_CLOUD } from "@/lib/constants"; +import { IS_FORMBRICKS_CLOUD, USER_MANAGEMENT_MINIMUM_ROLE } from "@/lib/constants"; import { getMembershipByUserIdOrganizationId } from "@/lib/membership/service"; +import { getUserManagementAccess } from "@/lib/membership/utils"; import { getOrganization } from "@/lib/organization/service"; import { authenticatedActionClient } from "@/lib/utils/action-client"; import { checkAuthorizationUpdated } from "@/lib/utils/action-client-middleware"; @@ -87,8 +88,13 @@ export const updateMembershipAction = authenticatedActionClient if (!currentUserMembership) { throw new AuthenticationError("User not a member of this organization"); } - if (DISABLE_USER_MANAGEMENT) { - throw new OperationNotAllowedError("User management is disabled"); + const hasUserManagementAccess = getUserManagementAccess( + currentUserMembership.role, + USER_MANAGEMENT_MINIMUM_ROLE + ); + + if (!hasUserManagementAccess) { + throw new OperationNotAllowedError("User management is not allowed for your role"); } await checkAuthorizationUpdated({ diff --git a/apps/web/modules/ee/role-management/tests/__mocks__/actions.mock.ts b/apps/web/modules/ee/role-management/tests/__mocks__/actions.mock.ts deleted file mode 100644 index e645309ddb..0000000000 --- a/apps/web/modules/ee/role-management/tests/__mocks__/actions.mock.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { TInviteUpdateInput } from "@/modules/ee/role-management/types/invites"; -import { Session } from "next-auth"; -import { TMembership, TMembershipUpdateInput } from "@formbricks/types/memberships"; -import { TOrganization, TOrganizationBillingPlan } from "@formbricks/types/organizations"; -import { TUser } from "@formbricks/types/user"; - -// Common mock IDs -export const mockOrganizationId = "cblt7dwr7d0hvdifl4iw6d5x"; -export const mockUserId = "wl43gybf3pxmqqx3fcmsk8eb"; -export const mockInviteId = "dc0b6ea6-bb65-4a22-88e1-847df2e85af4"; -export const mockTargetUserId = "vevt9qm7sqmh44e3za6a2vzd"; - -// Mock user -export const mockUser: TUser = { - id: mockUserId, - name: "Test User", - email: "test@example.com", - emailVerified: new Date(), - createdAt: new Date(), - updatedAt: new Date(), - identityProvider: "email", - twoFactorEnabled: false, - objective: null, - notificationSettings: { - alert: {}, - weeklySummary: {}, - }, - locale: "en-US", - imageUrl: null, - role: null, - lastLoginAt: new Date(), - isActive: true, -}; - -// Mock session -export const mockSession: Session = { - user: { - id: mockUserId, - }, - expires: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), -}; - -// Mock organizations -export const createMockOrganization = (plan: TOrganizationBillingPlan): TOrganization => ({ - id: mockOrganizationId, - name: "Test Organization", - createdAt: new Date(), - updatedAt: new Date(), - isAIEnabled: false, - billing: { - stripeCustomerId: null, - plan, - period: "monthly", - periodStart: new Date(), - limits: { - projects: plan === "free" ? 3 : null, - monthly: { - responses: plan === "free" ? 1500 : null, - miu: plan === "free" ? 2000 : null, - }, - }, - }, -}); - -export const mockOrganizationFree = createMockOrganization("free"); -export const mockOrganizationStartup = createMockOrganization("startup"); -export const mockOrganizationScale = createMockOrganization("scale"); - -// Mock membership data -export const createMockMembership = (role: TMembership["role"]): TMembership => ({ - userId: mockUserId, - organizationId: mockOrganizationId, - role, - accepted: true, -}); - -export const mockMembershipMember = createMockMembership("member"); -export const mockMembershipManager = createMockMembership("manager"); -export const mockMembershipOwner = createMockMembership("owner"); - -// Mock data payloads -export const mockInviteDataMember: TInviteUpdateInput = { role: "member" }; -export const mockInviteDataOwner: TInviteUpdateInput = { role: "owner" }; -export const mockInviteDataBilling: TInviteUpdateInput = { role: "billing" }; - -export const mockMembershipUpdateMember: TMembershipUpdateInput = { role: "member" }; -export const mockMembershipUpdateOwner: TMembershipUpdateInput = { role: "owner" }; -export const mockMembershipUpdateBilling: TMembershipUpdateInput = { role: "billing" }; - -// Mock input objects for actions -export const mockUpdateInviteInput = { - inviteId: mockInviteId, - organizationId: mockOrganizationId, - data: mockInviteDataMember, -}; - -export const mockUpdateMembershipInput = { - userId: mockTargetUserId, - organizationId: mockOrganizationId, - data: mockMembershipUpdateMember, -}; - -// Mock responses -export const mockUpdatedMembership: TMembership = { - userId: mockTargetUserId, - organizationId: mockOrganizationId, - role: "member", - accepted: true, -}; diff --git a/apps/web/modules/ee/role-management/tests/actions.test.ts b/apps/web/modules/ee/role-management/tests/actions.test.ts deleted file mode 100644 index c5ef6a2b4d..0000000000 --- a/apps/web/modules/ee/role-management/tests/actions.test.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { - mockInviteDataBilling, - mockInviteDataOwner, - mockMembershipManager, - mockMembershipMember, - mockMembershipUpdateBilling, - mockMembershipUpdateOwner, - mockOrganizationFree, - mockOrganizationId, - mockOrganizationScale, - mockOrganizationStartup, - mockSession, - mockUpdateInviteInput, - mockUpdateMembershipInput, - mockUpdatedMembership, - mockUser, -} from "./__mocks__/actions.mock"; -import { getMembershipByUserIdOrganizationId } from "@/lib/membership/service"; -import { getOrganization } from "@/lib/organization/service"; -import { getUser } from "@/lib/user/service"; -import "@/lib/utils/action-client-middleware"; -import { checkAuthorizationUpdated } from "@/lib/utils/action-client-middleware"; -import { getRoleManagementPermission } from "@/modules/ee/license-check/lib/utils"; -import { updateInvite } from "@/modules/ee/role-management/lib/invite"; -import { updateMembership } from "@/modules/ee/role-management/lib/membership"; -import { getServerSession } from "next-auth"; -import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; -import { OperationNotAllowedError, ValidationError } from "@formbricks/types/errors"; -import { checkRoleManagementPermission } from "../actions"; -import { updateInviteAction, updateMembershipAction } from "../actions"; - -// Mock all external dependencies -vi.mock("@/modules/ee/license-check/lib/utils", () => ({ - getRoleManagementPermission: vi.fn(), -})); - -vi.mock("@/modules/ee/role-management/lib/invite", () => ({ - updateInvite: vi.fn(), -})); - -vi.mock("@/lib/user/service", () => ({ - getUser: vi.fn(), -})); - -vi.mock("@/modules/ee/role-management/lib/membership", () => ({ - updateMembership: vi.fn(), -})); - -vi.mock("@/lib/membership/service", () => ({ - getMembershipByUserIdOrganizationId: vi.fn(), -})); - -vi.mock("@/lib/organization/service", () => ({ - getOrganization: vi.fn(), -})); - -vi.mock("@/lib/utils/action-client-middleware", () => ({ - checkAuthorizationUpdated: vi.fn(), -})); - -vi.mock("next-auth", () => ({ - getServerSession: vi.fn(), -})); - -// Mock constants without importing the actual module -vi.mock("@/lib/constants", () => ({ - IS_FORMBRICKS_CLOUD: false, - IS_MULTI_ORG_ENABLED: true, - ENCRYPTION_KEY: "test-encryption-key", - ENTERPRISE_LICENSE_KEY: "test-enterprise-license-key", - GITHUB_ID: "test-github-id", - GITHUB_SECRET: "test-github-secret", - GOOGLE_CLIENT_ID: "test-google-client-id", - GOOGLE_CLIENT_SECRET: "test-google-client-secret", - AZUREAD_CLIENT_ID: "test-azure-client-id", - AZUREAD_CLIENT_SECRET: "test-azure-client-secret", - AZUREAD_TENANT_ID: "test-azure-tenant-id", - OIDC_CLIENT_ID: "test-oidc-client-id", - OIDC_CLIENT_SECRET: "test-oidc-client-secret", - OIDC_ISSUER: "test-oidc-issuer", - OIDC_DISPLAY_NAME: "test-oidc-display-name", - OIDC_SIGNING_ALGORITHM: "test-oidc-algorithm", - SAML_DATABASE_URL: "test-saml-db-url", - NEXTAUTH_SECRET: "test-nextauth-secret", - WEBAPP_URL: "http://localhost:3000", - DISABLE_USER_MANAGEMENT: false, -})); - -vi.mock("@/lib/utils/action-client-middleware", () => ({ - checkAuthorizationUpdated: vi.fn(), -})); -vi.mock("@/lib/errors", () => ({ - OperationNotAllowedError: vi.fn(), - ValidationError: vi.fn(), -})); - -describe("role-management/actions.ts", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - afterEach(() => { - vi.resetAllMocks(); - }); - - describe("checkRoleManagementPermission", () => { - test("throws error when organization not found", async () => { - vi.mocked(getOrganization).mockResolvedValue(null); - - await expect(checkRoleManagementPermission(mockOrganizationId)).rejects.toThrow( - "Organization not found" - ); - - expect(getOrganization).toHaveBeenCalledWith(mockOrganizationId); - }); - - test("throws error when role management is not allowed", async () => { - vi.mocked(getOrganization).mockResolvedValue(mockOrganizationFree); - vi.mocked(getRoleManagementPermission).mockResolvedValue(false); - - await expect(checkRoleManagementPermission(mockOrganizationId)).rejects.toThrow( - new OperationNotAllowedError("Role management is not allowed for this organization") - ); - - expect(getRoleManagementPermission).toHaveBeenCalledWith("free"); - - expect(getOrganization).toHaveBeenCalledWith(mockOrganizationId); - }); - - test("succeeds when role management is allowed", async () => { - vi.mocked(getOrganization).mockResolvedValue(mockOrganizationStartup); - vi.mocked(getRoleManagementPermission).mockResolvedValue(true); - - await expect(checkRoleManagementPermission(mockOrganizationId)).resolves.toBeUndefined(); - await expect(getRoleManagementPermission).toHaveBeenCalledWith("startup"); - expect(getOrganization).toHaveBeenCalledWith(mockOrganizationId); - }); - }); - - describe("updateInviteAction", () => { - test("throws error when user is not a member of the organization", async () => { - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(null); - - expect(await updateInviteAction(mockUpdateInviteInput)).toStrictEqual({ - serverError: "User not a member of this organization", - }); - }); - - test("throws error when billing role is not allowed in self-hosted", async () => { - const inputWithBillingRole = { - ...mockUpdateInviteInput, - data: mockInviteDataBilling, - }; - - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(mockMembershipMember); - vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); - - expect(await updateInviteAction(inputWithBillingRole)).toStrictEqual({ - serverError: "Something went wrong while executing the operation.", - }); - }); - - test("throws error when manager tries to assign non-member role", async () => { - const inputWithOwnerRole = { - ...mockUpdateInviteInput, - data: mockInviteDataOwner, - }; - - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(mockMembershipManager); - vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); - - expect(await updateInviteAction(inputWithOwnerRole)).toStrictEqual({ - serverError: "Managers can only invite members", - }); - }); - - test("successfully updates invite", async () => { - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(mockMembershipManager); - vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); - vi.mocked(getOrganization).mockResolvedValue(mockOrganizationScale); - vi.mocked(getRoleManagementPermission).mockResolvedValue(true); - vi.mocked(updateInvite).mockResolvedValue(true); - - const result = await updateInviteAction(mockUpdateInviteInput); - - expect(result).toEqual({ data: true }); - }); - }); - - describe("updateMembershipAction", () => { - test("throws error when user is not a member of the organization", async () => { - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(null); - - expect(await updateMembershipAction(mockUpdateMembershipInput)).toStrictEqual({ - serverError: "User not a member of this organization", - }); - }); - - test("throws error when billing role is not allowed in self-hosted", async () => { - const inputWithBillingRole = { - ...mockUpdateMembershipInput, - data: mockMembershipUpdateBilling, - }; - - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(mockMembershipMember); - vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); - - expect(await updateMembershipAction(inputWithBillingRole)).toStrictEqual({ - serverError: "Something went wrong while executing the operation.", - }); - }); - - test("throws error when manager tries to assign non-member role", async () => { - const inputWithOwnerRole = { - ...mockUpdateMembershipInput, - data: mockMembershipUpdateOwner, - }; - - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(mockMembershipManager); - vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); - - expect(await updateMembershipAction(inputWithOwnerRole)).toStrictEqual({ - serverError: "Managers can only assign users to the member role", - }); - }); - - test("successfully updates membership", async () => { - vi.mocked(getServerSession).mockResolvedValue(mockSession); - vi.mocked(getUser).mockResolvedValue(mockUser); - vi.mocked(getMembershipByUserIdOrganizationId).mockResolvedValue(mockMembershipManager); - vi.mocked(checkAuthorizationUpdated).mockResolvedValue(true); - vi.mocked(getOrganization).mockResolvedValue(mockOrganizationScale); - vi.mocked(getRoleManagementPermission).mockResolvedValue(true); - vi.mocked(updateMembership).mockResolvedValue(mockUpdatedMembership); - - const result = await updateMembershipAction(mockUpdateMembershipInput); - - expect(result).toEqual({ - data: mockUpdatedMembership, - }); - }); - }); -}); diff --git a/apps/web/modules/organization/settings/teams/page.test.tsx b/apps/web/modules/organization/settings/teams/page.test.tsx index 0c47f2e7c6..2fc8099030 100644 --- a/apps/web/modules/organization/settings/teams/page.test.tsx +++ b/apps/web/modules/organization/settings/teams/page.test.tsx @@ -13,7 +13,7 @@ vi.mock( ); vi.mock("@/lib/constants", () => ({ - DISABLE_USER_MANAGEMENT: 0, + USER_MANAGEMENT_MINIMUM_ROLE: "owner", IS_FORMBRICKS_CLOUD: 1, ENCRYPTION_KEY: "test-key", ENTERPRISE_LICENSE_KEY: "test-enterprise-key", diff --git a/apps/web/modules/organization/settings/teams/page.tsx b/apps/web/modules/organization/settings/teams/page.tsx index a1377685ee..9be90f8440 100644 --- a/apps/web/modules/organization/settings/teams/page.tsx +++ b/apps/web/modules/organization/settings/teams/page.tsx @@ -1,5 +1,6 @@ import { OrganizationSettingsNavbar } from "@/app/(app)/environments/[environmentId]/settings/(organization)/components/OrganizationSettingsNavbar"; -import { DISABLE_USER_MANAGEMENT, IS_FORMBRICKS_CLOUD } from "@/lib/constants"; +import { IS_FORMBRICKS_CLOUD, USER_MANAGEMENT_MINIMUM_ROLE } from "@/lib/constants"; +import { getUserManagementAccess } from "@/lib/membership/utils"; import { getRoleManagementPermission } from "@/modules/ee/license-check/lib/utils"; import { TeamsView } from "@/modules/ee/teams/team-list/components/teams-view"; import { getEnvironmentAuth } from "@/modules/environments/lib/utils"; @@ -15,6 +16,10 @@ export const TeamsPage = async (props) => { const { session, currentUserMembership, organization } = await getEnvironmentAuth(params.environmentId); const canDoRoleManagement = await getRoleManagementPermission(organization.billing.plan); + const hasUserManagementAccess = getUserManagementAccess( + currentUserMembership?.role, + USER_MANAGEMENT_MINIMUM_ROLE + ); return ( @@ -32,7 +37,7 @@ export const TeamsPage = async (props) => { currentUserId={session.user.id} environmentId={params.environmentId} canDoRoleManagement={canDoRoleManagement} - isUserManagementDisabledFromUi={DISABLE_USER_MANAGEMENT} + isUserManagementDisabledFromUi={!hasUserManagementAccess} />
- - {questionIdx !== 0 && ( )} +
diff --git a/apps/web/modules/survey/editor/components/question-card.test.tsx b/apps/web/modules/survey/editor/components/question-card.test.tsx index bbfb0c5008..5b8f66a0c5 100644 --- a/apps/web/modules/survey/editor/components/question-card.test.tsx +++ b/apps/web/modules/survey/editor/components/question-card.test.tsx @@ -1,15 +1,10 @@ import { QuestionCard } from "@/modules/survey/editor/components/question-card"; import { Project } from "@prisma/client"; -import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; -// Import waitFor +import { cleanup, fireEvent, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { afterEach, describe, expect, test, vi } from "vitest"; -import { - TSurvey, - TSurveyAddressQuestion, - TSurveyQuestion, - TSurveyQuestionTypeEnum, -} from "@formbricks/types/surveys/types"; +// Import waitFor +import { TSurvey, TSurveyQuestion, TSurveyQuestionTypeEnum } from "@formbricks/types/surveys/types"; // Mock child components vi.mock("@/modules/survey/components/question-form-input", () => ({ @@ -371,8 +366,9 @@ describe("QuestionCard Component", () => { test("applies invalid styling when isInvalid is true", () => { render(); - const dragHandle = screen.getByRole("button", { name: "" }).parentElement; // Get the div containing the GripIcon + const dragHandle = screen.getByRole("button", { name: "Drag to reorder question" }).parentElement; // Get the div containing the GripIcon expect(dragHandle).toHaveClass("bg-red-400"); + expect(dragHandle).toHaveClass("hover:bg-red-600"); }); test("disables required toggle for Address question if all fields are optional", () => { @@ -507,4 +503,94 @@ describe("QuestionCard Component", () => { // First question should never have back button expect(screen.queryByTestId("question-form-input-backButtonLabel")).not.toBeInTheDocument(); }); + + // Accessibility Tests + test("maintains proper focus management when toggling advanced settings", async () => { + const user = userEvent.setup(); + render(); + + const advancedSettingsTrigger = screen.getByText("environments.surveys.edit.show_advanced_settings"); + await user.click(advancedSettingsTrigger); + + const closeTrigger = screen.getByText("environments.surveys.edit.hide_advanced_settings"); + expect(closeTrigger).toBeInTheDocument(); + }); + + test("ensures proper ARIA attributes for collapsible sections", () => { + render(); + + const collapsibleTrigger = screen.getByText("environments.surveys.edit.show_advanced_settings"); + expect(collapsibleTrigger).toHaveAttribute("aria-expanded", "false"); + + fireEvent.click(collapsibleTrigger); + expect(collapsibleTrigger).toHaveAttribute("aria-expanded", "true"); + }); + + test("maintains keyboard accessibility for required toggle", async () => { + const user = userEvent.setup(); + render(); + + const requiredToggle = screen.getByRole("switch", { name: "environments.surveys.edit.required" }); + await user.click(requiredToggle); + expect(mockUpdateQuestion).toHaveBeenCalledWith(0, { required: false }); + }); + + test("provides screen reader text for drag handle", () => { + render(); + const dragHandle = screen.getByRole("button", { name: "Drag to reorder question" }); + const svg = dragHandle.querySelector("svg"); + expect(svg).toHaveAttribute("aria-hidden", "true"); + }); + + test("maintains proper heading hierarchy", () => { + render(); + const headline = screen.getByText("Question Headline"); + expect(headline.tagName).toBe("H3"); + expect(headline).toHaveClass("text-sm", "font-semibold"); + }); + + test("ensures proper focus order for form elements", async () => { + const user = userEvent.setup(); + render(); + + // Open advanced settings + fireEvent.click(screen.getByText("environments.surveys.edit.show_advanced_settings")); + + const requiredToggle = screen.getByRole("switch", { name: "environments.surveys.edit.required" }); + await user.click(requiredToggle); + expect(mockUpdateQuestion).toHaveBeenCalledWith(0, { required: false }); + }); + + test("provides proper ARIA attributes for interactive elements", () => { + render(); + + const requiredToggle = screen.getByRole("switch", { name: "environments.surveys.edit.required" }); + expect(requiredToggle).toHaveAttribute("aria-checked", "true"); + + const longAnswerToggle = screen.getByRole("switch", { name: "environments.surveys.edit.long_answer" }); + expect(longAnswerToggle).toHaveAttribute("aria-checked", "false"); + }); + + test("ensures proper role attributes for interactive elements", () => { + render(); + + const toggles = screen.getAllByRole("switch"); + expect(toggles).toHaveLength(2); // Required and Long Answer toggles + + const collapsibleTrigger = screen.getByText("environments.surveys.edit.show_advanced_settings"); + expect(collapsibleTrigger).toHaveAttribute("type", "button"); + }); + + test("maintains proper focus management when closing advanced settings", async () => { + const user = userEvent.setup(); + render(); + + const advancedSettingsTrigger = screen.getByText("environments.surveys.edit.show_advanced_settings"); + await user.click(advancedSettingsTrigger); + + const closeTrigger = screen.getByText("environments.surveys.edit.hide_advanced_settings"); + await user.click(closeTrigger); + + expect(screen.getByText("environments.surveys.edit.show_advanced_settings")).toBeInTheDocument(); + }); }); diff --git a/apps/web/modules/survey/editor/components/question-card.tsx b/apps/web/modules/survey/editor/components/question-card.tsx index 5b7478950a..a8cc74349d 100644 --- a/apps/web/modules/survey/editor/components/question-card.tsx +++ b/apps/web/modules/survey/editor/components/question-card.tsx @@ -196,7 +196,9 @@ export const QuestionCard = ({ )}>
{QUESTIONS_ICON_MAP[question.type]}
-
@@ -215,14 +217,15 @@ export const QuestionCard = ({ className={cn( open ? "" : " ", "flex cursor-pointer justify-between gap-4 rounded-r-lg p-4 hover:bg-slate-50" - )}> + )} + aria-label="Toggle question details">
{/*
{QUESTIONS_ICON_MAP[question.type]}
*/}
-

+

{recallToHeadline(question.headline, localSurvey, true, selectedLanguageCode)[ selectedLanguageCode ] @@ -232,7 +235,7 @@ export const QuestionCard = ({ ] ?? "" ) : getTSurveyQuestionTypeEnumName(question.type, t)} -

+

{!open && (

{question?.required @@ -272,7 +275,7 @@ export const QuestionCard = ({ TSurveyQuestionTypeEnum.Ranking, TSurveyQuestionTypeEnum.Matrix, ].includes(question.type) ? ( - + {t("environments.surveys.edit.caution_text")} onAlertTrigger()}>{t("common.learn_more")} @@ -457,7 +460,9 @@ export const QuestionCard = ({ ) : null}

- + {openAdvanced ? ( ) : ( @@ -473,6 +478,30 @@ export const QuestionCard = ({ question.type !== TSurveyQuestionTypeEnum.Rating && question.type !== TSurveyQuestionTypeEnum.CTA ? (
+ {questionIdx !== 0 && ( + { + if (!question.backButtonLabel) return; + let translatedBackButtonLabel = { + ...question.backButtonLabel, + [selectedLanguageCode]: e.target.value, + }; + updateEmptyButtonLabels("backButtonLabel", translatedBackButtonLabel, 0); + }} + /> + )}
- {questionIdx !== 0 && ( - { - if (!question.backButtonLabel) return; - let translatedBackButtonLabel = { - ...question.backButtonLabel, - [selectedLanguageCode]: e.target.value, - }; - updateEmptyButtonLabels("backButtonLabel", translatedBackButtonLabel, 0); - }} - /> - )}
) : null} {(question.type === TSurveyQuestionTypeEnum.Rating || diff --git a/apps/web/modules/survey/list/components/survey-card.test.tsx b/apps/web/modules/survey/list/components/survey-card.test.tsx index 1fecbbddb3..3bbf085d67 100644 --- a/apps/web/modules/survey/list/components/survey-card.test.tsx +++ b/apps/web/modules/survey/list/components/survey-card.test.tsx @@ -53,10 +53,10 @@ describe("SurveyCard", () => { survey={{ ...dummySurvey, status: "draft" } as unknown as TSurvey} environmentId={environmentId} isReadOnly={false} - WEBAPP_URL={WEBAPP_URL} duplicateSurvey={mockDuplicateSurvey} deleteSurvey={mockDeleteSurvey} locale="en-US" + surveyDomain={WEBAPP_URL} /> ); // Draft survey => link should point to edit @@ -70,10 +70,10 @@ describe("SurveyCard", () => { survey={{ ...dummySurvey, status: "draft" } as unknown as TSurvey} environmentId={environmentId} isReadOnly={true} - WEBAPP_URL={WEBAPP_URL} duplicateSurvey={mockDuplicateSurvey} deleteSurvey={mockDeleteSurvey} locale="en-US" + surveyDomain={WEBAPP_URL} /> ); // When it's read only and draft, we expect no link @@ -87,10 +87,10 @@ describe("SurveyCard", () => { survey={{ ...dummySurvey, status: "inProgress" } as unknown as TSurvey} environmentId={environmentId} isReadOnly={false} - WEBAPP_URL={WEBAPP_URL} duplicateSurvey={mockDuplicateSurvey} deleteSurvey={mockDeleteSurvey} locale="en-US" + surveyDomain={WEBAPP_URL} /> ); // For non-draft => link to summary diff --git a/apps/web/modules/ui/components/data-table/components/data-table-toolbar.test.tsx b/apps/web/modules/ui/components/data-table/components/data-table-toolbar.test.tsx index 95d3b9585d..40aa41ac84 100644 --- a/apps/web/modules/ui/components/data-table/components/data-table-toolbar.test.tsx +++ b/apps/web/modules/ui/components/data-table/components/data-table-toolbar.test.tsx @@ -4,195 +4,140 @@ import toast from "react-hot-toast"; import { afterEach, describe, expect, test, vi } from "vitest"; import { DataTableToolbar } from "./data-table-toolbar"; +// Mock TooltipRenderer +vi.mock("@/modules/ui/components/tooltip", () => ({ + TooltipRenderer: ({ children, tooltipContent }) => ( +
+ {children} +
+ ), +})); + +// Mock SelectedRowSettings +vi.mock("./selected-row-settings", () => ({ + SelectedRowSettings: vi.fn(() =>
), +})); + +// Mock useTranslate +vi.mock("@tolgee/react", () => ({ + useTranslate: () => ({ + t: (key) => key, + }), +})); + +// Mock toast +vi.mock("react-hot-toast", () => ({ + default: { + success: vi.fn(), + error: vi.fn(), + }, +})); + +// Mock lucide-react icons +vi.mock("lucide-react", async () => { + const actual = await vi.importActual("lucide-react"); + return { + ...actual, + RefreshCcwIcon: vi.fn((props) =>
), + SettingsIcon: vi.fn((props) =>
), + MoveVerticalIcon: vi.fn((props) =>
), + }; +}); + +const mockTable = { + getFilteredSelectedRowModel: vi.fn(() => ({ rows: [] })), +} as any; + +const mockDeleteRowsAction = vi.fn(); +const mockDeleteAction = vi.fn(); +const mockDownloadRowsAction = vi.fn(); +const mockRefreshContacts = vi.fn(); +const mockSetIsExpanded = vi.fn(); +const mockSetIsTableSettingsModalOpen = vi.fn(); + +const defaultProps = { + setIsExpanded: mockSetIsExpanded, + setIsTableSettingsModalOpen: mockSetIsTableSettingsModalOpen, + isExpanded: false, + table: mockTable, + deleteRowsAction: mockDeleteRowsAction, + type: "response" as "response" | "contact", + deleteAction: mockDeleteAction, + downloadRowAction: mockDownloadRowsAction, + refreshContacts: mockRefreshContacts, +}; + describe("DataTableToolbar", () => { afterEach(() => { cleanup(); + vi.clearAllMocks(); }); - test("renders selection settings when rows are selected", () => { - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [{ id: "row1" }, { id: "row2" }], - }), - }; - - render( - - ); - - // Check for the number of selected items instead of translation keys - const selectionInfo = screen.getByText(/2/); - expect(selectionInfo).toBeInTheDocument(); - - // Look for the exact text that appears in the component (which is the translation key) - expect(screen.getByText("common.select_all")).toBeInTheDocument(); - expect(screen.getByText("common.clear_selection")).toBeInTheDocument(); + test("renders correctly with no selected rows", () => { + render(); + expect(screen.queryByTestId("selected-row-settings")).not.toBeInTheDocument(); + expect(screen.getByTestId("settings-icon")).toBeInTheDocument(); + expect(screen.getByTestId("move-vertical-icon")).toBeInTheDocument(); + expect(screen.queryByTestId("refresh-ccw-icon")).not.toBeInTheDocument(); }); - test("renders settings and expand buttons", () => { - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [], - }), - }; - - render( - - ); - - // Look for SVG elements by their class names instead of role - const settingsIcon = document.querySelector(".lucide-settings"); - const expandIcon = document.querySelector(".lucide-move-vertical"); - - expect(settingsIcon).toBeInTheDocument(); - expect(expandIcon).toBeInTheDocument(); + test("renders SelectedRowSettings when rows are selected", () => { + const tableWithSelectedRows = { + getFilteredSelectedRowModel: vi.fn(() => ({ rows: [{ id: "1" }] })), + } as any; + render(); + expect(screen.getByTestId("selected-row-settings")).toBeInTheDocument(); }); - test("calls setIsTableSettingsModalOpen when settings button is clicked", async () => { - const user = userEvent.setup(); - const setIsTableSettingsModalOpen = vi.fn(); - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [], - }), - }; - - render( - + test("renders refresh icon for contact type and calls refreshContacts on click", async () => { + mockRefreshContacts.mockResolvedValueOnce(undefined); + render(); + const refreshIconContainer = screen.getByTestId("refresh-ccw-icon").parentElement; + expect(refreshIconContainer).toBeInTheDocument(); + await userEvent.click(refreshIconContainer!); + expect(mockRefreshContacts).toHaveBeenCalledTimes(1); + expect(vi.mocked(toast.success)).toHaveBeenCalledWith( + "environments.contacts.contacts_table_refresh_success" ); - - // Find the settings button by class and click it - const settingsIcon = document.querySelector(".lucide-settings"); - const settingsButton = settingsIcon?.closest("div"); - - expect(settingsButton).toBeInTheDocument(); - if (settingsButton) { - await user.click(settingsButton); - expect(setIsTableSettingsModalOpen).toHaveBeenCalledWith(true); - } }); - test("calls setIsExpanded when expand button is clicked", async () => { - const user = userEvent.setup(); - const setIsExpanded = vi.fn(); - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [], - }), - }; - - render( - - ); - - // Find the expand button by class and click it - const expandIcon = document.querySelector(".lucide-move-vertical"); - const expandButton = expandIcon?.closest("div"); - - expect(expandButton).toBeInTheDocument(); - if (expandButton) { - await user.click(expandButton); - expect(setIsExpanded).toHaveBeenCalledWith(true); - } + test("handles refreshContacts failure", async () => { + mockRefreshContacts.mockRejectedValueOnce(new Error("Refresh failed")); + render(); + const refreshIconContainer = screen.getByTestId("refresh-ccw-icon").parentElement; + await userEvent.click(refreshIconContainer!); + expect(mockRefreshContacts).toHaveBeenCalledTimes(1); + expect(vi.mocked(toast.error)).toHaveBeenCalledWith("environments.contacts.contacts_table_refresh_error"); }); - test("shows refresh button and calls refreshContacts when type is contact", async () => { - const user = userEvent.setup(); - const refreshContacts = vi.fn().mockResolvedValue(undefined); - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [], - }), - }; - - render( - - ); - - // Find the refresh button by class and click it - const refreshIcon = document.querySelector(".lucide-refresh-ccw"); - const refreshButton = refreshIcon?.closest("div"); - - expect(refreshButton).toBeInTheDocument(); - if (refreshButton) { - await user.click(refreshButton); - expect(refreshContacts).toHaveBeenCalled(); - expect(toast.success).toHaveBeenCalledWith("environments.contacts.contacts_table_refresh_success"); - } + test("does not render refresh icon for response type", () => { + render(); + expect(screen.queryByTestId("refresh-ccw-icon")).not.toBeInTheDocument(); }); - test("shows error toast when refreshContacts fails", async () => { - const user = userEvent.setup(); - const refreshContacts = vi.fn().mockRejectedValue(new Error("Failed to refresh")); - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [], - }), - }; + test("calls setIsTableSettingsModalOpen when settings icon is clicked", async () => { + render(); + const settingsIconContainer = screen.getByTestId("settings-icon").parentElement; + await userEvent.click(settingsIconContainer!); + expect(mockSetIsTableSettingsModalOpen).toHaveBeenCalledWith(true); + }); - render( - - ); + test("calls setIsExpanded when move vertical icon is clicked (isExpanded false)", async () => { + render(); + const moveIconContainer = screen.getByTestId("move-vertical-icon").parentElement; + const tooltip = moveIconContainer?.closest('[data-testid="tooltip-renderer"]'); + expect(tooltip).toHaveAttribute("data-tooltip-content", "common.expand_rows"); + await userEvent.click(moveIconContainer!); + expect(mockSetIsExpanded).toHaveBeenCalledWith(true); + }); - // Find the refresh button by class and click it - const refreshIcon = document.querySelector(".lucide-refresh-ccw"); - const refreshButton = refreshIcon?.closest("div"); - - expect(refreshButton).toBeInTheDocument(); - if (refreshButton) { - await user.click(refreshButton); - expect(refreshContacts).toHaveBeenCalled(); - expect(toast.error).toHaveBeenCalledWith("environments.contacts.contacts_table_refresh_error"); - } + test("calls setIsExpanded when move vertical icon is clicked (isExpanded true)", async () => { + render(); + const moveIconContainer = screen.getByTestId("move-vertical-icon").parentElement; + const tooltip = moveIconContainer?.closest('[data-testid="tooltip-renderer"]'); + expect(tooltip).toHaveAttribute("data-tooltip-content", "common.collapse_rows"); + await userEvent.click(moveIconContainer!); + expect(mockSetIsExpanded).toHaveBeenCalledWith(false); + expect(moveIconContainer).toHaveClass("bg-black text-white"); }); }); diff --git a/apps/web/modules/ui/components/data-table/components/data-table-toolbar.tsx b/apps/web/modules/ui/components/data-table/components/data-table-toolbar.tsx index f20a1a81da..6d0e3f3076 100644 --- a/apps/web/modules/ui/components/data-table/components/data-table-toolbar.tsx +++ b/apps/web/modules/ui/components/data-table/components/data-table-toolbar.tsx @@ -13,9 +13,10 @@ interface DataTableToolbarProps { setIsExpanded: (isExpanded: boolean) => void; isExpanded: boolean; table: Table; - deleteRows: (rowIds: string[]) => void; + deleteRowsAction: (rowIds: string[]) => void; type: "response" | "contact"; deleteAction: (id: string) => Promise; + downloadRowsAction?: (rowIds: string[], format: string) => void; refreshContacts?: () => Promise; } @@ -24,9 +25,10 @@ export const DataTableToolbar = ({ setIsTableSettingsModalOpen, isExpanded, table, - deleteRows, + deleteRowsAction, type, deleteAction, + downloadRowsAction, refreshContacts, }: DataTableToolbarProps) => { const { t } = useTranslate(); @@ -34,7 +36,13 @@ export const DataTableToolbar = ({ return (
{table.getFilteredSelectedRowModel().rows.length > 0 ? ( - + ) : (
)} diff --git a/apps/web/modules/ui/components/data-table/components/selected-row-settings.test.tsx b/apps/web/modules/ui/components/data-table/components/selected-row-settings.test.tsx index 7604eded75..572ccf26df 100644 --- a/apps/web/modules/ui/components/data-table/components/selected-row-settings.test.tsx +++ b/apps/web/modules/ui/components/data-table/components/selected-row-settings.test.tsx @@ -1,192 +1,187 @@ -import { cleanup, render, screen } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import toast from "react-hot-toast"; -import { afterEach, describe, expect, test, vi } from "vitest"; +import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { toast } from "react-hot-toast"; +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; import { SelectedRowSettings } from "./selected-row-settings"; -// Mock the toast functions directly since they're causing issues -vi.mock("react-hot-toast", () => ({ - default: { - success: vi.fn(), - error: vi.fn(), - }, +// Mock translation +vi.mock("@tolgee/react", () => ({ + useTranslate: () => ({ t: (key: string) => key }), })); -// Instead of mocking @radix-ui/react-dialog, we'll test the component's behavior -// by checking if the appropriate actions are performed after clicking the buttons +// Mock DeleteDialog to reveal confirm button when open +vi.mock("@/modules/ui/components/delete-dialog", () => ({ + DeleteDialog: ({ open, onDelete }: any) => + open ? : null, +})); + +// Mock dropdown-menu components to render their children +vi.mock("@/modules/ui/components/dropdown-menu", () => ({ + DropdownMenu: ({ children }: any) => <>{children}, + DropdownMenuTrigger: ({ children }: any) => <>{children}, + DropdownMenuContent: ({ children }: any) => <>{children}, + DropdownMenuItem: ({ children, onClick }: any) => , +})); + +// Mock Button +vi.mock("@/modules/ui/components/button", () => ({ + Button: ({ children, ...props }: any) => , +})); describe("SelectedRowSettings", () => { + const rows = [{ id: "r1" }, { id: "r2" }]; + let table: any; + let deleteRowsAction: ReturnType; + let deleteAction: ReturnType; + let downloadRowsAction: ReturnType; + + beforeEach(() => { + table = { + getFilteredSelectedRowModel: () => ({ rows }), + toggleAllPageRowsSelected: vi.fn(), + }; + deleteRowsAction = vi.fn(); + deleteAction = vi.fn(() => Promise.resolve()); + downloadRowsAction = vi.fn(); + + // Reset all toast mocks before each test + vi.mocked(toast.error).mockClear(); + vi.mocked(toast.success).mockClear(); + }); + afterEach(() => { - vi.resetAllMocks(); + vi.clearAllMocks(); cleanup(); }); - test("renders correct number of selected rows for responses", () => { - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [{ id: "row1" }, { id: "row2" }], - }), - toggleAllPageRowsSelected: vi.fn(), - }; - + test("renders selected count and handles select all/clear selection", () => { render( - ); - - // We need to look for a text node that contains "2" but might have other text around it - const selectionText = screen.getByText((content) => content.includes("2")); - expect(selectionText).toBeInTheDocument(); - - // Check that we have the correct number of common text items - expect(screen.getByText("common.select_all")).toBeInTheDocument(); - expect(screen.getByText("common.clear_selection")).toBeInTheDocument(); - }); - - test("renders correct number of selected rows for contacts", () => { - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [{ id: "contact1" }, { id: "contact2" }, { id: "contact3" }], - }), - toggleAllPageRowsSelected: vi.fn(), - }; - - render( - ); + expect(screen.getByText("2 common.contacts common.selected")).toBeInTheDocument(); - // We need to look for a text node that contains "3" but might have other text around it - const selectionText = screen.getByText((content) => content.includes("3")); - expect(selectionText).toBeInTheDocument(); + fireEvent.click(screen.getByText("common.select_all")); + expect(table.toggleAllPageRowsSelected).toHaveBeenCalledWith(true); - // Check that the text contains contacts (using a function matcher) - const textWithContacts = screen.getByText((content) => content.includes("common.contacts")); - expect(textWithContacts).toBeInTheDocument(); + fireEvent.click(screen.getByText("common.clear_selection")); + expect(table.toggleAllPageRowsSelected).toHaveBeenCalledWith(false); }); - test("select all option calls toggleAllPageRowsSelected with true", async () => { - const user = userEvent.setup(); - const toggleAllPageRowsSelectedMock = vi.fn(); - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [{ id: "row1" }], - }), - toggleAllPageRowsSelected: toggleAllPageRowsSelectedMock, - }; - + test("does not render download when downloadRows prop is undefined", () => { render( ); - - await user.click(screen.getByText("common.select_all")); - expect(toggleAllPageRowsSelectedMock).toHaveBeenCalledWith(true); + expect(screen.queryByText("common.download")).toBeNull(); }); - test("clear selection option calls toggleAllPageRowsSelected with false", async () => { - const user = userEvent.setup(); - const toggleAllPageRowsSelectedMock = vi.fn(); - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [{ id: "row1" }], - }), - toggleAllPageRowsSelected: toggleAllPageRowsSelectedMock, - }; - + test("invokes downloadRows with correct formats", () => { render( ); + fireEvent.click(screen.getByText("common.download")); + fireEvent.click(screen.getByText("environments.surveys.summary.selected_responses_csv")); + expect(downloadRowsAction).toHaveBeenCalledWith(["r1", "r2"], "csv"); - await user.click(screen.getByText("common.clear_selection")); - expect(toggleAllPageRowsSelectedMock).toHaveBeenCalledWith(false); + fireEvent.click(screen.getByText("common.download")); + fireEvent.click(screen.getByText("environments.surveys.summary.selected_responses_excel")); + expect(downloadRowsAction).toHaveBeenCalledWith(["r1", "r2"], "xlsx"); }); - // For the tests that involve the modal dialog, we'll test the underlying functionality - // directly by mocking the deleteAction and deleteRows functions - - test("deleteAction is called with the row ID when deleting", async () => { - const deleteActionMock = vi.fn().mockResolvedValue(undefined); - const deleteRowsMock = vi.fn(); - - // Create a spy for the deleteRows function - const mockTable = { - getFilteredSelectedRowModel: vi.fn().mockReturnValue({ - rows: [{ id: "test-id-123" }], - }), - toggleAllPageRowsSelected: vi.fn(), - }; - - const { rerender } = render( + test("deletes rows successfully and shows success toast for contact", async () => { + deleteAction = vi.fn(() => Promise.resolve()); + render( ); - - // Test that the component renders the trash icon button - const trashIcon = document.querySelector(".lucide-trash2"); - expect(trashIcon).toBeInTheDocument(); - - // Since we can't easily test the dialog interaction without mocking a lot of components, - // we can test the core functionality by calling the handlers directly - - // We know that the deleteAction is called with the row ID - await deleteActionMock("test-id-123"); - expect(deleteActionMock).toHaveBeenCalledWith("test-id-123"); - - // We know that deleteRows is called with an array of row IDs - deleteRowsMock(["test-id-123"]); - expect(deleteRowsMock).toHaveBeenCalledWith(["test-id-123"]); + // open delete dialog + fireEvent.click(screen.getAllByText("common.delete")[0]); + fireEvent.click(screen.getByText("Confirm Delete")); + await waitFor(() => { + expect(deleteAction).toHaveBeenCalledTimes(2); + expect(deleteRowsAction).toHaveBeenCalledWith(["r1", "r2"]); + expect(toast.success).toHaveBeenCalledWith("common.table_items_deleted_successfully"); + }); }); - test("toast.success is called on successful deletion", async () => { - const deleteActionMock = vi.fn().mockResolvedValue(undefined); - - // We can test the toast directly - await deleteActionMock(); - - // In the component, after the deleteAction succeeds, it should call toast.success - toast.success("common.table_items_deleted_successfully"); - - // Verify that toast.success was called with the right message - expect(toast.success).toHaveBeenCalledWith("common.table_items_deleted_successfully"); + test("handles delete error and shows error toast for response", async () => { + deleteAction = vi.fn(() => Promise.reject(new Error("fail delete"))); + render( + + ); + // open delete menu (trigger button) + const deleteTriggers = screen.getAllByText("common.delete"); + fireEvent.click(deleteTriggers[0]); + fireEvent.click(screen.getByText("Confirm Delete")); + await waitFor(() => { + expect(toast.error).toHaveBeenCalledWith("fail delete"); + }); }); - test("toast.error is called on deletion error", async () => { - const errorMessage = "Failed to delete"; - - // We can test the error path directly - toast.error(errorMessage); - - // Verify that toast.error was called with the right message - expect(toast.error).toHaveBeenCalledWith(errorMessage); + test("deletes rows successfully and shows success toast for response", async () => { + deleteAction = vi.fn(() => Promise.resolve()); + render( + + ); + // open delete dialog + fireEvent.click(screen.getAllByText("common.delete")[0]); + fireEvent.click(screen.getByText("Confirm Delete")); + await waitFor(() => { + expect(deleteAction).toHaveBeenCalledTimes(2); + expect(deleteRowsAction).toHaveBeenCalledWith(["r1", "r2"]); + expect(toast.success).toHaveBeenCalledWith("common.table_items_deleted_successfully"); + }); }); - test("toast.error is called with generic message on unknown error", async () => { - // We can test the unknown error path directly - toast.error("common.an_unknown_error_occurred_while_deleting_table_items"); - - // Verify that toast.error was called with the generic message - expect(toast.error).toHaveBeenCalledWith("common.an_unknown_error_occurred_while_deleting_table_items"); + test("handles delete error for non-Error and shows generic error toast", async () => { + deleteAction = vi.fn(() => Promise.reject("fail nonerror")); // Changed from Error to string + render( + + ); + // open delete menu (trigger button) + const deleteTriggers = screen.getAllByText("common.delete"); + fireEvent.click(deleteTriggers[0]); + fireEvent.click(screen.getByText("Confirm Delete")); + await waitFor(() => { + expect(toast.error).toHaveBeenCalledWith("common.an_unknown_error_occurred_while_deleting_table_items"); + }); }); }); diff --git a/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx b/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx index 5e6eaae999..6f8c9e7077 100644 --- a/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx +++ b/apps/web/modules/ui/components/data-table/components/selected-row-settings.tsx @@ -1,25 +1,34 @@ "use client"; import { capitalizeFirstLetter } from "@/lib/utils/strings"; +import { Button } from "@/modules/ui/components/button"; import { DeleteDialog } from "@/modules/ui/components/delete-dialog"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/modules/ui/components/dropdown-menu"; import { Table } from "@tanstack/react-table"; import { useTranslate } from "@tolgee/react"; -import { Trash2Icon } from "lucide-react"; +import { ArrowDownToLineIcon, Trash2Icon } from "lucide-react"; import { useCallback, useState } from "react"; import { toast } from "react-hot-toast"; interface SelectedRowSettingsProps { table: Table; - deleteRows: (rowId: string[]) => void; + deleteRowsAction: (rowId: string[]) => void; type: "response" | "contact"; deleteAction: (id: string) => Promise; + downloadRowsAction?: (rowIds: string[], format: string) => void; } export const SelectedRowSettings = ({ table, - deleteRows, + deleteRowsAction, type, deleteAction, + downloadRowsAction, }: SelectedRowSettingsProps) => { const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [isDeleting, setIsDeleting] = useState(false); @@ -40,13 +49,11 @@ export const SelectedRowSettings = ({ setIsDeleting(true); const rowsToBeDeleted = table.getFilteredSelectedRowModel().rows.map((row) => row.id); - if (type === "response") { - await Promise.all(rowsToBeDeleted.map((responseId) => deleteAction(responseId))); - } else if (type === "contact") { - await Promise.all(rowsToBeDeleted.map((responseId) => deleteAction(responseId))); + if (type === "response" || type === "contact") { + await Promise.all(rowsToBeDeleted.map((rowId) => deleteAction(rowId))); } - deleteRows(rowsToBeDeleted); + deleteRowsAction(rowsToBeDeleted); toast.success(t("common.table_items_deleted_successfully", { type: capitalizeFirstLetter(type) })); } catch (error) { if (error instanceof Error) { @@ -64,34 +71,72 @@ export const SelectedRowSettings = ({ } }; + // Handle download selected rows + const handleDownloadSelectedRows = async (format: string) => { + const rowsToDownload = table.getFilteredSelectedRowModel().rows.map((row) => row.id); + if (downloadRowsAction && rowsToDownload.length > 0) { + downloadRowsAction(rowsToDownload, format); + } + }; + // Helper component for the separator const Separator = () =>
|
; - // Helper component for selectable options - const SelectableOption = ({ label, onClick }: { label: string; onClick: () => void }) => ( -
- {label} -
- ); - return ( -
-
- {selectedRowCount} {type === "response" ? t("common.responses") : t("common.contacts")} - {t("common.selected")} -
- - handleToggleAllRowsSelection(true)} /> - - handleToggleAllRowsSelection(false)} - /> - -
setIsDeleteDialogOpen(true)}> - + <> +
+
+ {selectedRowCount} {t(`common.${type}`)}s {t("common.selected")} +
+ + + + + + {downloadRowsAction && ( + + + + + + { + handleDownloadSelectedRows("csv"); + }}> +

{t("environments.surveys.summary.selected_responses_csv")}

+
+ { + handleDownloadSelectedRows("xlsx"); + }}> +

{t("environments.surveys.summary.selected_responses_excel")}

+
+
+
+ )} +
({ onDelete={handleDelete} isDeleting={isDeleting} /> -
+ ); }; diff --git a/apps/web/modules/ui/components/icons/net-promoter-score-icon.tsx b/apps/web/modules/ui/components/icons/net-promoter-score-icon.tsx index 2d13c580ad..3fc063e84f 100644 --- a/apps/web/modules/ui/components/icons/net-promoter-score-icon.tsx +++ b/apps/web/modules/ui/components/icons/net-promoter-score-icon.tsx @@ -4,8 +4,8 @@ export const NetPromoterScoreIcon: React.FC> = (pr diff --git a/apps/web/modules/ui/globals.css b/apps/web/modules/ui/globals.css index 4bc9ea1ede..ea32ab58cf 100644 --- a/apps/web/modules/ui/globals.css +++ b/apps/web/modules/ui/globals.css @@ -127,9 +127,9 @@ input[type="search"]::-ms-reveal { } input[type="range"]::-webkit-slider-thumb { - background: #0f172a; height: 20px; width: 20px; border-radius: 50%; -webkit-appearance: none; + background: #0f172a; } diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs index ddc3bfc9df..58115e0f9d 100644 --- a/apps/web/next.config.mjs +++ b/apps/web/next.config.mjs @@ -26,11 +26,6 @@ const nextConfig = { "app/api/packages": ["../../packages/js-core/dist/*", "../../packages/surveys/dist/*"], "/api/auth/**/*": ["../../node_modules/jose/**/*"], }, - i18n: { - locales: ["en-US", "de-DE", "fr-FR", "pt-BR", "zh-Hant-TW", "pt-PT"], - localeDetection: false, - defaultLocale: "en-US", - }, experimental: {}, transpilePackages: ["@formbricks/database"], images: { diff --git a/apps/web/package.json b/apps/web/package.json index ecd3ec0c8d..9a22435fef 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -117,11 +117,9 @@ "prismjs": "1.30.0", "qr-code-styling": "1.9.2", "qrcode": "1.5.4", - "react": "19.1.0", "react-colorful": "5.6.1", "react-confetti": "6.4.0", "react-day-picker": "9.6.7", - "react-dom": "19.1.0", "react-hook-form": "7.56.2", "react-hot-toast": "2.5.2", "react-turnstile": "1.1.4", diff --git a/apps/web/playwright/utils/helper.ts b/apps/web/playwright/utils/helper.ts index 2b767a5d45..0479edbeeb 100644 --- a/apps/web/playwright/utils/helper.ts +++ b/apps/web/playwright/utils/helper.ts @@ -181,7 +181,7 @@ export const createSurvey = async (page: Page, params: CreateSurveyParams) => { await page.locator('input[name="subheader"]').fill(params.openTextQuestion.description); await page.getByLabel("Placeholder").fill(params.openTextQuestion.placeholder); - await page.locator("p").filter({ hasText: params.openTextQuestion.question }).click(); + await page.locator("h3").filter({ hasText: params.openTextQuestion.question }).click(); // Single Select Question await page @@ -403,7 +403,7 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.locator('input[name="subheader"]').fill(params.openTextQuestion.description); await page.getByLabel("Placeholder").fill(params.openTextQuestion.placeholder); - await page.locator("p").filter({ hasText: params.openTextQuestion.question }).click(); + await page.locator("h3").filter({ hasText: params.openTextQuestion.question }).click(); // Single Select Question await page @@ -606,8 +606,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith // Adding logic // Open Text Question - await page.locator("p", { hasText: params.openTextQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.openTextQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "is submitted" }).click(); @@ -637,8 +637,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("textbox", { name: "Value" }).fill("This "); // Single Select Question - await page.locator("p", { hasText: params.singleSelectQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.singleSelectQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "Equals one of" }).click(); @@ -665,8 +665,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("textbox", { name: "Value" }).fill("is "); // Multi Select Question - await page.locator("p", { hasText: params.multiSelectQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.multiSelectQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "Includes all of" }).click(); @@ -706,8 +706,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("textbox", { name: "Value" }).fill("a "); // Picture Select Question - await page.locator("p", { hasText: params.pictureSelectQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.pictureSelectQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "is submitted" }).click(); @@ -731,8 +731,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("textbox", { name: "Value" }).fill("secret "); // Rating Question - await page.locator("p", { hasText: params.ratingQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.ratingQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: ">=" }).click(); @@ -758,8 +758,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("textbox", { name: "Value" }).fill("message "); // NPS Question - await page.locator("p", { hasText: params.npsQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.npsQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: ">", exact: true }).click(); @@ -819,8 +819,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("textbox", { name: "Value" }).fill("for "); // Ranking Question - await page.locator("p", { hasText: params.ranking.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.ranking.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "is skipped" }).click(); @@ -844,8 +844,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("textbox", { name: "Value" }).fill("e2e "); // Matrix Question - await page.locator("p", { hasText: params.matrix.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.matrix.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "is completely submitted" }).click(); @@ -877,8 +877,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.getByRole("option", { name: params.ctaQuestion.question }).click(); // CTA Question - await page.locator("p", { hasText: params.ctaQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.ctaQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "is skipped" }).click(); @@ -905,8 +905,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.locator("#action-0-value-input").fill("1"); // Consent Question - await page.locator("p", { hasText: params.consentQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.consentQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#action-0-objective").click(); await page.getByRole("option", { name: "Calculate" }).click(); @@ -918,8 +918,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.locator("#action-0-value-input").fill("2"); // File Upload Question - await page.locator("p", { hasText: params.fileUploadQuestion.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.fileUploadQuestion.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#action-0-objective").click(); await page.getByRole("option", { name: "Calculate" }).click(); @@ -936,7 +936,7 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith const tomorrow = new Date(new Date().setDate(new Date().getDate() + 1)).toISOString().split("T")[0]; await page.getByRole("main").getByText(params.date.question).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.getByPlaceholder("Value").fill(today); @@ -965,8 +965,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.locator("#action-0-value-input").fill("1"); // Cal Question - await page.locator("p", { hasText: params.cal.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.cal.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#condition-0-0-conditionOperator").click(); await page.getByRole("option", { name: "is skipped" }).click(); @@ -980,8 +980,8 @@ export const createSurveyWithLogic = async (page: Page, params: CreateSurveyWith await page.locator("#action-0-value-input").fill("1"); // Address Question - await page.locator("p", { hasText: params.address.question }).click(); - await page.getByRole("button", { name: "Show Advanced Settings" }).click(); + await page.getByRole("heading", { name: params.address.question }).click(); + await page.getByRole("button", { name: "Toggle advanced settings" }).click(); await page.getByRole("button", { name: "Add logic" }).click(); await page.locator("#action-0-objective").click(); await page.getByRole("option", { name: "Calculate" }).click(); diff --git a/apps/web/sentry.edge.config.ts b/apps/web/sentry.edge.config.ts index 4e510a7056..576498b3e1 100644 --- a/apps/web/sentry.edge.config.ts +++ b/apps/web/sentry.edge.config.ts @@ -12,8 +12,8 @@ if (SENTRY_DSN) { Sentry.init({ dsn: SENTRY_DSN, - // Adjust this value in production, or use tracesSampler for greater control - tracesSampleRate: 1, + // No tracing while Sentry doesn't update to telemetry 2.0.0 - https://github.com/getsentry/sentry-javascript/issues/15737 + tracesSampleRate: 0, // Setting this option to true will print useful information to the console while you're setting up Sentry. debug: false, diff --git a/apps/web/sentry.server.config.ts b/apps/web/sentry.server.config.ts index 286b3df8ef..c91683ff0a 100644 --- a/apps/web/sentry.server.config.ts +++ b/apps/web/sentry.server.config.ts @@ -11,8 +11,8 @@ if (SENTRY_DSN) { Sentry.init({ dsn: SENTRY_DSN, - // Adjust this value in production, or use tracesSampler for greater control - tracesSampleRate: 1, + // No tracing while Sentry doesn't update to telemetry 2.0.0 - https://github.com/getsentry/sentry-javascript/issues/15737 + tracesSampleRate: 0, // Setting this option to true will print useful information to the console while you're setting up Sentry. debug: false, diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 6c19162bf3..f61fa9bde5 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -187,8 +187,8 @@ x-environment: &environment # (Role Management is an Enterprise feature) # AUTH_SSO_DEFAULT_TEAM_ID= - # Set the below to 1 to disable the user management UI - # DISABLE_USER_MANAGEMENT: 0 + # Configure the minimum role for user management from UI(owner, manager, disabled) + # USER_MANAGEMENT_MINIMUM_ROLE="manager" services: postgres: diff --git a/docs/self-hosting/configuration/environment-variables.mdx b/docs/self-hosting/configuration/environment-variables.mdx index 915e46c26b..7095adb5c3 100644 --- a/docs/self-hosting/configuration/environment-variables.mdx +++ b/docs/self-hosting/configuration/environment-variables.mdx @@ -8,67 +8,67 @@ icon: "code" These variables are present inside your machine's docker-compose file. Restart the docker containers if you change any variables for them to take effect. -| Variable | Description | Required | Default | -| ---------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------- | -| WEBAPP_URL | Base URL of the site. | required | http://localhost:3000 | -| NEXTAUTH_URL | Location of the auth server. This should normally be the same as WEBAPP_URL | required | http://localhost:3000 | -| DATABASE_URL | Database URL with credentials. | required | | -| NEXTAUTH_SECRET | Secret for NextAuth, used for session signing and encryption. | required | (Generated by the user, must not exceed 32 bytes, `openssl rand -hex 32`) | -| ENCRYPTION_KEY | Secret for used by Formbricks for data encryption | required | (Generated by the user, must not exceed 32 bytes, `openssl rand -hex 32`) | -| CRON_SECRET | API Secret for running cron jobs. | required | (Generated by the user, must not exceed 32 bytes, `openssl rand -hex 32`) | -| LOG_LEVEL | Minimum log level (debug, info, warn, error, fatal) | optional | info | -| UPLOADS_DIR | Local directory for storing uploads. | optional | ./uploads | -| S3_ACCESS_KEY | Access key for S3. | optional | (resolved by the AWS SDK) | -| S3_SECRET_KEY | Secret key for S3. | optional | (resolved by the AWS SDK) | -| 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 | | -| IMPRINT_ADDRESS | Address for imprint. | optional | | -| EMAIL_AUTH_DISABLED | Disables the ability for users to signup or login via email and password if set to 1. | optional | | -| PASSWORD_RESET_DISABLED | Disables password reset functionality if set to 1. | optional | | -| EMAIL_VERIFICATION_DISABLED | Disables email verification if set to 1. | optional | | -| RATE_LIMITING_DISABLED | Disables rate limiting if set to 1. | optional | | -| INVITE_DISABLED | Disables the ability for invited users to create an account if set to 1. | optional | | -| MAIL_FROM | Email address to send emails from. | optional (required if email services are to be enabled) | | -| MAIL_FROM_NAME | Email name/title to send emails from. | optional (required if email services are to be enabled) | | -| SMTP_HOST | Host URL of your SMTP server. | optional (required if email services are to be enabled) | | -| SMTP_PORT | Host Port of your SMTP server. | optional (required if email services are to be enabled) | | -| SMTP_USER | Username for your SMTP Server. | optional (required if email services are to be enabled) | | -| SMTP_PASSWORD | Password for your SMTP Server. | optional (required if email services are to be enabled) | | -| SMTP_AUTHENTICATED | If set to 0, the server will not require SMTP_USER and SMTP_PASSWORD(default is 1) | optional | | -| SMTP_SECURE_ENABLED | SMTP secure connection. For using TLS, set to 1 else to 0. | optional (required if email services are to be enabled) | | -| SMTP_REJECT_UNAUTHORIZED_TLS | If set to 0, the server will accept connections without requiring authorization from the list of supplied CAs. | optional | 1 | -| TURNSTILE_SITE_KEY | Site key for Turnstile. | optional | | -| TURNSTILE_SECRET_KEY | Secret key for Turnstile. | optional | | -| RECAPTCHA_SITE_KEY | Site key for survey responses recaptcha bot protection | optional | | -| RECAPTCHA_SECRET_KEY | Secret key for recaptcha bot protection. | optional | | -| GITHUB_ID | Client ID for GitHub. | optional (required if GitHub auth is enabled) | | -| GITHUB_SECRET | Secret for GitHub. | optional (required if GitHub auth is enabled) | | -| GOOGLE_CLIENT_ID | Client ID for Google. | optional (required if Google auth is enabled) | | -| GOOGLE_CLIENT_SECRET | Secret for Google. | optional (required if Google auth is enabled) | | -| STRIPE_SECRET_KEY | Secret key for Stripe integration. | optional | | -| STRIPE_WEBHOOK_SECRET | Webhook secret for Stripe integration. | optional | | -| TELEMETRY_DISABLED | Disables telemetry if set to 1. | optional | | -| DEFAULT_BRAND_COLOR | Default brand color for your app (Can be overwritten from the UI as well). | optional | #64748b | -| DEFAULT_ORGANIZATION_ID | Automatically assign new users to a specific organization when joining | optional | | -| OIDC_DISPLAY_NAME | Display name for Custom OpenID Connect Provider | optional | | -| OIDC_CLIENT_ID | Client ID for Custom OpenID Connect Provider | optional (required if OIDC auth is enabled) | | -| OIDC_CLIENT_SECRET | Secret for Custom OpenID Connect Provider | optional (required if OIDC auth is enabled) | | -| OIDC_ISSUER | Issuer URL for Custom OpenID Connect Provider (should have .well-known configured at this) | optional (required if OIDC auth is enabled) | | -| OIDC_SIGNING_ALGORITHM | Signing Algorithm for Custom OpenID Connect Provider | optional | RS256 | -| OPENTELEMETRY_LISTENER_URL | URL for OpenTelemetry listener inside Formbricks. | optional | | -| UNKEY_ROOT_KEY | Key for the [Unkey](https://www.unkey.com/) service. This is used for Rate Limiting for management API. | optional | | -| PROMETHEUS_ENABLED | Enables Prometheus metrics if set to 1. | optional | | -| PROMETHEUS_EXPORTER_PORT | Port for Prometheus metrics. | optional | 9090 | -| DOCKER_CRON_ENABLED | Controls whether cron jobs run in the Docker image. Set to 0 to disable (useful for cluster setups). | optional | 1 | -| DEFAULT_TEAM_ID | Default team ID for new users. | optional | | -| SURVEY_URL | Set this to change the domain of the survey. | optional | WEBAPP_URL | -| SENTRY_DSN | Set this to track errors and monitor performance in Sentry. | optional | -| SENTRY_AUTH_TOKEN | Set this if you want to make errors more readable in Sentry. | optional | -| DISABLE_USER_MANAGEMENT | Set this to hide the user management UI. | optional | +| Variable | Description | Required | Default | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------- | +| WEBAPP_URL | Base URL of the site. | required | http://localhost:3000 | +| NEXTAUTH_URL | Location of the auth server. This should normally be the same as WEBAPP_URL | required | http://localhost:3000 | +| DATABASE_URL | Database URL with credentials. | required | | +| NEXTAUTH_SECRET | Secret for NextAuth, used for session signing and encryption. | required | (Generated by the user, must not exceed 32 bytes, `openssl rand -hex 32`) | +| ENCRYPTION_KEY | Secret for used by Formbricks for data encryption | required | (Generated by the user, must not exceed 32 bytes, `openssl rand -hex 32`) | +| CRON_SECRET | API Secret for running cron jobs. | required | (Generated by the user, must not exceed 32 bytes, `openssl rand -hex 32`) | +| LOG_LEVEL | Minimum log level (debug, info, warn, error, fatal) | optional | info | +| UPLOADS_DIR | Local directory for storing uploads. | optional | ./uploads | +| S3_ACCESS_KEY | Access key for S3. | optional | (resolved by the AWS SDK) | +| S3_SECRET_KEY | Secret key for S3. | optional | (resolved by the AWS SDK) | +| 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 | | +| IMPRINT_ADDRESS | Address for imprint. | optional | | +| EMAIL_AUTH_DISABLED | Disables the ability for users to signup or login via email and password if set to 1. | optional | | +| PASSWORD_RESET_DISABLED | Disables password reset functionality if set to 1. | optional | | +| EMAIL_VERIFICATION_DISABLED | Disables email verification if set to 1. | optional | | +| RATE_LIMITING_DISABLED | Disables rate limiting if set to 1. | optional | | +| INVITE_DISABLED | Disables the ability for invited users to create an account if set to 1. | optional | | +| MAIL_FROM | Email address to send emails from. | optional (required if email services are to be enabled) | | +| MAIL_FROM_NAME | Email name/title to send emails from. | optional (required if email services are to be enabled) | | +| SMTP_HOST | Host URL of your SMTP server. | optional (required if email services are to be enabled) | | +| SMTP_PORT | Host Port of your SMTP server. | optional (required if email services are to be enabled) | | +| SMTP_USER | Username for your SMTP Server. | optional (required if email services are to be enabled) | | +| SMTP_PASSWORD | Password for your SMTP Server. | optional (required if email services are to be enabled) | | +| SMTP_AUTHENTICATED | If set to 0, the server will not require SMTP_USER and SMTP_PASSWORD(default is 1) | optional | | +| SMTP_SECURE_ENABLED | SMTP secure connection. For using TLS, set to 1 else to 0. | optional (required if email services are to be enabled) | | +| SMTP_REJECT_UNAUTHORIZED_TLS | If set to 0, the server will accept connections without requiring authorization from the list of supplied CAs. | optional | 1 | +| TURNSTILE_SITE_KEY | Site key for Turnstile. | optional | | +| TURNSTILE_SECRET_KEY | Secret key for Turnstile. | optional | | +| RECAPTCHA_SITE_KEY | Site key for survey responses recaptcha bot protection | optional | | +| RECAPTCHA_SECRET_KEY | Secret key for recaptcha bot protection. | optional | | +| GITHUB_ID | Client ID for GitHub. | optional (required if GitHub auth is enabled) | | +| GITHUB_SECRET | Secret for GitHub. | optional (required if GitHub auth is enabled) | | +| GOOGLE_CLIENT_ID | Client ID for Google. | optional (required if Google auth is enabled) | | +| GOOGLE_CLIENT_SECRET | Secret for Google. | optional (required if Google auth is enabled) | | +| STRIPE_SECRET_KEY | Secret key for Stripe integration. | optional | | +| STRIPE_WEBHOOK_SECRET | Webhook secret for Stripe integration. | optional | | +| TELEMETRY_DISABLED | Disables telemetry if set to 1. | optional | | +| DEFAULT_BRAND_COLOR | Default brand color for your app (Can be overwritten from the UI as well). | optional | #64748b | +| DEFAULT_ORGANIZATION_ID | Automatically assign new users to a specific organization when joining | optional | | +| OIDC_DISPLAY_NAME | Display name for Custom OpenID Connect Provider | optional | | +| OIDC_CLIENT_ID | Client ID for Custom OpenID Connect Provider | optional (required if OIDC auth is enabled) | | +| OIDC_CLIENT_SECRET | Secret for Custom OpenID Connect Provider | optional (required if OIDC auth is enabled) | | +| OIDC_ISSUER | Issuer URL for Custom OpenID Connect Provider (should have .well-known configured at this) | optional (required if OIDC auth is enabled) | | +| OIDC_SIGNING_ALGORITHM | Signing Algorithm for Custom OpenID Connect Provider | optional | RS256 | +| OPENTELEMETRY_LISTENER_URL | URL for OpenTelemetry listener inside Formbricks. | optional | | +| UNKEY_ROOT_KEY | Key for the [Unkey](https://www.unkey.com/) service. This is used for Rate Limiting for management API. | optional | | +| PROMETHEUS_ENABLED | Enables Prometheus metrics if set to 1. | optional | | +| PROMETHEUS_EXPORTER_PORT | Port for Prometheus metrics. | optional | 9090 | +| DOCKER_CRON_ENABLED | Controls whether cron jobs run in the Docker image. Set to 0 to disable (useful for cluster setups). | optional | 1 | +| DEFAULT_TEAM_ID | Default team ID for new users. | optional | | +| SURVEY_URL | Set this to change the domain of the survey. | optional | WEBAPP_URL | +| SENTRY_DSN | Set this to track errors and monitor performance in Sentry. | optional | +| SENTRY_AUTH_TOKEN | Set this if you want to make errors more readable in Sentry. | optional | +| USER_MANAGEMENT_MINIMUM_ROLE | Set this to control which roles can access user management features. Accepted values: "owner", "manager", "disabled" | optional | manager | -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. +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/package.json b/package.json index b06078b031..d95d0d44d4 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "schema": "packages/database/schema.prisma" }, "scripts": { + "clean:all": "turbo run clean && rimraf node_modules pnpm-lock.yaml .turbo coverage out", "clean": "turbo run clean && rimraf node_modules .turbo coverage out", "build": "turbo run build", "build:dev": "turbo run build:dev", @@ -35,6 +36,10 @@ "fb-migrate-dev": "pnpm --filter @formbricks/database create-migration && pnpm prisma generate", "tolgee-pull": "BRANCH_NAME=$(node -p \"require('./branch.json').branchName\") && tolgee pull --tags \"draft:$BRANCH_NAME\" \"production\" && prettier --write ./apps/web/locales/*.json" }, + "dependencies": { + "react": "19.1.0", + "react-dom": "19.1.0" + }, "devDependencies": { "@azure/microsoft-playwright-testing": "1.0.0-beta.7", "@formbricks/eslint-config": "workspace:*", diff --git a/packages/logger/src/logger.ts b/packages/logger/src/logger.ts index 5401c4f3f6..782a7b4b12 100644 --- a/packages/logger/src/logger.ts +++ b/packages/logger/src/logger.ts @@ -2,10 +2,13 @@ import Pino, { type Logger, type LoggerOptions, stdSerializers } from "pino"; import { type TLogLevel, ZLogLevel } from "../types/logger"; const IS_PRODUCTION = !process.env.NODE_ENV || process.env.NODE_ENV === "production"; +const IS_BUILD = process.env.NEXT_PHASE === "phase-production-build"; + const getLogLevel = (): TLogLevel => { let logLevel: TLogLevel = "info"; if (IS_PRODUCTION) logLevel = "warn"; + if (IS_BUILD) logLevel = "error"; // Only show errors during build const envLogLevel = process.env.LOG_LEVEL; diff --git a/packages/surveys/src/components/general/question-media.tsx b/packages/surveys/src/components/general/question-media.tsx index 192a1d83a4..d9772b31ec 100644 --- a/packages/surveys/src/components/general/question-media.tsx +++ b/packages/surveys/src/components/general/question-media.tsx @@ -57,7 +57,7 @@ export function QuestionMedia({ imgUrl, videoUrl, altText = "Image" }: QuestionM setIsLoading(false); }} allow="accelerometer; autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" - referrerpolicy="strict-origin-when-cross-origin" + referrerPolicy="strict-origin-when-cross-origin" />
diff --git a/packages/surveys/src/components/questions/open-text-question.test.tsx b/packages/surveys/src/components/questions/open-text-question.test.tsx index 3836123b88..0bff21b187 100644 --- a/packages/surveys/src/components/questions/open-text-question.test.tsx +++ b/packages/surveys/src/components/questions/open-text-question.test.tsx @@ -1,5 +1,5 @@ import "@testing-library/jest-dom/vitest"; -import { cleanup, render, screen } from "@testing-library/preact"; +import { cleanup, fireEvent, render, screen } from "@testing-library/preact"; import userEvent from "@testing-library/user-event"; import { afterEach, describe, expect, test, vi } from "vitest"; import { type TSurveyOpenTextQuestion, TSurveyQuestionTypeEnum } from "@formbricks/types/surveys/types"; @@ -76,10 +76,7 @@ describe("OpenTextQuestion", () => { render(); const input = screen.getByPlaceholderText("Type here..."); - - // Directly set the input value and trigger the input event - Object.defineProperty(input, "value", { value: "Hello" }); - input.dispatchEvent(new Event("input", { bubbles: true })); + fireEvent.input(input, { target: { value: "Hello" } }); expect(onChange).toHaveBeenCalledWith({ q1: "Hello" }); }); @@ -163,4 +160,291 @@ describe("OpenTextQuestion", () => { expect(focusMock).toHaveBeenCalled(); }); + + test("handles input change for textarea with resize functionality", async () => { + // Create a spy on the Element.prototype to monitor style changes + const styleSpy = vi.spyOn(HTMLElement.prototype, "style", "get").mockImplementation( + () => + ({ + height: "", + overflow: "", + }) as CSSStyleDeclaration + ); + const onChange = vi.fn(); + + render( + + ); + + const textarea = screen.getByRole("textbox"); + // Only trigger a regular input event without trying to modify scrollHeight + fireEvent.input(textarea, { target: { value: "Test value for textarea" } }); + + // Check that onChange was called with the correct value + expect(onChange).toHaveBeenCalledWith({ q1: "Test value for textarea" }); + + // Clean up the spy + styleSpy.mockRestore(); + }); + + test("handles textarea resize with different heights", async () => { + // Mock styles and scrollHeight for handleInputResize testing + let heightValue = ""; + let overflowValue = ""; + + // Mock style setter to capture values + const originalSetProperty = CSSStyleDeclaration.prototype.setProperty; + CSSStyleDeclaration.prototype.setProperty = vi.fn(); + + // Mock to capture style changes + Object.defineProperty(HTMLElement.prototype, "style", { + get: vi.fn(() => ({ + height: heightValue, + overflow: overflowValue, + setProperty: (prop: string, value: string) => { + if (prop === "height") heightValue = value; + if (prop === "overflow") overflowValue = value; + }, + })), + }); + + const onChange = vi.fn(); + + render( + + ); + + const textarea = screen.getByRole("textbox"); + + // Simulate normal height (less than max) + const mockNormalEvent = { + target: { + style: { height: "", overflow: "" }, + scrollHeight: 100, // Less than max 160px + }, + }; + + // Get the event handler + const inputHandler = textarea.oninput as EventListener; + if (inputHandler) { + inputHandler(mockNormalEvent as unknown as Event); + } + + // Now simulate text that exceeds max height + const mockOverflowEvent = { + target: { + style: { height: "", overflow: "" }, + scrollHeight: 200, // More than max 160px + }, + }; + + if (inputHandler) { + inputHandler(mockOverflowEvent as unknown as Event); + } + + // Restore the original method + CSSStyleDeclaration.prototype.setProperty = originalSetProperty; + }); + + test("handles form submission by enter key", async () => { + const onSubmit = vi.fn(); + const setTtc = vi.fn(); + + const { container } = render( + + ); + + // Get the form element using container query + const form = container.querySelector("form"); + expect(form).toBeInTheDocument(); + + // Simulate form submission + fireEvent.submit(form!); + + expect(onSubmit).toHaveBeenCalledWith({ q1: "Test submission" }, {}); + expect(setTtc).toHaveBeenCalled(); + }); + + test("applies minLength constraint when configured", () => { + render( + + ); + + const input = screen.getByPlaceholderText("Type here..."); + expect(input).toHaveAttribute("minLength", "5"); + expect(input).toHaveAttribute("maxLength", "100"); + }); + + test("handles video URL in media", () => { + render( + + ); + + expect(screen.getByTestId("question-media")).toBeInTheDocument(); + }); + + test("doesn't autofocus when not current question", () => { + const focusMock = vi.fn(); + window.HTMLElement.prototype.focus = focusMock; + + render( + + ); + + expect(focusMock).not.toHaveBeenCalled(); + }); + + test("handles input change for textarea", async () => { + const onChange = vi.fn(); + + render( + + ); + + const textarea = screen.getByRole("textbox"); + fireEvent.input(textarea, { target: { value: "Long text response" } }); + + expect(onChange).toHaveBeenCalledWith({ q1: "Long text response" }); + }); + + test("applies phone number maxLength constraint", () => { + render(); + + const input = screen.getByPlaceholderText("Type here..."); + expect(input).toHaveAttribute("maxLength", "30"); + }); + + test("renders without subheader when not provided", () => { + const questionWithoutSubheader = { + ...defaultQuestion, + subheader: undefined, + }; + + render(); + expect(screen.getByTestId("mock-subheader")).toHaveTextContent(""); + }); + + test("sets correct tabIndex based on current question status", () => { + // When it's the current question + render(); + const inputCurrent = screen.getByPlaceholderText("Type here..."); + const submitCurrent = screen.getByRole("button", { name: "Submit" }); + + expect(inputCurrent).toHaveAttribute("tabIndex", "0"); + expect(submitCurrent).toHaveAttribute("tabIndex", "0"); + + // When it's not the current question + cleanup(); + render(); + const inputNotCurrent = screen.getByPlaceholderText("Type here..."); + const submitNotCurrent = screen.getByRole("button", { name: "Submit" }); + + expect(inputNotCurrent).toHaveAttribute("tabIndex", "-1"); + expect(submitNotCurrent).toHaveAttribute("tabIndex", "-1"); + }); + + test("applies title attribute for phone input in textarea", () => { + render( + + ); + + const textarea = screen.getByRole("textbox"); + expect(textarea).toHaveAttribute("title", "Please enter a valid phone number"); + }); + + test("applies character limits for textarea", () => { + render( + + ); + + const textarea = screen.getByRole("textbox"); + expect(textarea).toHaveAttribute("minLength", "10"); + expect(textarea).toHaveAttribute("maxLength", "200"); + }); + + test("renders input with no maxLength for other input types", () => { + render( + + ); + + const input = screen.getByPlaceholderText("Type here..."); + // Should be undefined for non-text, non-phone types + expect(input).not.toHaveAttribute("maxLength"); + }); + + test("applies autofocus attribute to textarea when enabled", () => { + render( + + ); + + const textarea = screen.getByRole("textbox"); + expect(textarea).toHaveAttribute("autoFocus"); + }); + + test("does not apply autofocus attribute to textarea when not current question", () => { + render( + + ); + + const textarea = screen.getByRole("textbox"); + expect(textarea).not.toHaveAttribute("autoFocus"); + }); }); diff --git a/packages/surveys/src/lib/recall.test.ts b/packages/surveys/src/lib/recall.test.ts index 855fa445bf..10aa707d6a 100644 --- a/packages/surveys/src/lib/recall.test.ts +++ b/packages/surveys/src/lib/recall.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from "vitest"; +import { describe, expect, test, vi } from "vitest"; import { type TResponseData, type TResponseVariables } from "@formbricks/types/responses"; import { type TSurveyQuestion, TSurveyQuestionTypeEnum } from "../../../types/surveys/types"; import { parseRecallInformation, replaceRecallInfo } from "./recall"; @@ -15,7 +15,7 @@ vi.mock("./i18n", () => ({ vi.mock("./date-time", () => ({ isValidDateString: (val: string) => /^\d{4}-\d{2}-\d{2}$/.test(val) || /^\d{2}-\d{2}-\d{4}$/.test(val), formatDateWithOrdinal: (date: Date) => - `${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}_formatted`, + `${date.getUTCFullYear()}-${("0" + (date.getUTCMonth() + 1)).slice(-2)}-${("0" + date.getUTCDate()).slice(-2)}_formatted`, })); describe("replaceRecallInfo", () => { @@ -34,79 +34,73 @@ describe("replaceRecallInfo", () => { lastLogin: "2024-03-10", }; - it("should replace recall info from responseData", () => { + test("should replace recall info from responseData", () => { const text = "Welcome, #recall:name/fallback:Guest#! Your email is #recall:email/fallback:N/A#."; const expected = "Welcome, John Doe! Your email is john.doe@example.com."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should replace recall info from variables if not in responseData", () => { + test("should replace recall info from variables if not in responseData", () => { const text = "Product: #recall:productName/fallback:N/A#. Role: #recall:userRole/fallback:User#."; const expected = "Product: Formbricks. Role: Admin."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should use fallback if value is not found in responseData or variables", () => { + test("should use fallback if value is not found in responseData or variables", () => { const text = "Your organization is #recall:orgName/fallback:DefaultOrg#."; const expected = "Your organization is DefaultOrg."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should handle nbsp in fallback", () => { - const text = "Status: #recall:status/fallback:PendingnbspReview#."; - const expected = "Status: Pending Review."; + test("should handle nbsp in fallback", () => { + const text = "Status: #recall:status/fallback:Pending Review#."; + const expected = "Status: Pending& ;Review."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should format date strings from responseData", () => { + test("should format date strings from responseData", () => { const text = "Registered on: #recall:registrationDate/fallback:N/A#."; const expected = "Registered on: 2023-01-15_formatted."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should format date strings from variables", () => { + test("should format date strings from variables", () => { const text = "Last login: #recall:lastLogin/fallback:N/A#."; const expected = "Last login: 2024-03-10_formatted."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should join array values with a comma and space", () => { + test("should join array values with a comma and space", () => { const text = "Tags: #recall:tags/fallback:none#."; const expected = "Tags: beta, user."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should handle empty array values, replacing with fallback", () => { + test("should handle empty array values, replacing with fallback", () => { const text = "Categories: #recall:emptyArray/fallback:No Categories#."; const expected = "Categories: No& ;Categories."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should handle null values from responseData, replacing with fallback", () => { - const text = "Preference: #recall:nullValue/fallback:Not Set#."; - const expected = "Preference: Not& ;Set."; - expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); - }); - - it("should handle multiple recall patterns in a single string", () => { + test("should handle multiple recall patterns in a single string", () => { const text = "Hi #recall:name/fallback:User#, welcome to #recall:productName/fallback:Our Product#. Your role is #recall:userRole/fallback:Member#."; const expected = "Hi John Doe, welcome to #recall:productName/fallback:Our Product#. Your role is Admin."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should return original text if no recall pattern is found", () => { + test("should return original text if no recall pattern is found", () => { const text = "This is a normal text without recall info."; expect(replaceRecallInfo(text, responseData, variables)).toBe(text); }); - it("should handle recall ID not found, using fallback", () => { + test("should handle recall ID not found, using fallback", () => { const text = "Value: #recall:nonExistent/fallback:FallbackValue#."; const expected = "Value: FallbackValue."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should handle if recall info is incomplete (e.g. missing fallback part), effectively using empty fallback", () => { + test("should handle if recall info is incomplete (e.g. missing fallback part), effectively using empty fallback", () => { // This specific pattern is not fully matched by extractRecallInfo, leading to no replacement. // The current extractRecallInfo expects #recall:ID/fallback:VALUE# const text = "Test: #recall:name#"; @@ -114,10 +108,28 @@ describe("replaceRecallInfo", () => { expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); - it("should handle complex fallback with spaces and special characters encoded as nbsp", () => { + test("should handle complex fallback with spaces and special characters encoded as nbsp", () => { const text = - "Details: #recall:extraInfo/fallback:ValuenbspWithnbspSpaces# and #recall:anotherInfo/fallback:Default#"; - const expected = "Details: Value With Spaces and Default"; + "Details: #recall:extraInfo/fallback:Value With Spaces# and #recall:anotherInfo/fallback:Default#"; + const expected = "Details: Value& ;With& ;Spaces and Default"; + expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); + }); + + test("should handle fallback with only 'nbsp'", () => { + const text = "Note: #recall:note/fallback:nbsp#."; + const expected = "Note: ."; + expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); + }); + + test("should handle fallback with only ' '", () => { + const text = "Note: #recall:note/fallback: #."; + const expected = "Note: & ;."; + expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); + }); + + test("should handle fallback with '$nbsp;' (should not replace '$nbsp;')", () => { + const text = "Note: #recall:note/fallback:$nbsp;#."; + const expected = "Note: $ ;."; expect(replaceRecallInfo(text, responseData, variables)).toBe(expected); }); }); @@ -151,7 +163,7 @@ describe("parseRecallInformation", () => { // other necessary TSurveyQuestion fields can be added here with default values }; - it("should replace recall info in headline", () => { + test("should replace recall info in headline", () => { const question: TSurveyQuestion = { ...baseQuestion, headline: { en: "Welcome, #recall:name/fallback:Guest#!" }, @@ -161,7 +173,7 @@ describe("parseRecallInformation", () => { expect(result.headline.en).toBe(expectedHeadline); }); - it("should replace recall info in subheader", () => { + test("should replace recall info in subheader", () => { const question: TSurveyQuestion = { ...baseQuestion, headline: { en: "Main Question" }, @@ -172,7 +184,7 @@ describe("parseRecallInformation", () => { expect(result.subheader?.en).toBe(expectedSubheader); }); - it("should replace recall info in both headline and subheader", () => { + test("should replace recall info in both headline and subheader", () => { const question: TSurveyQuestion = { ...baseQuestion, headline: { en: "User: #recall:name/fallback:User#" }, @@ -183,7 +195,7 @@ describe("parseRecallInformation", () => { expect(result.subheader?.en).toBe("Survey: Onboarding"); }); - it("should not change text if no recall info is present", () => { + test("should not change text if no recall info is present", () => { const question: TSurveyQuestion = { ...baseQuestion, headline: { en: "A simple question." }, @@ -199,7 +211,7 @@ describe("parseRecallInformation", () => { expect(result.subheader?.en).toBe(question.subheader?.en); }); - it("should handle undefined subheader gracefully", () => { + test("should handle undefined subheader gracefully", () => { const question: TSurveyQuestion = { ...baseQuestion, headline: { en: "Question with #recall:name/fallback:User#" }, @@ -210,7 +222,7 @@ describe("parseRecallInformation", () => { expect(result.subheader).toBeUndefined(); }); - it("should not modify subheader if languageCode content is missing, even if recall is in other lang", () => { + test("should not modify subheader if languageCode content is missing, even if recall is in other lang", () => { const question: TSurveyQuestion = { ...baseQuestion, headline: { en: "Hello #recall:name/fallback:User#" }, @@ -222,7 +234,7 @@ describe("parseRecallInformation", () => { expect(result.subheader?.fr).toBe("Bonjour #recall:name/fallback:Utilisateur#"); }); - it("should handle malformed recall string (empty ID) leading to no replacement for that pattern", () => { + test("should handle malformed recall string (empty ID) leading to no replacement for that pattern", () => { // This tests extractId returning null because extractRecallInfo won't match '#recall:/fallback:foo#' // due to idPattern requiring at least one char for ID. const question: TSurveyQuestion = { @@ -233,7 +245,7 @@ describe("parseRecallInformation", () => { expect(result.headline.en).toBe("Malformed: #recall:/fallback:foo# and valid: John Doe"); }); - it("should use empty string for empty fallback value", () => { + test("should use empty string for empty fallback value", () => { // This tests extractFallbackValue returning "" const question: TSurveyQuestion = { ...baseQuestion, @@ -243,7 +255,7 @@ describe("parseRecallInformation", () => { expect(result.headline.en).toBe("Data: "); // nonExistentData not found, empty fallback used }); - it("should handle recall info if subheader is present but no text for languageCode", () => { + test("should handle recall info if subheader is present but no text for languageCode", () => { const question: TSurveyQuestion = { ...baseQuestion, headline: { en: "Headline #recall:name/fallback:User#" }, diff --git a/packages/surveys/src/lib/recall.ts b/packages/surveys/src/lib/recall.ts index e2e78f2081..cace8e174c 100644 --- a/packages/surveys/src/lib/recall.ts +++ b/packages/surveys/src/lib/recall.ts @@ -7,27 +7,19 @@ import { type TSurveyQuestion } from "@formbricks/types/surveys/types"; const extractId = (text: string): string | null => { const pattern = /#recall:([A-Za-z0-9_-]+)/; const match = text.match(pattern); - if (match && match[1]) { - return match[1]; - } else { - return null; - } + return match?.[1] ?? null; }; // Extracts the fallback value from a string containing the "fallback" pattern. const extractFallbackValue = (text: string): string => { const pattern = /fallback:(\S*)#/; const match = text.match(pattern); - if (match && match[1]) { - return match[1]; - } else { - return ""; - } + return match?.[1] ?? ""; }; // Extracts the complete recall information (ID and fallback) from a headline string. const extractRecallInfo = (headline: string, id?: string): string | null => { - const idPattern = id ? id : "[A-Za-z0-9_-]+"; + const idPattern = id ?? "[A-Za-z0-9_-]+"; const pattern = new RegExp(`#recall:(${idPattern})\\/fallback:(\\S*)#`); const match = headline.match(pattern); return match ? match[0] : null; @@ -47,7 +39,7 @@ export const replaceRecallInfo = ( const recallItemId = extractId(recallInfo); if (!recallItemId) return modifiedText; // Return the text if no ID could be extracted - const fallback = extractFallbackValue(recallInfo).replaceAll("nbsp", " "); + const fallback = extractFallbackValue(recallInfo).replace(/nbsp/g, " ").trim(); let value: string | null = null; // Fetching value from variables based on recallItemId diff --git a/packages/surveys/vite.config.mts b/packages/surveys/vite.config.mts index faae0c8d3c..15f5a68e7d 100644 --- a/packages/surveys/vite.config.mts +++ b/packages/surveys/vite.config.mts @@ -1,10 +1,11 @@ import preact from "@preact/preset-vite"; import { fileURLToPath } from "url"; import { dirname, resolve } from "path"; -import { defineConfig, loadEnv } from "vite"; +import { loadEnv } from "vite"; import dts from "vite-plugin-dts"; import tsconfigPaths from "vite-tsconfig-paths"; import { copyCompiledAssetsPlugin } from "../vite-plugins/copy-compiled-assets"; +import { defineConfig } from "vitest/config"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -29,7 +30,7 @@ const config = ({ mode }) => { }, }, define: { - "process.env": env, + "process.env.NODE_ENV": JSON.stringify(mode), }, build: { emptyOutDir: false, diff --git a/packages/types/responses.ts b/packages/types/responses.ts index 9960b1e967..9d552ae752 100644 --- a/packages/types/responses.ts +++ b/packages/types/responses.ts @@ -155,6 +155,7 @@ const ZResponseFilterCriteriaFilledOut = z.object({ export const ZResponseFilterCriteria = z.object({ finished: z.boolean().optional(), + responseIds: z.array(ZId).optional(), createdAt: z .object({ min: z.date().optional(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48fc0d654c..0b70ff2fef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,13 @@ settings: importers: .: + dependencies: + react: + specifier: 19.1.0 + version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) devDependencies: '@azure/microsoft-playwright-testing': specifier: 1.0.0-beta.7 @@ -41,12 +48,6 @@ importers: eslint-plugin-react-refresh: specifier: 0.4.20 version: 0.4.20(eslint@8.57.0) - react: - specifier: 19.1.0 - version: 19.1.0 - react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) devDependencies: '@chromatic-com/storybook': specifier: 3.2.6 @@ -74,7 +75,7 @@ importers: version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-vite': specifier: 8.6.12 - version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@storybook/test': specifier: 8.6.12 version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) @@ -86,7 +87,7 @@ importers: version: 8.32.0(eslint@8.57.0)(typescript@5.8.3) '@vitejs/plugin-react': specifier: 4.4.1 - version: 4.4.1(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 4.4.1(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) esbuild: specifier: 0.25.4 version: 0.25.4 @@ -101,22 +102,22 @@ importers: version: 8.6.12(prettier@3.5.3) vite: specifier: 6.3.5 - version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) apps/web: dependencies: '@aws-sdk/client-s3': specifier: 3.804.0 - version: 3.804.0(aws-crt@1.26.2) + version: 3.804.0 '@aws-sdk/s3-presigned-post': specifier: 3.804.0 - version: 3.804.0(aws-crt@1.26.2) + version: 3.804.0 '@aws-sdk/s3-request-presigner': specifier: 3.804.0 version: 3.804.0 '@boxyhq/saml-jackson': specifier: 1.45.2 - version: 1.45.2(aws-crt@1.26.2)(socks@2.8.4)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)) + version: 1.45.2(socks@2.8.4)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)) '@dnd-kit/core': specifier: 6.3.1 version: 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -176,7 +177,7 @@ importers: version: 0.31.0 '@lexical/react': specifier: 0.31.0 - version: 0.31.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.26) + version: 0.31.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.27) '@lexical/rich-text': specifier: 0.31.0 version: 0.31.0 @@ -293,7 +294,7 @@ importers: version: 0.5.5 '@vercel/functions': specifier: 2.0.2 - version: 2.0.2(@aws-sdk/credential-provider-web-identity@3.804.0(aws-crt@1.26.2)) + version: 2.0.2(@aws-sdk/credential-provider-web-identity@3.804.0) '@vercel/og': specifier: 0.6.8 version: 0.6.8 @@ -402,9 +403,6 @@ importers: qrcode: specifier: 1.5.4 version: 1.5.4 - react: - specifier: 19.1.0 - version: 19.1.0 react-colorful: specifier: 5.6.1 version: 5.6.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -414,9 +412,6 @@ importers: react-day-picker: specifier: 9.6.7 version: 9.6.7(react@19.1.0) - react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) react-hook-form: specifier: 7.56.2 version: 7.56.2(react@19.1.0) @@ -522,7 +517,7 @@ importers: version: 1.2.0 '@vitest/coverage-v8': specifier: 3.1.3 - version: 3.1.3(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 3.1.3(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.3) @@ -540,16 +535,16 @@ importers: version: 10.9.2(@types/node@22.15.18)(typescript@5.8.3) vite: specifier: 6.3.5 - version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vitest-mock-extended: specifier: 3.1.0 - version: 3.1.0(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 3.1.0(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) packages/config-eslint: devDependencies: @@ -564,10 +559,10 @@ importers: version: 8.32.1(eslint@8.57.0)(typescript@5.8.3) '@vercel/style-guide': specifier: 6.0.0 - version: 6.0.0(@next/eslint-plugin-next@15.3.2)(eslint@8.57.0)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 6.0.0(@next/eslint-plugin-next@15.3.2)(eslint@8.57.0)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/eslint-plugin': specifier: 1.1.44 - version: 1.1.44(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 1.1.44(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) eslint-config-next: specifier: 15.3.2 version: 15.3.2(eslint@8.57.0)(typescript@5.8.3) @@ -667,13 +662,13 @@ importers: version: link:../config-eslint vite: specifier: 6.3.5 - version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.40.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) packages/js-core: devDependencies: @@ -685,19 +680,19 @@ importers: version: link:../config-eslint '@vitest/coverage-v8': specifier: 3.1.3 - version: 3.1.3(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 3.1.3(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) terser: specifier: 5.39.1 version: 5.39.1 vite: specifier: 6.3.5 - version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.40.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) packages/logger: dependencies: @@ -719,13 +714,13 @@ importers: version: link:../config-eslint vite: specifier: 6.3.5 - version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.40.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vitest: specifier: 3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) packages/surveys: dependencies: @@ -762,7 +757,7 @@ importers: version: link:../types '@preact/preset-vite': specifier: 2.10.1 - version: 2.10.1(@babel/core@7.26.10)(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 2.10.1(@babel/core@7.27.1)(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@testing-library/preact': specifier: 3.2.4 version: 3.2.4(preact@10.26.6) @@ -789,13 +784,13 @@ importers: version: 5.39.1 vite: specifier: 6.3.5 - version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.15.18)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 4.5.3(@types/node@22.15.18)(rollup@4.40.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) packages/types: dependencies: @@ -823,7 +818,7 @@ importers: version: link:../config-eslint vite: specifier: 6.3.5 - version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + version: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) packages: @@ -844,8 +839,8 @@ packages: '@ark/util@0.46.0': resolution: {integrity: sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg==} - '@asamuzakjp/css-color@3.1.3': - resolution: {integrity: sha512-u25AyjuNrRFGb1O7KmWEu0ExN6iJMlUmDSlOPW/11JF8khOrIGG6oCoYpC+4mZlthNVhFUahk68lNrNI91f6Yg==} + '@asamuzakjp/css-color@3.1.7': + resolution: {integrity: sha512-Ok5fYhtwdyJQmU1PpEv6Si7Y+A4cYb8yNM9oiIJC9TzXPMuN9fvdonKJqcnz9TbFqV6bQ8z0giRq0iaOpGZV2g==} '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} @@ -1092,8 +1087,8 @@ packages: resolution: {integrity: sha512-1nOwSg7B0bj5LFGor0udF/HSdvDuSCxP+NC0IuSOJ5RgJ2AphFo03pLtK2UwArHY5WWZaejAEz5VBND6xxOEhA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-locate-window@3.723.0': - resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} + '@aws-sdk/util-locate-window@3.804.0': + resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} engines: {node: '>=18.0.0'} '@aws-sdk/util-user-agent-browser@3.775.0': @@ -1120,9 +1115,6 @@ packages: aws-crt: optional: true - '@aws-sdk/util-utf8-browser@3.259.0': - resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.804.0': resolution: {integrity: sha512-JbGWp36IG9dgxtvC6+YXwt5WDZYfuamWFtVfK6fQpnmL96dx+GUPOXPKRWdw67WLKf2comHY28iX2d3z35I53Q==} engines: {node: '>=18.0.0'} @@ -1135,12 +1127,12 @@ packages: resolution: {integrity: sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==} engines: {node: '>=18.0.0'} - '@azure/core-client@1.9.3': - resolution: {integrity: sha512-/wGw8fJ4mdpJ1Cum7s1S+VQyXt1ihwKLzfabS1O/RDADnmzVc01dHn44qD0BvGH6KlZNzOMW95tEpKqhkCChPA==} + '@azure/core-client@1.9.4': + resolution: {integrity: sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw==} engines: {node: '>=18.0.0'} - '@azure/core-http-compat@2.2.0': - resolution: {integrity: sha512-1kW8ZhN0CfbNOG6C688z5uh2yrzALE7dDXHiR9dY4vt+EbhGZQSbjDa5bQd2rf3X2pdWMsXbqbArxUyeNdvtmg==} + '@azure/core-http-compat@2.3.0': + resolution: {integrity: sha512-qLQujmUypBBG0gxHd0j6/Jdmul6ttl24c8WGiLXIk7IHXdBlfoBqW27hyz3Xn6xbfdyVSarl1Ttbk0AwnZBYCw==} engines: {node: '>=18.0.0'} '@azure/core-lro@2.7.2': @@ -1151,24 +1143,24 @@ packages: resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} engines: {node: '>=18.0.0'} - '@azure/core-rest-pipeline@1.19.1': - resolution: {integrity: sha512-zHeoI3NCs53lLBbWNzQycjnYKsA1CVKlnzSNuSFcUDwBp8HHVObePxrM7HaX+Ha5Ks639H7chNC9HOaIhNS03w==} + '@azure/core-rest-pipeline@1.20.0': + resolution: {integrity: sha512-ASoP8uqZBS3H/8N8at/XwFr6vYrRP3syTK0EUjDXQy0Y1/AUS+QeIRThKmTNJO2RggvBBxaXDPM7YoIwDGeA0g==} engines: {node: '>=18.0.0'} '@azure/core-tracing@1.2.0': resolution: {integrity: sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==} engines: {node: '>=18.0.0'} - '@azure/core-util@1.11.0': - resolution: {integrity: sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==} + '@azure/core-util@1.12.0': + resolution: {integrity: sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==} engines: {node: '>=18.0.0'} '@azure/core-xml@1.4.5': resolution: {integrity: sha512-gT4H8mTaSXRz7eGTuQyq1aIJnJqeXzpOe9Ay7Z3FrCouer14CbV3VzjnJrNrQfbBpGBLO9oy8BmrY75A0p53cA==} engines: {node: '>=18.0.0'} - '@azure/identity@4.9.0': - resolution: {integrity: sha512-dz2ZvKxDFoTUmJgmkCBVcyuKckgqE1qVxrRPzUhyKN7FyvUbtNPUrGzqSllOAf1OL9TMGgYqZWbIyD0b/AE15g==} + '@azure/identity@4.10.0': + resolution: {integrity: sha512-iT53Sre2NJK6wzMWnvpjNiR3md597LZ3uK/5kQD2TkrY9vqhrY5bt2KwELNjkOWQ9n8S/92knj/QEykTtjMNqQ==} engines: {node: '>=18.0.0'} '@azure/keyvault-common@2.0.0': @@ -1179,8 +1171,8 @@ packages: resolution: {integrity: sha512-ZBP07+K4Pj3kS4TF4XdkqFcspWwBHry3vJSOFM5k5ZABvf7JfiMonvaFk2nBF6xjlEbMpz5PE1g45iTMme0raQ==} engines: {node: '>=18.0.0'} - '@azure/logger@1.1.4': - resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} + '@azure/logger@1.2.0': + resolution: {integrity: sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==} engines: {node: '>=18.0.0'} '@azure/microsoft-playwright-testing@1.0.0-beta.7': @@ -1189,136 +1181,132 @@ packages: peerDependencies: '@playwright/test': ^1.43.1 - '@azure/msal-browser@4.11.0': - resolution: {integrity: sha512-0p5Ut3wORMP+975AKvaSPIO4UytgsfAvJ7RxaTx+nkP+Hpkmm93AuiMkBWKI2x9tApU/SLgIyPz/ZwLYUIWb5Q==} + '@azure/msal-browser@4.12.0': + resolution: {integrity: sha512-WD1lmVWchg7wn1mI7Tr4v7QPyTwK+8Nuyje3jRpOFENLRLEBsdK8VVdTw3C+TypZmYn4cOAdj3zREnuFXgvfIA==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.5.1': - resolution: {integrity: sha512-oxK0khbc4Bg1bKQnqDr7ikULhVL2OHgSrIq0Vlh4b6+hm4r0lr6zPMQE8ZvmacJuh+ZZGKBM5iIObhF1q1QimQ==} + '@azure/msal-common@15.6.0': + resolution: {integrity: sha512-EotmBz42apYGjqiIV9rDUdptaMptpTn4TdGf3JfjLvFvinSe9BJ6ywU92K9ky+t/b0ghbeTSe9RfqlgLh8f2jA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.5.1': - resolution: {integrity: sha512-dkgMYM5B6tI88r/oqf5bYd93WkenQpaWwiszJDk7avVjso8cmuKRTW97dA1RMi6RhihZFLtY1VtWxU9+sW2T5g==} + '@azure/msal-node@3.5.3': + resolution: {integrity: sha512-c5mifzHX5mwm5JqMIlURUyp6LEEdKF1a8lmcNRLBo0lD7zpSYPHupa4jHyhJyg9ccLwszLguZJdk2h3ngnXwNw==} engines: {node: '>=16'} '@azure/storage-blob@12.27.0': resolution: {integrity: sha512-IQjj9RIzAKatmNca3D6bT0qJ+Pkox1WZGOg2esJF2YLHb45pQKOwGPIAV+w3rfgkj7zV3RMxpn/c6iftzSOZJQ==} engines: {node: '>=18.0.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.27.2': + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} - engines: {node: '>=6.9.0'} - - '@babel/eslint-parser@7.27.0': - resolution: {integrity: sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==} + '@babel/eslint-parser@7.27.1': + resolution: {integrity: sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.1': + resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -1572,12 +1560,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1596,11 +1578,11 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@floating-ui/core@1.7.0': + resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==} - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@floating-ui/dom@1.7.0': + resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==} '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} @@ -1656,9 +1638,6 @@ packages: peerDependencies: react-hook-form: ^7.55.0 - '@httptoolkit/websocket-stream@6.0.1': - resolution: {integrity: sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==} - '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -1939,11 +1918,11 @@ packages: '@types/react': '>=16' react: '>=16' - '@microsoft/api-extractor-model@7.30.5': - resolution: {integrity: sha512-0ic4rcbcDZHz833RaTZWTGu+NpNgrxVNjVaor0ZDUymfDFzjA/Uuk8hYziIUIOEOSTfmIQqyzVwlzxZxPe7tOA==} + '@microsoft/api-extractor-model@7.30.6': + resolution: {integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==} - '@microsoft/api-extractor@7.52.4': - resolution: {integrity: sha512-mIEcqgx877CFwNrTuCdPnlIGak8FjlayZb8sSBwWXX+i4gxkZRpMsb5BQcFW3v1puuJB3jYMqQ08kyAc4Vldhw==} + '@microsoft/api-extractor@7.52.8': + resolution: {integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==} hasBin: true '@microsoft/tsdoc-config@0.16.2': @@ -2027,8 +2006,8 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@noble/hashes@1.7.2': - resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': @@ -2347,8 +2326,8 @@ packages: resolution: {integrity: sha512-KZ1JsXcP2pqunfsJBNk+py6AJ5R6ZJ3yvM5Lhhf93rHPHvdDzgfMYPS4F7GNO3j/MVDCtfbttrkcpu7sl0Wu/Q==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.32.0': - resolution: {integrity: sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==} + '@opentelemetry/semantic-conventions@1.33.0': + resolution: {integrity: sha512-TIpZvE8fiEILFfTlfPnltpBaD3d9/+uQHVCyC3vfdh6WfCXKhNFzoP5RyDDIndfvZC5GrA4pyEDNyjPloJud+w==} engines: {node: '>=14'} '@opentelemetry/sql-common@0.40.1': @@ -2382,8 +2361,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.2': - resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==} + '@pkgr/core@0.2.4': + resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@playwright/test@1.52.0': @@ -2432,8 +2411,11 @@ packages: '@prisma/debug@6.7.0': resolution: {integrity: sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==} - '@prisma/dmmf@6.7.0': - resolution: {integrity: sha512-Nabzf5H7KUwYV/1u8R5gTQ7x3ffdPIhtxVJsjhnLOjeuem8YzVu39jOgQbiOlfOvjU4sPYkV9wEXc5tIHumdUw==} + '@prisma/debug@6.8.0': + resolution: {integrity: sha512-QgI80ZgD5xWI+DzNOw2LkZQpE2ZBV9NiTkPqcOTAWe3+sLagGGau4Sp18lrYsemEqzfYD6Zl1YJkCO4JFmywLg==} + + '@prisma/dmmf@6.8.0': + resolution: {integrity: sha512-Xc8mRtxzfh43CmH9sH1bl6D9Iyb5XfRkkjvERG5owF5qHY90zZpll857SEdbLhwWTS4/nHMbYGIUdaPLAMY3OA==} '@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed': resolution: {integrity: sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==} @@ -2444,11 +2426,11 @@ packages: '@prisma/fetch-engine@6.7.0': resolution: {integrity: sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==} - '@prisma/generator-helper@6.7.0': - resolution: {integrity: sha512-z4ey7n8eUFx7Ol7RJCoEo9SVK2roy80qLXdrUFlmswcs0e/z03wDl4tpaA02BE2Yi9KCZl2Tkd6oMes81vUefA==} + '@prisma/generator-helper@6.8.0': + resolution: {integrity: sha512-ZBoopCV786UAEE0MmWEv5VEmZBR6eT+wlPRuiIzi4xx0wC6k4rsE96b4NtUdK/EPVG3TjQHub1fA//oBoEBb1Q==} - '@prisma/generator@6.7.0': - resolution: {integrity: sha512-wCsD7QJn1JBKJfv5uOMhwBCvZPGerPJ3EC2HocFPFaHSzVIXLi/zNb/8gpBxervOXTbQRJ2dpqvMsJnwAnPi8A==} + '@prisma/generator@6.8.0': + resolution: {integrity: sha512-Fg/SgaLAbHqBXKGfiREfn2n2B7aHSRI+KPRwa3xem6BWsbIFBM7VN+Qh1yH0HcI/oVSzWrmKAGtN/gIEh/zrIw==} '@prisma/get-platform@6.7.0': resolution: {integrity: sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==} @@ -2734,19 +2716,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.0': - resolution: {integrity: sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-primitive@2.1.2': resolution: {integrity: sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==} peerDependencies: @@ -2825,15 +2794,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.2.0': - resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-slot@1.2.2': resolution: {integrity: sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==} peerDependencies: @@ -3130,6 +3090,10 @@ packages: resolution: {integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==} engines: {node: '>=14'} + '@redis/client@1.6.1': + resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} + engines: {node: '>=14'} + '@redis/graph@1.1.1': resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} peerDependencies: @@ -3181,8 +3145,8 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + '@rollup/rollup-android-arm-eabi@4.40.2': + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} cpu: [arm] os: [android] @@ -3191,8 +3155,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + '@rollup/rollup-android-arm64@4.40.2': + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} cpu: [arm64] os: [android] @@ -3201,8 +3165,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + '@rollup/rollup-darwin-arm64@4.40.2': + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} cpu: [arm64] os: [darwin] @@ -3211,8 +3175,8 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + '@rollup/rollup-darwin-x64@4.40.2': + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} cpu: [x64] os: [darwin] @@ -3221,8 +3185,8 @@ packages: cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + '@rollup/rollup-freebsd-arm64@4.40.2': + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} cpu: [arm64] os: [freebsd] @@ -3231,8 +3195,8 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + '@rollup/rollup-freebsd-x64@4.40.2': + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} cpu: [x64] os: [freebsd] @@ -3241,8 +3205,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} cpu: [arm] os: [linux] @@ -3251,8 +3215,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} cpu: [arm] os: [linux] @@ -3261,8 +3225,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + '@rollup/rollup-linux-arm64-gnu@4.40.2': + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} cpu: [arm64] os: [linux] @@ -3271,8 +3235,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + '@rollup/rollup-linux-arm64-musl@4.40.2': + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} cpu: [arm64] os: [linux] @@ -3281,8 +3245,8 @@ packages: cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} cpu: [loong64] os: [linux] @@ -3291,8 +3255,8 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} cpu: [ppc64] os: [linux] @@ -3301,13 +3265,13 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + '@rollup/rollup-linux-riscv64-musl@4.40.2': + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} cpu: [riscv64] os: [linux] @@ -3316,8 +3280,8 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + '@rollup/rollup-linux-s390x-gnu@4.40.2': + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} cpu: [s390x] os: [linux] @@ -3326,8 +3290,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + '@rollup/rollup-linux-x64-gnu@4.40.2': + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} cpu: [x64] os: [linux] @@ -3336,8 +3300,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + '@rollup/rollup-linux-x64-musl@4.40.2': + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} cpu: [x64] os: [linux] @@ -3346,8 +3310,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + '@rollup/rollup-win32-arm64-msvc@4.40.2': + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} cpu: [arm64] os: [win32] @@ -3356,8 +3320,8 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + '@rollup/rollup-win32-ia32-msvc@4.40.2': + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} cpu: [ia32] os: [win32] @@ -3366,8 +3330,8 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + '@rollup/rollup-win32-x64-msvc@4.40.2': + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} cpu: [x64] os: [win32] @@ -3377,8 +3341,8 @@ packages: '@rushstack/eslint-patch@1.11.0': resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} - '@rushstack/node-core-library@5.13.0': - resolution: {integrity: sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==} + '@rushstack/node-core-library@5.13.1': + resolution: {integrity: sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -3388,16 +3352,16 @@ packages: '@rushstack/rig-package@0.5.3': resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.15.2': - resolution: {integrity: sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==} + '@rushstack/terminal@0.15.3': + resolution: {integrity: sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.23.7': - resolution: {integrity: sha512-Gr9cB7DGe6uz5vq2wdr89WbVDKz0UeuFEn5H2CfWDe7JvjFFaiV15gi6mqDBTbHhHCWS7w8mF1h3BnIfUndqdA==} + '@rushstack/ts-command-line@5.0.1': + resolution: {integrity: sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q==} '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} @@ -3534,16 +3498,16 @@ packages: resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.0': - resolution: {integrity: sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A==} + '@smithy/config-resolver@4.1.2': + resolution: {integrity: sha512-7r6mZGwb5LmLJ+zPtkLoznf2EtwEuSWdtid10pjGl/7HefCE4mueOkrfki8JCUm99W6UfP47/r3tbxx9CfBN5A==} engines: {node: '>=18.0.0'} - '@smithy/core@3.3.1': - resolution: {integrity: sha512-W7AppgQD3fP1aBmo8wWo0id5zeR2/aYRy067vZsDVaa6v/mdhkg6DxXwEVuSPjZl+ZnvWAQbUMCd5ckw38+tHQ==} + '@smithy/core@3.3.3': + resolution: {integrity: sha512-CiJNc0b/WdnttAfQ6uMkxPQ3Z8hG/ba8wF89x9KtBBLDdZk6CX52K4F8hbe94uNbc8LDUuZFtbqfdhM3T21naw==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.2': - resolution: {integrity: sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w==} + '@smithy/credential-provider-imds@4.0.4': + resolution: {integrity: sha512-jN6M6zaGVyB8FmNGG+xOPQB4N89M1x97MMdMnm1ESjljLS3Qju/IegQizKujaNcy2vXAvrz0en8bobe6E55FEA==} engines: {node: '>=18.0.0'} '@smithy/eventstream-codec@4.0.2': @@ -3602,24 +3566,24 @@ packages: resolution: {integrity: sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.2': - resolution: {integrity: sha512-EqOy3xaEGQpsKxLlzYstDRJ8eY90CbyBP4cl+w7r45mE60S8YliyL9AgWsdWcyNiB95E2PMqHBEv67nNl1zLfg==} + '@smithy/middleware-endpoint@4.1.6': + resolution: {integrity: sha512-Zdieg07c3ua3ap5ungdcyNnY1OsxmsXXtKDTk28+/YbwIPju0Z1ZX9X5AnkjmDE3+AbqgvhtC/ZuCMSr6VSfPw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.3': - resolution: {integrity: sha512-AsJtI9KiFoEGAhcEKZyzzPfrszAQGcf4HSYKmenz0WGx/6YNvoPPv4OSGfZTCsDmgPHv4pXzxE+7QV7jcGWNKw==} + '@smithy/middleware-retry@4.1.7': + resolution: {integrity: sha512-lFIFUJ0E/4I0UaIDY5usNUzNKAghhxO0lDH4TZktXMmE+e4ActD9F154Si0Unc01aCPzcwd+NcOwQw6AfXXRRQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.3': - resolution: {integrity: sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==} + '@smithy/middleware-serde@4.0.5': + resolution: {integrity: sha512-yREC3q/HXqQigq29xX3hiy6tFi+kjPKXoYUQmwQdgPORLbQ0n6V2Z/Iw9Nnlu66da9fM/WhDtGvYvqwecrCljQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-stack@4.0.2': resolution: {integrity: sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.0.2': - resolution: {integrity: sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw==} + '@smithy/node-config-provider@4.1.1': + resolution: {integrity: sha512-1slS5jf5icHETwl5hxEVBj+mh6B+LbVW4yRINsGtUKH+nxM5Pw2H59+qf+JqYFCHp9jssG4vX81f5WKnjMN3Vw==} engines: {node: '>=18.0.0'} '@smithy/node-http-handler@4.0.4': @@ -3654,8 +3618,8 @@ packages: resolution: {integrity: sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.2.2': - resolution: {integrity: sha512-3AnHfsMdq9Wg7+3BeR1HuLWI9+DMA/SoHVpCWq6xSsa52ikNd6nlF/wFzdpHyGtVa+Aji6lMgvwOF4sGcVA7SA==} + '@smithy/smithy-client@4.2.6': + resolution: {integrity: sha512-WEqP0wQ1N/lVS4pwNK1Vk+0i6QIr66cq/xbu1dVy1tM0A0qYwAYyz0JhbquzM5pMa8s89lyDBtoGKxo7iG74GA==} engines: {node: '>=18.0.0'} '@smithy/types@4.2.0': @@ -3690,16 +3654,16 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.10': - resolution: {integrity: sha512-2k6fgUNOZ1Rn0gEjvGPGrDEINLG8qSBHsN7xlkkbO+fnHJ36BQPDzhFfMmYSDS8AgzoygqQiDOQ+6Hp2vBTUdA==} + '@smithy/util-defaults-mode-browser@4.0.14': + resolution: {integrity: sha512-l7QnMX8VcDOH6n/fBRu4zqguSlOBZxFzWqp58dXFSARFBjNlmEDk5G/z4T7BMGr+rI0Pg8MkhmMUfEtHFgpy2g==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.10': - resolution: {integrity: sha512-2XR1WRglLVmoIFts7bODUTgBdVyvkfKNkydHrlsI5VxW9q3s1hnJCuY+f1OHzvj5ue23q4vydM2fjrMjf2HSdQ==} + '@smithy/util-defaults-mode-node@4.0.14': + resolution: {integrity: sha512-Ujs1gsWDo3m/T63VWBTBmHLTD2UlU6J6FEokLCEp7OZQv45jcjLHoxTwgWsi8ULpsYozvH4MTWkRP+bhwr0vDg==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.2': - resolution: {integrity: sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ==} + '@smithy/util-endpoints@3.0.4': + resolution: {integrity: sha512-VfFATC1bmZLV2858B/O1NpMcL32wYo8DPPhHxYxDCodDl3f3mSZ5oJheW1IF91A0EeAADz2WsakM/hGGPGNKLg==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.0.0': @@ -4111,9 +4075,6 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} @@ -4171,12 +4132,6 @@ packages: '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - '@types/node@22.14.0': - resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} - - '@types/node@22.15.14': - resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} - '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -4302,10 +4257,6 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.30.1': - resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.32.0': resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4346,10 +4297,6 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.30.1': - resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.32.0': resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4376,12 +4323,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.30.1': - resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.32.0': resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4406,13 +4347,6 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.30.1': - resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.0': resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4435,10 +4369,6 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.30.1': - resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.32.0': resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4447,6 +4377,10 @@ packages: resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typespec/ts-http-runtime@0.2.2': + resolution: {integrity: sha512-Gz/Sm64+Sq/vklJu1tt9t+4R2lvnud8NbTD/ZfpZtMiUX7YeVpCA8j6NSW8ptwcoLL+NmYANwqP8DV0q/bwl2w==} + engines: {node: '>=18.0.0'} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -4462,83 +4396,88 @@ packages: '@unkey/rbac@0.3.1': resolution: {integrity: sha512-Hj+52XRIlBBl3/qOUq9K71Fwy3PWExBQOpOClVYHdrcmbgqNL6L4EdW/BzliLhqPCdwZTPVSJTnZ3Hw4ZYixsQ==} - '@unrs/resolver-binding-darwin-arm64@1.6.2': - resolution: {integrity: sha512-JKLm8qMQ2siaYy0YWnLIux5cHYng1Bg0BwUmcAhGXrfq/SEc2f5H4O0Bi2BlOnzVPn8vhkFE3sQ81UoRXN+FqA==} + '@unrs/resolver-binding-darwin-arm64@1.7.2': + resolution: {integrity: sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.6.2': - resolution: {integrity: sha512-STOpMizROD+1D8QHhNYilmAhfl7kDJhpeeUhHoQ6LfOk8Yhpy2AWmqqwpRu027oIA3+qnSLqFJN41QmoeD1d0A==} + '@unrs/resolver-binding-darwin-x64@1.7.2': + resolution: {integrity: sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.6.2': - resolution: {integrity: sha512-OS9d27YFEOq7pqZQWNKLy7YGhK0V088q8EuRzBwZUL1aQQ8uuTLnrYkUAWsKZCxagbBODjMvv4qoUg9sh0g6Mw==} + '@unrs/resolver-binding-freebsd-x64@1.7.2': + resolution: {integrity: sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.6.2': - resolution: {integrity: sha512-rb49fdMmHNK900U9grVoy+nwueHKVpKSeOxY0PPOqDXnagW1azASeW+K0BU+fajaMxCrRSPGmHBPew8aoIgvAA==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': + resolution: {integrity: sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.6.2': - resolution: {integrity: sha512-yybyErjHmG3EFqqrIqj64dauxhGJ/BaShuD96dkprpP/MhPSPLJ4xqR3C5NA0jARSJbEwbrPN5bWwfK7kHAs6A==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': + resolution: {integrity: sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.6.2': - resolution: {integrity: sha512-cXiUMXZEgr0ZAa9af874VPME1q1Zalk9o5bsjMTZBfiV7Q/oQT7dX4VKCclEc95ympx8H3R8cYkbeySAIxvadQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': + resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.6.2': - resolution: {integrity: sha512-9iwEHcepURA3c2GP74rEl7IdciGqzWzV5jSfjXtKyYfz7aAhTVZON3qdAt2r00uQYgLMf5ZDVsG/RvQbBOygbw==} + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': + resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.6.2': - resolution: {integrity: sha512-/LptGF05l0Ihpc1Fx7kbs0d9NAWp05cKLqYefi8xYnxuaoO7lTbxWJ2B60HGiU7oqn0rLmJG0ZgbwyZlVsVuGw==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': + resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.6.2': - resolution: {integrity: sha512-9og1+kOtdDGTWFAiqXSGyRTjYlGnM2BhNuRXKLFnbDvWe57LzokI3USbX4c3condKaoag2m74DbJHtPg5ZBTYA==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': + resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.6.2': - resolution: {integrity: sha512-AZVlbIEg0+iNZ6ZJ0/OQtfCxZJZ3XUHdmOW5kWqTXeyONkO5Q9dYui37ui6a6cs/bsPsFDPiEkvmrVqNYhDX1w==} + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': + resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': + resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.6.2': - resolution: {integrity: sha512-kaFVj+mt3t7Y1W1SUFq1A30UCPg24w5pbnPKQ6rvNCyiBB91SzC1jrC64zldagBHlIP+suURfEvNNpMDo2IaBg==} + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': + resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.6.2': - resolution: {integrity: sha512-3rWsCizepV9mawiq5tjkA/5Z55m83L7KAK0QNIyiKd7hq71F7woCRkfr/LLsoRcM8E3ay1mWPYRCfFgMvC1i2A==} + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.6.2': - resolution: {integrity: sha512-/KeqvjCDPqhgSovlrAvuiSiExUj93w1QwSCU3aKlJ+cl03lLa4Pn/HgiGlsx+2BwT2JXIDBY0gbKW2jIDdpczg==} + '@unrs/resolver-binding-wasm32-wasi@1.7.2': + resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.6.2': - resolution: {integrity: sha512-7G9hefbyv7WVA+3l6ID4nIxfYf9cj5dYmlgcssbU0U36vEUoSdERm/mpYb2dohTHfsu6EWN4TfNh18uHS/rC9g==} + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': + resolution: {integrity: sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.6.2': - resolution: {integrity: sha512-LYSdnID9kXk7eBs07f6Ac3NnnPgL2fXXs1Vjt0WyAE8GPMvzRO+I6r7e+Q3SOUtQ1qocCuHX5pnVIwsOYvlIRQ==} + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': + resolution: {integrity: sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.6.2': - resolution: {integrity: sha512-B63x8ncJIDtT28D9rDsZ8Y54+7Go3jE/4uvTmB5paP9Vc1LlgTwV/Arfdg5+YB91UJTJ59hfpzTkJWnwbgWvAw==} + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': + resolution: {integrity: sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==} cpu: [x64] os: [win32] @@ -4648,20 +4587,20 @@ packages: '@vitest/utils@3.1.3': resolution: {integrity: sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==} - '@volar/language-core@2.4.12': - resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} + '@volar/language-core@2.4.13': + resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} - '@volar/source-map@2.4.12': - resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} + '@volar/source-map@2.4.13': + resolution: {integrity: sha512-l/EBcc2FkvHgz2ZxV+OZK3kMSroMr7nN3sZLF2/f6kWW66q8+tEL4giiYyFjt0BcubqJhBt6soYIrAPhg/Yr+Q==} - '@volar/typescript@2.4.12': - resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} + '@volar/typescript@2.4.13': + resolution: {integrity: sha512-Ukz4xv84swJPupZeoFsQoeJEOm7U9pqsEnaGGgt5ni3SCTa22m8oJP5Nng3Wed7Uw5RBELdLxxORX8YhJPyOgQ==} - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.14': + resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.14': + resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -4674,8 +4613,8 @@ packages: typescript: optional: true - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.14': + resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -5011,9 +4950,6 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - aws-crt@1.26.2: - resolution: {integrity: sha512-XyzCoWMQ693g6iLFqgeVl6DTMKZIIc0zlzwLvP47az7nRgob8JLiqJDbx1ljKqBxKesRqq9igjTMzOKh3JkvUA==} - aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} @@ -5100,8 +5036,8 @@ packages: browser-assert@1.2.1: resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5182,8 +5118,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001715: - resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} cfb@1.2.2: resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==} @@ -5360,9 +5296,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commist@1.1.0: - resolution: {integrity: sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -5380,10 +5313,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - concurrently@9.1.2: resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} engines: {node: '>=18'} @@ -5416,14 +5345,11 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + core-js-compat@3.42.0: + resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} - core-js@3.41.0: - resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-js@3.42.0: + resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==} cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} @@ -5446,9 +5372,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - css-background-parser@0.1.0: resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} @@ -5552,8 +5475,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -5640,8 +5563,8 @@ packages: resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} engines: {node: '>=12.20'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} detect-newline@4.0.1: @@ -5722,20 +5645,14 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - electron-to-chromium@1.5.139: - resolution: {integrity: sha512-GGnRYOTdN5LYpwbIr0rwP/ZHOQSvAF6TG0LSzp28uCBb9JiXHJGmaaKw29qjNJc5bGnnp6kXJqRnGMQoELwi5w==} + electron-to-chromium@1.5.154: + resolution: {integrity: sha512-G4VCFAyKbp1QJ+sWdXYIRYsPGvlV5sDACfCmoMFog3rjm1syLhI41WXm/swZypwCIWIm4IFLWzHY14joWMQ5Fw==} emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -5764,6 +5681,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -6158,8 +6079,8 @@ packages: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fast-xml-parser@5.2.0: - resolution: {integrity: sha512-Uw9+Mjt4SBRud1IcaYuW/O0lW8SKKdMl5g7g24HiIuyH5fQSD+AVLybSlJtqLYEbytVFjWQa5DMGcNgeksdRBg==} + fast-xml-parser@5.2.3: + resolution: {integrity: sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==} hasBin: true fastest-stable-stringify@2.0.2: @@ -6349,10 +6270,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -6367,8 +6284,8 @@ packages: get-user-locale@2.3.2: resolution: {integrity: sha512-O2GWvQkhnbDoWFUJfaBlDIKUEdND8ATpBXD6KXcbhxlfktyD/d8w6mkzM/IlQEqGZAMz/PW6j6Hv53BiigKLUQ==} - git-hooks-list@3.2.0: - resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + git-hooks-list@4.1.1: + resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -6388,8 +6305,8 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.1: - resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + glob@11.0.2: + resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} engines: {node: 20 || >=22} hasBin: true @@ -6505,9 +6422,6 @@ packages: resolution: {integrity: sha512-NU+zsiDvdL+EebyTjrEqjkO2XYI7FgLhQzsbmO8dnnYce3S0PBSDm/ZyI4KpcGPXYEdb5W72vp/AQFuc4F8ASg==} engines: {node: '>=8.0.0'} - help-me@3.0.0: - resolution: {integrity: sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==} - help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} @@ -6535,8 +6449,8 @@ 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-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} @@ -6592,8 +6506,8 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.13.1: - resolution: {integrity: sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==} + import-in-the-middle@1.13.2: + resolution: {integrity: sha512-Yjp9X7s2eHSXvZYQ0aye6UvwYPrVB5C2k47fuXjFKnYinAByaDZjh4t9MT2wEga9775n6WaIqyHnQhBxYtX2mg==} import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} @@ -6830,9 +6744,6 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -6843,11 +6754,6 @@ packages: resolution: {integrity: sha512-SgKoDBCQveodymGMBPpzs9MOTCk4Luq0bTfwoPrUKa7q0FnCLZMtqR25Rnq228zJfMTsX1ZItiJbDtjb2lyv4A==} engines: {node: '>=18'} - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} @@ -6924,9 +6830,6 @@ packages: 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==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7000,11 +6903,11 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - jwa@2.0.0: - resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} @@ -7031,10 +6934,6 @@ packages: leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} - leven@2.1.0: - resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} - engines: {node: '>=0.10.0'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -7042,8 +6941,8 @@ packages: lexical@0.31.0: resolution: {integrity: sha512-g53KxlntpwBLYWE94pn66YmYq2VLsgs/nYfbtsnbEAur0CA8XXsipIM+yrSKN9YnUp43EiYe2Z12OennaMQ0Yg==} - lib0@0.2.104: - resolution: {integrity: sha512-1tqKRANSPTcjs/yjPoKh52oRM2u5AYdd8jie8sDiN8/5kpWWiQSHUGgtB4VEXLw1chVL3QPSPp8q9RWqzSn2FA==} + lib0@0.2.108: + resolution: {integrity: sha512-+3eK/B0SqYoZiQu9fNk4VEc6EX8cb0Li96tPGKgugzoGj/OdRdREtuTLvUW+mtinoB2mFiJjSqOJBIaMkAGhxQ==} engines: {node: '>=16'} hasBin: true @@ -7051,70 +6950,6 @@ packages: resolution: {integrity: sha512-4Nk0dKhhRfVS4mECcX2jSDpNU6gcHQLneJjkGQq61N8COGtjSpSA3CI+1Q3kUYv5Vf+SwIqUtaDSdU6JO37c6w==} engines: {node: '>=8.0.0'} - lightningcss-darwin-arm64@1.29.2: - resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.29.2: - resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.29.2: - resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.29.2: - resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.29.2: - resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.29.2: - resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.29.2: - resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.29.2: - resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.29.2: - resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.29.2: - resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.29.2: - resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} - engines: {node: '>= 12.0.0'} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -7446,8 +7281,8 @@ packages: 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==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} mongodb-connection-string-url@3.0.2: resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} @@ -7479,20 +7314,12 @@ packages: socks: optional: true - motion-dom@12.10.0: - resolution: {integrity: sha512-TbRFEjQmRIDEFXJFIHfvM3VW8PuQ8bSWwwYxWA5Elq+GCghzqYUQ1FDQK/K6PmtmOoLiQY3ttJE6CrOedRrGgw==} + motion-dom@12.11.2: + resolution: {integrity: sha512-wZ396XNNTI9GOkyrr80wFSbZc1JbIHSHTbLdririSbkEgahWWKmsHzsxyxqBBvuBU/iaQWVu1YCjdpXYNfo2yQ==} motion-utils@12.9.4: resolution: {integrity: sha512-BW3I65zeM76CMsfh3kHid9ansEJk9Qvl+K5cu4DVHKGsI52n76OJ4z2CUJUV+Mn3uEP9k1JJA3tClG0ggSrRcg==} - mqtt-packet@6.10.0: - resolution: {integrity: sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==} - - mqtt@4.3.8: - resolution: {integrity: sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==} - engines: {node: '>=10.0.0'} - hasBin: true - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -7541,8 +7368,8 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - napi-postinstall@0.1.5: - resolution: {integrity: sha512-HI5bHONOUYqV+FJvueOSgjRxHTLB25a3xIv59ugAxFe7xRNbW96hyYbMbsKzl+QvFV9mN/SrtHwiU+vYhMwA7Q==} + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -7619,8 +7446,8 @@ packages: sass: optional: true - node-abi@3.74.0: - resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} engines: {node: '>=10'} node-addon-api@7.1.1: @@ -7691,14 +7518,11 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - number-allocator@1.0.14: - resolution: {integrity: sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==} - nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - oauth4webapi@3.5.0: - resolution: {integrity: sha512-DF3mLWNuxPkxJkHmWxbSFz4aE5CjWOsm465VBfBdWzmzX4Mg3vF8icxK+iKqfdWrIumBJ2TaoNQWx+SQc2bsPQ==} + oauth4webapi@3.5.1: + resolution: {integrity: sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==} oauth@0.9.15: resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} @@ -7773,8 +7597,8 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - open@10.1.1: - resolution: {integrity: sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==} + open@10.1.2: + resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} engines: {node: '>=18'} open@8.4.2: @@ -7852,8 +7676,8 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} @@ -7910,20 +7734,20 @@ packages: pg-cloudflare@1.2.5: resolution: {integrity: sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==} - pg-connection-string@2.8.5: - resolution: {integrity: sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==} + pg-connection-string@2.9.0: + resolution: {integrity: sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.9.6: - resolution: {integrity: sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==} + pg-pool@3.10.0: + resolution: {integrity: sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==} peerDependencies: pg: '>=8.0' - pg-protocol@1.9.5: - resolution: {integrity: sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==} + pg-protocol@1.10.0: + resolution: {integrity: sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -8104,9 +7928,6 @@ packages: peerDependencies: preact: '>=10' - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} - preact@10.26.6: resolution: {integrity: sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==} @@ -8119,8 +7940,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-packagejson@2.5.10: - resolution: {integrity: sha512-LUxATI5YsImIVSaaLJlJ3aE6wTD+nvots18U3GuQMJpUyClChaZlQrqx3dBnbhF20OnKWZyx8EgyZypQtBDtgQ==} + prettier-plugin-packagejson@2.5.13: + resolution: {integrity: sha512-94B/Xy25HwiwSkGUGnwQw3cBw9jg9L5LfKCHpuRMjC8ETPq4oCMa2S4EblV628E0XER9n6v5rH0TQY9cUd10pg==} peerDependencies: prettier: '>= 1.16.0' peerDependenciesMeta: @@ -8225,9 +8046,6 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} @@ -8254,8 +8072,8 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - protobufjs@7.5.0: - resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==} + protobufjs@7.5.2: + resolution: {integrity: sha512-f2ls6rpO6G153Cy+o2XQ+Y0sARLOZ17+OGVLHrc3VUKcLHYKEKWbkSujdBWQXM7gKn5NTfp0XnRPZn1MIu8n9w==} engines: {node: '>=12.0.0'} proxy-from-env@1.1.0: @@ -8468,9 +8286,6 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -8505,9 +8320,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -8527,9 +8339,6 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true - reinterval@1.1.0: - resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -8604,8 +8413,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -8695,8 +8504,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -8827,8 +8636,8 @@ packages: sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-package-json@2.15.1: - resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} + sort-package-json@3.2.1: + resolution: {integrity: sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==} hasBin: true source-map-js@1.2.1: @@ -8865,9 +8674,6 @@ packages: spdx-license-ids@3.0.21: resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -8939,9 +8745,6 @@ packages: prettier: optional: true - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -8991,9 +8794,6 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -9036,8 +8836,8 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strnum@2.0.5: - resolution: {integrity: sha512-YAT3K/sgpCUxhxNMrrdhtod3jckkpYwH6JAuwmUdXZsmzH1wUyzTMrrK2wYCEEqlKwrWDd35NeuUkbBy/1iK+Q==} + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} @@ -9083,8 +8883,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + synckit@0.11.5: + resolution: {integrity: sha512-frqvfWyDA5VPVdrWfH24uM6SI/O8NLpVbIIJxb8t/a3YGsp4AW9CYgSKC0OaSEfexnp7Y1pVh2Y6IHO8ggGDmA==} engines: {node: ^14.18.0 || >=16.0.0} systeminformation@5.23.8: @@ -9389,9 +9189,6 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typeorm@0.3.22: resolution: {integrity: sha512-P/Tsz3UpJ9+K0oryC0twK5PO27zejLYYwMsE8SISfZc1lVHX+ajigiOyWsKbuXpEFMjD9z7UjLzY3+ElVOMMDA==} engines: {node: '>=16.13.0'} @@ -9504,8 +9301,8 @@ packages: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} - unrs-resolver@1.6.2: - resolution: {integrity: sha512-0+lgqiLoMAAXNA1EDjatPWdKrK+cnWgppA3pYJeilbQpourZ/Roc/40c2BMoYQoo/Vocmj0qtTYn6+zFU9Y+Jw==} + unrs-resolver@1.7.2: + resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -9810,20 +9607,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9890,9 +9675,9 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@18.1.3: @@ -9915,8 +9700,8 @@ packages: resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} engines: {node: '>=12'} - yjs@13.6.26: - resolution: {integrity: sha512-wiARO3wixu7mtoRP5f7LqpUtsURP9SmNgXUt3RlnZg4qDuF7dUjthwIvwxIDmK55dPw4Wl4QdW5A3ag0atwu7g==} + yjs@13.6.27: + resolution: {integrity: sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yn@3.1.1: @@ -9956,7 +9741,7 @@ snapshots: '@ark/util@0.46.0': {} - '@asamuzakjp/css-color@3.1.3': + '@asamuzakjp/css-color@3.1.7': dependencies: '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) '@csstools/css-color-parser': 3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) @@ -9981,7 +9766,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-locate-window': 3.723.0 + '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -9991,7 +9776,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-locate-window': 3.723.0 + '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -10011,12 +9796,12 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/client-cognito-identity@3.799.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.799.0 - '@aws-sdk/credential-provider-node': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-node': 3.799.0 '@aws-sdk/middleware-host-header': 3.775.0 '@aws-sdk/middleware-logger': 3.775.0 '@aws-sdk/middleware-recursion-detection': 3.775.0 @@ -10025,29 +9810,29 @@ snapshots: '@aws-sdk/types': 3.775.0 '@aws-sdk/util-endpoints': 3.787.0 '@aws-sdk/util-user-agent-browser': 3.775.0 - '@aws-sdk/util-user-agent-node': 3.799.0(aws-crt@1.26.2) - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 + '@aws-sdk/util-user-agent-node': 3.799.0 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 '@smithy/invalid-dependency': 4.0.2 '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.2 - '@smithy/middleware-retry': 4.1.3 - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-endpoint': 4.1.6 + '@smithy/middleware-retry': 4.1.7 + '@smithy/middleware-serde': 4.0.5 '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/node-http-handler': 4.0.4 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@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.10 - '@smithy/util-defaults-mode-node': 4.0.10 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-defaults-mode-browser': 4.0.14 + '@smithy/util-defaults-mode-node': 4.0.14 + '@smithy/util-endpoints': 3.0.4 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 '@smithy/util-utf8': 4.0.0 @@ -10055,12 +9840,12 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-dynamodb@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/client-dynamodb@3.799.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.799.0 - '@aws-sdk/credential-provider-node': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-node': 3.799.0 '@aws-sdk/middleware-endpoint-discovery': 3.775.0 '@aws-sdk/middleware-host-header': 3.775.0 '@aws-sdk/middleware-logger': 3.775.0 @@ -10070,29 +9855,29 @@ snapshots: '@aws-sdk/types': 3.775.0 '@aws-sdk/util-endpoints': 3.787.0 '@aws-sdk/util-user-agent-browser': 3.775.0 - '@aws-sdk/util-user-agent-node': 3.799.0(aws-crt@1.26.2) - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 + '@aws-sdk/util-user-agent-node': 3.799.0 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 '@smithy/invalid-dependency': 4.0.2 '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.2 - '@smithy/middleware-retry': 4.1.3 - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-endpoint': 4.1.6 + '@smithy/middleware-retry': 4.1.7 + '@smithy/middleware-serde': 4.0.5 '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/node-http-handler': 4.0.4 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@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.10 - '@smithy/util-defaults-mode-node': 4.0.10 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-defaults-mode-browser': 4.0.14 + '@smithy/util-defaults-mode-node': 4.0.14 + '@smithy/util-endpoints': 3.0.4 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 '@smithy/util-utf8': 4.0.0 @@ -10103,13 +9888,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/client-s3@3.804.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.804.0 - '@aws-sdk/credential-provider-node': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-node': 3.804.0 '@aws-sdk/middleware-bucket-endpoint': 3.804.0 '@aws-sdk/middleware-expect-continue': 3.804.0 '@aws-sdk/middleware-flexible-checksums': 3.804.0 @@ -10125,10 +9910,10 @@ snapshots: '@aws-sdk/types': 3.804.0 '@aws-sdk/util-endpoints': 3.804.0 '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/util-user-agent-node': 3.804.0 '@aws-sdk/xml-builder': 3.804.0 - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 '@smithy/eventstream-serde-browser': 4.0.2 '@smithy/eventstream-serde-config-resolver': 4.1.0 '@smithy/eventstream-serde-node': 4.0.2 @@ -10139,22 +9924,22 @@ snapshots: '@smithy/invalid-dependency': 4.0.2 '@smithy/md5-js': 4.0.2 '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.2 - '@smithy/middleware-retry': 4.1.3 - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-endpoint': 4.1.6 + '@smithy/middleware-retry': 4.1.7 + '@smithy/middleware-serde': 4.0.5 '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/node-http-handler': 4.0.4 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@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.10 - '@smithy/util-defaults-mode-node': 4.0.10 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-defaults-mode-browser': 4.0.14 + '@smithy/util-defaults-mode-node': 4.0.14 + '@smithy/util-endpoints': 3.0.4 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 '@smithy/util-stream': 4.2.0 @@ -10164,7 +9949,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/client-sso@3.799.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -10177,29 +9962,29 @@ snapshots: '@aws-sdk/types': 3.775.0 '@aws-sdk/util-endpoints': 3.787.0 '@aws-sdk/util-user-agent-browser': 3.775.0 - '@aws-sdk/util-user-agent-node': 3.799.0(aws-crt@1.26.2) - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 + '@aws-sdk/util-user-agent-node': 3.799.0 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 '@smithy/invalid-dependency': 4.0.2 '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.2 - '@smithy/middleware-retry': 4.1.3 - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-endpoint': 4.1.6 + '@smithy/middleware-retry': 4.1.7 + '@smithy/middleware-serde': 4.0.5 '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/node-http-handler': 4.0.4 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@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.10 - '@smithy/util-defaults-mode-node': 4.0.10 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-defaults-mode-browser': 4.0.14 + '@smithy/util-defaults-mode-node': 4.0.14 + '@smithy/util-endpoints': 3.0.4 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 '@smithy/util-utf8': 4.0.0 @@ -10207,7 +9992,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/client-sso@3.804.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -10220,29 +10005,29 @@ snapshots: '@aws-sdk/types': 3.804.0 '@aws-sdk/util-endpoints': 3.804.0 '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.804.0(aws-crt@1.26.2) - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 + '@aws-sdk/util-user-agent-node': 3.804.0 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 '@smithy/invalid-dependency': 4.0.2 '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.2 - '@smithy/middleware-retry': 4.1.3 - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-endpoint': 4.1.6 + '@smithy/middleware-retry': 4.1.7 + '@smithy/middleware-serde': 4.0.5 '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/node-http-handler': 4.0.4 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@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.10 - '@smithy/util-defaults-mode-node': 4.0.10 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-defaults-mode-browser': 4.0.14 + '@smithy/util-defaults-mode-node': 4.0.14 + '@smithy/util-endpoints': 3.0.4 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 '@smithy/util-utf8': 4.0.0 @@ -10253,12 +10038,12 @@ snapshots: '@aws-sdk/core@3.799.0': dependencies: '@aws-sdk/types': 3.775.0 - '@smithy/core': 3.3.1 - '@smithy/node-config-provider': 4.0.2 + '@smithy/core': 3.3.3 + '@smithy/node-config-provider': 4.1.1 '@smithy/property-provider': 4.0.2 '@smithy/protocol-http': 5.1.0 '@smithy/signature-v4': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/util-middleware': 4.0.2 fast-xml-parser: 4.4.1 @@ -10267,20 +10052,20 @@ snapshots: '@aws-sdk/core@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/core': 3.3.1 - '@smithy/node-config-provider': 4.0.2 + '@smithy/core': 3.3.3 + '@smithy/node-config-provider': 4.1.1 '@smithy/property-provider': 4.0.2 '@smithy/protocol-http': 5.1.0 '@smithy/signature-v4': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/util-middleware': 4.0.2 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-cognito-identity@3.799.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/client-cognito-identity': 3.799.0 '@aws-sdk/types': 3.775.0 '@smithy/property-provider': 4.0.2 '@smithy/types': 4.2.0 @@ -10312,7 +10097,7 @@ snapshots: '@smithy/node-http-handler': 4.0.4 '@smithy/property-provider': 4.0.2 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/util-stream': 4.2.0 tslib: 2.8.1 @@ -10325,22 +10110,22 @@ snapshots: '@smithy/node-http-handler': 4.0.4 '@smithy/property-provider': 4.0.2 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/util-stream': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-ini@3.799.0': dependencies: '@aws-sdk/core': 3.799.0 '@aws-sdk/credential-provider-env': 3.799.0 '@aws-sdk/credential-provider-http': 3.799.0 '@aws-sdk/credential-provider-process': 3.799.0 - '@aws-sdk/credential-provider-sso': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/credential-provider-web-identity': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/nested-clients': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-sso': 3.799.0 + '@aws-sdk/credential-provider-web-identity': 3.799.0 + '@aws-sdk/nested-clients': 3.799.0 '@aws-sdk/types': 3.775.0 - '@smithy/credential-provider-imds': 4.0.2 + '@smithy/credential-provider-imds': 4.0.4 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 '@smithy/types': 4.2.0 @@ -10348,17 +10133,17 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-ini@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-ini@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 '@aws-sdk/credential-provider-env': 3.804.0 '@aws-sdk/credential-provider-http': 3.804.0 '@aws-sdk/credential-provider-process': 3.804.0 - '@aws-sdk/credential-provider-sso': 3.804.0(aws-crt@1.26.2) - '@aws-sdk/credential-provider-web-identity': 3.804.0(aws-crt@1.26.2) - '@aws-sdk/nested-clients': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-sso': 3.804.0 + '@aws-sdk/credential-provider-web-identity': 3.804.0 + '@aws-sdk/nested-clients': 3.804.0 '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.2 + '@smithy/credential-provider-imds': 4.0.4 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 '@smithy/types': 4.2.0 @@ -10366,16 +10151,16 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-node@3.799.0': dependencies: '@aws-sdk/credential-provider-env': 3.799.0 '@aws-sdk/credential-provider-http': 3.799.0 - '@aws-sdk/credential-provider-ini': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-ini': 3.799.0 '@aws-sdk/credential-provider-process': 3.799.0 - '@aws-sdk/credential-provider-sso': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/credential-provider-web-identity': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-sso': 3.799.0 + '@aws-sdk/credential-provider-web-identity': 3.799.0 '@aws-sdk/types': 3.775.0 - '@smithy/credential-provider-imds': 4.0.2 + '@smithy/credential-provider-imds': 4.0.4 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 '@smithy/types': 4.2.0 @@ -10383,16 +10168,16 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-node@3.804.0': dependencies: '@aws-sdk/credential-provider-env': 3.804.0 '@aws-sdk/credential-provider-http': 3.804.0 - '@aws-sdk/credential-provider-ini': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-ini': 3.804.0 '@aws-sdk/credential-provider-process': 3.804.0 - '@aws-sdk/credential-provider-sso': 3.804.0(aws-crt@1.26.2) - '@aws-sdk/credential-provider-web-identity': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-sso': 3.804.0 + '@aws-sdk/credential-provider-web-identity': 3.804.0 '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.2 + '@smithy/credential-provider-imds': 4.0.4 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 '@smithy/types': 4.2.0 @@ -10418,11 +10203,11 @@ snapshots: '@smithy/types': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-sso@3.799.0': dependencies: - '@aws-sdk/client-sso': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/client-sso': 3.799.0 '@aws-sdk/core': 3.799.0 - '@aws-sdk/token-providers': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/token-providers': 3.799.0 '@aws-sdk/types': 3.775.0 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 @@ -10431,11 +10216,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-sso@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-sso@3.804.0': dependencies: - '@aws-sdk/client-sso': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/client-sso': 3.804.0 '@aws-sdk/core': 3.804.0 - '@aws-sdk/token-providers': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/token-providers': 3.804.0 '@aws-sdk/types': 3.804.0 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 @@ -10444,10 +10229,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-web-identity@3.799.0': dependencies: '@aws-sdk/core': 3.799.0 - '@aws-sdk/nested-clients': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/nested-clients': 3.799.0 '@aws-sdk/types': 3.775.0 '@smithy/property-provider': 4.0.2 '@smithy/types': 4.2.0 @@ -10455,10 +10240,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/credential-provider-web-identity@3.804.0': dependencies: '@aws-sdk/core': 3.804.0 - '@aws-sdk/nested-clients': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/nested-clients': 3.804.0 '@aws-sdk/types': 3.804.0 '@smithy/property-provider': 4.0.2 '@smithy/types': 4.2.0 @@ -10466,24 +10251,24 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-providers@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/credential-providers@3.799.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/client-cognito-identity': 3.799.0 '@aws-sdk/core': 3.799.0 - '@aws-sdk/credential-provider-cognito-identity': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-cognito-identity': 3.799.0 '@aws-sdk/credential-provider-env': 3.799.0 '@aws-sdk/credential-provider-http': 3.799.0 - '@aws-sdk/credential-provider-ini': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/credential-provider-node': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-ini': 3.799.0 + '@aws-sdk/credential-provider-node': 3.799.0 '@aws-sdk/credential-provider-process': 3.799.0 - '@aws-sdk/credential-provider-sso': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/credential-provider-web-identity': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/nested-clients': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-sso': 3.799.0 + '@aws-sdk/credential-provider-web-identity': 3.799.0 + '@aws-sdk/nested-clients': 3.799.0 '@aws-sdk/types': 3.775.0 - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 - '@smithy/credential-provider-imds': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 + '@smithy/credential-provider-imds': 4.0.4 + '@smithy/node-config-provider': 4.1.1 '@smithy/property-provider': 4.0.2 '@smithy/types': 4.2.0 tslib: 2.8.1 @@ -10499,7 +10284,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.804.0 '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 '@smithy/util-config-provider': 4.0.0 @@ -10509,7 +10294,7 @@ snapshots: dependencies: '@aws-sdk/endpoint-cache': 3.723.0 '@aws-sdk/types': 3.775.0 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 tslib: 2.8.1 @@ -10529,7 +10314,7 @@ snapshots: '@aws-sdk/core': 3.804.0 '@aws-sdk/types': 3.804.0 '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 '@smithy/util-middleware': 4.0.2 @@ -10588,11 +10373,11 @@ snapshots: '@aws-sdk/core': 3.804.0 '@aws-sdk/types': 3.804.0 '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.3.1 - '@smithy/node-config-provider': 4.0.2 + '@smithy/core': 3.3.3 + '@smithy/node-config-provider': 4.1.1 '@smithy/protocol-http': 5.1.0 '@smithy/signature-v4': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.2 @@ -10611,7 +10396,7 @@ snapshots: '@aws-sdk/core': 3.799.0 '@aws-sdk/types': 3.775.0 '@aws-sdk/util-endpoints': 3.787.0 - '@smithy/core': 3.3.1 + '@smithy/core': 3.3.3 '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 tslib: 2.8.1 @@ -10621,12 +10406,12 @@ snapshots: '@aws-sdk/core': 3.804.0 '@aws-sdk/types': 3.804.0 '@aws-sdk/util-endpoints': 3.804.0 - '@smithy/core': 3.3.1 + '@smithy/core': 3.3.3 '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/nested-clients@3.799.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -10639,29 +10424,29 @@ snapshots: '@aws-sdk/types': 3.775.0 '@aws-sdk/util-endpoints': 3.787.0 '@aws-sdk/util-user-agent-browser': 3.775.0 - '@aws-sdk/util-user-agent-node': 3.799.0(aws-crt@1.26.2) - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 + '@aws-sdk/util-user-agent-node': 3.799.0 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 '@smithy/invalid-dependency': 4.0.2 '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.2 - '@smithy/middleware-retry': 4.1.3 - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-endpoint': 4.1.6 + '@smithy/middleware-retry': 4.1.7 + '@smithy/middleware-serde': 4.0.5 '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/node-http-handler': 4.0.4 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@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.10 - '@smithy/util-defaults-mode-node': 4.0.10 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-defaults-mode-browser': 4.0.14 + '@smithy/util-defaults-mode-node': 4.0.14 + '@smithy/util-endpoints': 3.0.4 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 '@smithy/util-utf8': 4.0.0 @@ -10669,7 +10454,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/nested-clients@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/nested-clients@3.804.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -10682,29 +10467,29 @@ snapshots: '@aws-sdk/types': 3.804.0 '@aws-sdk/util-endpoints': 3.804.0 '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.804.0(aws-crt@1.26.2) - '@smithy/config-resolver': 4.1.0 - '@smithy/core': 3.3.1 + '@aws-sdk/util-user-agent-node': 3.804.0 + '@smithy/config-resolver': 4.1.2 + '@smithy/core': 3.3.3 '@smithy/fetch-http-handler': 5.0.2 '@smithy/hash-node': 4.0.2 '@smithy/invalid-dependency': 4.0.2 '@smithy/middleware-content-length': 4.0.2 - '@smithy/middleware-endpoint': 4.1.2 - '@smithy/middleware-retry': 4.1.3 - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-endpoint': 4.1.6 + '@smithy/middleware-retry': 4.1.7 + '@smithy/middleware-serde': 4.0.5 '@smithy/middleware-stack': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/node-http-handler': 4.0.4 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@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.10 - '@smithy/util-defaults-mode-node': 4.0.10 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-defaults-mode-browser': 4.0.14 + '@smithy/util-defaults-mode-node': 4.0.14 + '@smithy/util-endpoints': 3.0.4 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 '@smithy/util-utf8': 4.0.0 @@ -10715,7 +10500,7 @@ snapshots: '@aws-sdk/region-config-resolver@3.775.0': dependencies: '@aws-sdk/types': 3.775.0 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/types': 4.2.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.2 @@ -10724,18 +10509,18 @@ snapshots: '@aws-sdk/region-config-resolver@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/types': 4.2.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.2 tslib: 2.8.1 - '@aws-sdk/s3-presigned-post@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/s3-presigned-post@3.804.0': dependencies: - '@aws-sdk/client-s3': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/client-s3': 3.804.0 '@aws-sdk/types': 3.804.0 '@aws-sdk/util-format-url': 3.804.0 - '@smithy/middleware-endpoint': 4.1.2 + '@smithy/middleware-endpoint': 4.1.6 '@smithy/signature-v4': 5.1.0 '@smithy/types': 4.2.0 '@smithy/util-hex-encoding': 4.0.0 @@ -10749,9 +10534,9 @@ snapshots: '@aws-sdk/signature-v4-multi-region': 3.804.0 '@aws-sdk/types': 3.804.0 '@aws-sdk/util-format-url': 3.804.0 - '@smithy/middleware-endpoint': 4.1.2 + '@smithy/middleware-endpoint': 4.1.6 '@smithy/protocol-http': 5.1.0 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 tslib: 2.8.1 @@ -10764,9 +10549,9 @@ snapshots: '@smithy/types': 4.2.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/token-providers@3.799.0': dependencies: - '@aws-sdk/nested-clients': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/nested-clients': 3.799.0 '@aws-sdk/types': 3.775.0 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 @@ -10775,9 +10560,9 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/token-providers@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/token-providers@3.804.0': dependencies: - '@aws-sdk/nested-clients': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/nested-clients': 3.804.0 '@aws-sdk/types': 3.804.0 '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 @@ -10800,23 +10585,23 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-dynamodb@3.799.0(@aws-sdk/client-dynamodb@3.799.0(aws-crt@1.26.2))': + '@aws-sdk/util-dynamodb@3.799.0(@aws-sdk/client-dynamodb@3.799.0)': dependencies: - '@aws-sdk/client-dynamodb': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/client-dynamodb': 3.799.0 tslib: 2.8.1 '@aws-sdk/util-endpoints@3.787.0': dependencies: '@aws-sdk/types': 3.775.0 '@smithy/types': 4.2.0 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-endpoints': 3.0.4 tslib: 2.8.1 '@aws-sdk/util-endpoints@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 '@smithy/types': 4.2.0 - '@smithy/util-endpoints': 3.0.2 + '@smithy/util-endpoints': 3.0.4 tslib: 2.8.1 '@aws-sdk/util-format-url@3.804.0': @@ -10826,7 +10611,7 @@ snapshots: '@smithy/types': 4.2.0 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.723.0': + '@aws-sdk/util-locate-window@3.804.0': dependencies: tslib: 2.8.1 @@ -10844,30 +10629,21 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.799.0(aws-crt@1.26.2)': + '@aws-sdk/util-user-agent-node@3.799.0': dependencies: '@aws-sdk/middleware-user-agent': 3.799.0 '@aws-sdk/types': 3.775.0 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/types': 4.2.0 tslib: 2.8.1 - optionalDependencies: - aws-crt: 1.26.2 - '@aws-sdk/util-user-agent-node@3.804.0(aws-crt@1.26.2)': + '@aws-sdk/util-user-agent-node@3.804.0': dependencies: '@aws-sdk/middleware-user-agent': 3.804.0 '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/types': 4.2.0 tslib: 2.8.1 - optionalDependencies: - aws-crt: 1.26.2 - - '@aws-sdk/util-utf8-browser@3.259.0': - dependencies: - tslib: 2.8.1 - optional: true '@aws-sdk/xml-builder@3.804.0': dependencies: @@ -10881,49 +10657,52 @@ snapshots: '@azure/core-auth@1.9.0': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.11.0 - tslib: 2.8.1 - - '@azure/core-client@1.9.3': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.9.0 - '@azure/core-rest-pipeline': 1.19.1 - '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.11.0 - '@azure/logger': 1.1.4 + '@azure/core-util': 1.12.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/core-http-compat@2.2.0': + '@azure/core-client@1.9.4': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-client': 1.9.3 - '@azure/core-rest-pipeline': 1.19.1 + '@azure/core-auth': 1.9.0 + '@azure/core-rest-pipeline': 1.20.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.12.0 + '@azure/logger': 1.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-http-compat@2.3.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-client': 1.9.4 + '@azure/core-rest-pipeline': 1.20.0 transitivePeerDependencies: - supports-color '@azure/core-lro@2.7.2': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.11.0 - '@azure/logger': 1.1.4 + '@azure/core-util': 1.12.0 + '@azure/logger': 1.2.0 tslib: 2.8.1 + transitivePeerDependencies: + - supports-color '@azure/core-paging@1.6.2': dependencies: tslib: 2.8.1 - '@azure/core-rest-pipeline@1.19.1': + '@azure/core-rest-pipeline@1.20.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.9.0 '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.11.0 - '@azure/logger': 1.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + '@azure/core-util': 1.12.0 + '@azure/logger': 1.2.0 + '@typespec/ts-http-runtime': 0.2.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -10932,28 +10711,31 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/core-util@1.11.0': + '@azure/core-util@1.12.0': dependencies: '@azure/abort-controller': 2.1.2 + '@typespec/ts-http-runtime': 0.2.2 tslib: 2.8.1 + transitivePeerDependencies: + - supports-color '@azure/core-xml@1.4.5': dependencies: - fast-xml-parser: 5.2.0 + fast-xml-parser: 5.2.3 tslib: 2.8.1 - '@azure/identity@4.9.0': + '@azure/identity@4.10.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.9.0 - '@azure/core-client': 1.9.3 - '@azure/core-rest-pipeline': 1.19.1 + '@azure/core-client': 1.9.4 + '@azure/core-rest-pipeline': 1.20.0 '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.11.0 - '@azure/logger': 1.1.4 - '@azure/msal-browser': 4.11.0 - '@azure/msal-node': 3.5.1 - open: 10.1.1 + '@azure/core-util': 1.12.0 + '@azure/logger': 1.2.0 + '@azure/msal-browser': 4.12.0 + '@azure/msal-node': 3.5.3 + open: 10.1.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -10962,11 +10744,11 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.9.0 - '@azure/core-client': 1.9.3 - '@azure/core-rest-pipeline': 1.19.1 + '@azure/core-client': 1.9.4 + '@azure/core-rest-pipeline': 1.20.0 '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.11.0 - '@azure/logger': 1.1.4 + '@azure/core-util': 1.12.0 + '@azure/logger': 1.2.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -10975,43 +10757,46 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.9.0 - '@azure/core-client': 1.9.3 - '@azure/core-http-compat': 2.2.0 + '@azure/core-client': 1.9.4 + '@azure/core-http-compat': 2.3.0 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.19.1 + '@azure/core-rest-pipeline': 1.20.0 '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.11.0 + '@azure/core-util': 1.12.0 '@azure/keyvault-common': 2.0.0 - '@azure/logger': 1.1.4 + '@azure/logger': 1.2.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/logger@1.1.4': + '@azure/logger@1.2.0': dependencies: + '@typespec/ts-http-runtime': 0.2.2 tslib: 2.8.1 + transitivePeerDependencies: + - supports-color '@azure/microsoft-playwright-testing@1.0.0-beta.7(@playwright/test@1.52.0)': dependencies: - '@azure/core-rest-pipeline': 1.19.1 - '@azure/identity': 4.9.0 - '@azure/logger': 1.1.4 + '@azure/core-rest-pipeline': 1.20.0 + '@azure/identity': 4.10.0 + '@azure/logger': 1.2.0 '@azure/storage-blob': 12.27.0 '@playwright/test': 1.52.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.11.0': + '@azure/msal-browser@4.12.0': dependencies: - '@azure/msal-common': 15.5.1 + '@azure/msal-common': 15.6.0 - '@azure/msal-common@15.5.1': {} + '@azure/msal-common@15.6.0': {} - '@azure/msal-node@3.5.1': + '@azure/msal-node@3.5.3': dependencies: - '@azure/msal-common': 15.5.1 + '@azure/msal-common': 15.6.0 jsonwebtoken: 9.0.2 uuid: 8.3.2 @@ -11019,197 +10804,166 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.9.0 - '@azure/core-client': 1.9.3 - '@azure/core-http-compat': 2.2.0 + '@azure/core-client': 1.9.4 + '@azure/core-http-compat': 2.3.0 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.19.1 + '@azure/core-rest-pipeline': 1.20.0 '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.11.0 + '@azure/core-util': 1.12.0 '@azure/core-xml': 1.4.5 - '@azure/logger': 1.1.4 + '@azure/logger': 1.2.0 events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.2': {} - '@babel/core@7.26.0': + '@babel/core@7.27.1': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/core@7.26.10': + '@babel/eslint-parser@7.27.1(@babel/core@7.27.1)(eslint@8.57.0)': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/eslint-parser@7.27.0(@babel/core@7.26.0)(eslint@8.57.0)': - dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.27.1 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/generator@7.27.0': + '@babel/generator@7.27.1': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.1': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 - '@babel/helper-compilation-targets@7.27.0': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.1': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.26.5': {} - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helpers@7.27.0': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.27.0': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/types': 7.27.0 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/runtime@7.27.1': {} - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + '@babel/template@7.27.2': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/traverse@7.27.1': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - - '@babel/traverse@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.27.0': + '@babel/types@7.27.1': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@1.0.2': {} @@ -11225,11 +10979,11 @@ snapshots: '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.29.0 - '@boxyhq/saml-jackson@1.45.2(aws-crt@1.26.2)(socks@2.8.4)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3))': + '@boxyhq/saml-jackson@1.45.2(socks@2.8.4)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3))': dependencies: - '@aws-sdk/client-dynamodb': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/credential-providers': 3.799.0(aws-crt@1.26.2) - '@aws-sdk/util-dynamodb': 3.799.0(@aws-sdk/client-dynamodb@3.799.0(aws-crt@1.26.2)) + '@aws-sdk/client-dynamodb': 3.799.0 + '@aws-sdk/credential-providers': 3.799.0 + '@aws-sdk/util-dynamodb': 3.799.0(@aws-sdk/client-dynamodb@3.799.0) '@boxyhq/error-code-mnemonic': 0.1.1 '@boxyhq/metrics': 0.2.10 '@boxyhq/saml20': 1.10.2 @@ -11241,7 +10995,7 @@ snapshots: jose: 6.0.10 lodash: 4.17.21 mixpanel: 0.18.1 - mongodb: 6.16.0(@aws-sdk/credential-providers@3.799.0(aws-crt@1.26.2))(socks@2.8.4) + mongodb: 6.16.0(@aws-sdk/credential-providers@3.799.0)(socks@2.8.4) mssql: 11.0.1 mysql2: 3.14.1 node-forge: 1.3.1 @@ -11251,7 +11005,7 @@ snapshots: reflect-metadata: 0.2.2 ripemd160: 2.0.2 sqlite3: 5.1.7 - typeorm: 0.3.22(mongodb@6.16.0(@aws-sdk/credential-providers@3.799.0(aws-crt@1.26.2))(socks@2.8.4))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.15.6)(redis@4.7.0)(reflect-metadata@0.2.2)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)) + typeorm: 0.3.22(mongodb@6.16.0(@aws-sdk/credential-providers@3.799.0)(socks@2.8.4))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.15.6)(redis@4.7.0)(reflect-metadata@0.2.2)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)) transitivePeerDependencies: - '@google-cloud/spanner' - '@mongodb-js/zstd' @@ -11453,11 +11207,6 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true - '@eslint-community/eslint-utils@4.6.1(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -11468,7 +11217,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -11481,18 +11230,18 @@ snapshots: '@eslint/js@8.57.0': {} - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.7.0': dependencies: '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.7.0': dependencies: - '@floating-ui/core': 1.6.9 + '@floating-ui/core': 1.7.0 '@floating-ui/utils': 0.2.9 '@floating-ui/react-dom@2.1.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.6.13 + '@floating-ui/dom': 1.7.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -11534,7 +11283,7 @@ snapshots: next: 15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) redis: 4.7.0 optionalDependencies: - '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.2 '@gar/promisify@1.1.3': optional: true @@ -11555,7 +11304,7 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.0 + protobufjs: 7.5.2 yargs: 17.7.2 '@hookform/resolvers@5.0.1(react-hook-form@7.56.2(react@19.1.0))': @@ -11563,25 +11312,10 @@ snapshots: '@standard-schema/utils': 0.3.0 react-hook-form: 7.56.2(react@19.1.0) - '@httptoolkit/websocket-stream@6.0.1': - dependencies: - '@types/ws': 8.18.1 - duplexify: 3.7.1 - inherits: 2.0.4 - isomorphic-ws: 4.0.1(ws@8.18.1) - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - ws: 8.18.1 - xtend: 4.0.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true - '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -11681,12 +11415,12 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: glob: 10.4.5 magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.8.3) - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) optionalDependencies: typescript: 5.8.3 @@ -11734,7 +11468,7 @@ snapshots: '@keyv/redis@4.4.0(keyv@5.3.3)': dependencies: - '@redis/client': 1.6.0 + '@redis/client': 1.6.1 cluster-key-slot: 1.1.2 keyv: 5.3.3 @@ -11828,7 +11562,7 @@ snapshots: '@lexical/utils': 0.31.0 lexical: 0.31.0 - '@lexical/react@0.31.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.26)': + '@lexical/react@0.31.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(yjs@13.6.27)': dependencies: '@lexical/devtools-core': 0.31.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@lexical/dragon': 0.31.0 @@ -11844,7 +11578,7 @@ snapshots: '@lexical/table': 0.31.0 '@lexical/text': 0.31.0 '@lexical/utils': 0.31.0 - '@lexical/yjs': 0.31.0(yjs@13.6.26) + '@lexical/yjs': 0.31.0(yjs@13.6.27) lexical: 0.31.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -11880,12 +11614,12 @@ snapshots: '@lexical/table': 0.31.0 lexical: 0.31.0 - '@lexical/yjs@0.31.0(yjs@13.6.26)': + '@lexical/yjs@0.31.0(yjs@13.6.27)': dependencies: '@lexical/offset': 0.31.0 '@lexical/selection': 0.31.0 lexical: 0.31.0 - yjs: 13.6.26 + yjs: 13.6.27 '@libsql/hrana-client@0.4.4(encoding@0.1.13)': dependencies: @@ -11907,7 +11641,7 @@ snapshots: '@libsql/isomorphic-ws@0.1.5': dependencies: '@types/ws': 8.18.1 - ws: 8.18.1 + ws: 8.18.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11926,23 +11660,23 @@ snapshots: '@types/react': 19.1.4 react: 19.1.0 - '@microsoft/api-extractor-model@7.30.5(@types/node@22.15.18)': + '@microsoft/api-extractor-model@7.30.6(@types/node@22.15.18)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.0(@types/node@22.15.18) + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.18) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.4(@types/node@22.15.18)': + '@microsoft/api-extractor@7.52.8(@types/node@22.15.18)': dependencies: - '@microsoft/api-extractor-model': 7.30.5(@types/node@22.15.18) + '@microsoft/api-extractor-model': 7.30.6(@types/node@22.15.18) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.0(@types/node@22.15.18) + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.18) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.2(@types/node@22.15.18) - '@rushstack/ts-command-line': 4.23.7(@types/node@22.15.18) + '@rushstack/terminal': 0.15.3(@types/node@22.15.18) + '@rushstack/ts-command-line': 5.0.1(@types/node@22.15.18) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -12022,7 +11756,7 @@ snapshots: dependencies: eslint-scope: 5.1.1 - '@noble/hashes@1.7.2': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -12041,7 +11775,7 @@ snapshots: '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.1 + semver: 7.7.2 optional: true '@npmcli/move-file@1.1.2': @@ -12076,7 +11810,7 @@ snapshots: '@opentelemetry/core@2.0.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@opentelemetry/exporter-metrics-otlp-grpc@0.57.1(@opentelemetry/api@1.9.0)': dependencies: @@ -12116,7 +11850,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12125,7 +11859,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color @@ -12142,7 +11876,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12151,7 +11885,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12182,7 +11916,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12191,7 +11925,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.200.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color @@ -12203,7 +11937,7 @@ snapshots: '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 forwarded-parse: 2.1.2 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -12212,7 +11946,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.36.2 - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12220,7 +11954,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12228,7 +11962,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12237,7 +11971,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12252,7 +11986,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12261,7 +11995,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12269,7 +12003,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -12278,7 +12012,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@types/mysql': 2.15.26 transitivePeerDependencies: - supports-color @@ -12288,7 +12022,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) '@types/pg': 8.6.1 '@types/pg-pool': 2.0.6 @@ -12300,7 +12034,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.36.2 - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 transitivePeerDependencies: - supports-color @@ -12315,7 +12049,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@types/tedious': 4.0.14 transitivePeerDependencies: - supports-color @@ -12333,7 +12067,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.200.0 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.1 + import-in-the-middle: 1.13.2 require-in-the-middle: 7.5.2 shimmer: 1.2.1 transitivePeerDependencies: @@ -12344,9 +12078,9 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.2 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.13.1 + import-in-the-middle: 1.13.2 require-in-the-middle: 7.5.2 - semver: 7.7.1 + semver: 7.7.2 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -12374,7 +12108,7 @@ snapshots: '@opentelemetry/sdk-logs': 0.57.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - protobufjs: 7.5.0 + protobufjs: 7.5.2 '@opentelemetry/redis-common@0.36.2': {} @@ -12388,7 +12122,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@opentelemetry/sdk-logs@0.200.0(@opentelemetry/api@1.9.0)': dependencies: @@ -12427,7 +12161,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.29.0': {} - '@opentelemetry/semantic-conventions@1.32.0': {} + '@opentelemetry/semantic-conventions@1.33.0': {} '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': dependencies: @@ -12461,29 +12195,29 @@ snapshots: '@paralleldrive/cuid2@2.2.2': dependencies: - '@noble/hashes': 1.7.2 + '@noble/hashes': 1.8.0 '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.2': {} + '@pkgr/core@0.2.4': {} '@playwright/test@1.52.0': dependencies: playwright: 1.52.0 - '@preact/preset-vite@2.10.1(@babel/core@7.26.10)(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@preact/preset-vite@2.10.1(@babel/core@7.27.1)(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.10) - '@prefresh/vite': 2.4.7(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + '@babel/core': 7.27.1 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.1) + '@prefresh/vite': 2.4.7(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@rollup/pluginutils': 4.2.1 - babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.26.10) - debug: 4.4.0 + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.27.1) + debug: 4.4.1 kolorist: 1.8.0 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) - vite-prerender-plugin: 0.5.10(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite-prerender-plugin: 0.5.10(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) transitivePeerDependencies: - preact - supports-color @@ -12496,15 +12230,15 @@ snapshots: '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.7(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@prefresh/vite@2.4.7(preact@10.26.6)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 '@prefresh/babel-plugin': 0.5.1 '@prefresh/core': 1.5.3(preact@10.26.6) '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.26.6 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -12522,7 +12256,9 @@ snapshots: '@prisma/debug@6.7.0': {} - '@prisma/dmmf@6.7.0': {} + '@prisma/debug@6.8.0': {} + + '@prisma/dmmf@6.8.0': {} '@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed': {} @@ -12539,13 +12275,13 @@ snapshots: '@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed '@prisma/get-platform': 6.7.0 - '@prisma/generator-helper@6.7.0': + '@prisma/generator-helper@6.8.0': dependencies: - '@prisma/debug': 6.7.0 - '@prisma/dmmf': 6.7.0 - '@prisma/generator': 6.7.0 + '@prisma/debug': 6.8.0 + '@prisma/dmmf': 6.8.0 + '@prisma/generator': 6.8.0 - '@prisma/generator@6.7.0': {} + '@prisma/generator@6.8.0': {} '@prisma/get-platform@6.7.0': dependencies: @@ -12843,15 +12579,6 @@ snapshots: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-primitive@2.1.0(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-slot': 1.2.0(@types/react@19.1.4)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.1.4 - '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-primitive@2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.0) @@ -12953,13 +12680,6 @@ snapshots: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-slot@1.2.0(@types/react@19.1.4)(react@19.1.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.1.4 - '@radix-ui/react-slot@1.2.2(@types/react@19.1.4)(react@19.1.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.0) @@ -13231,6 +12951,12 @@ snapshots: generic-pool: 3.9.0 yallist: 4.0.0 + '@redis/client@1.6.1': + dependencies: + cluster-key-slot: 1.1.2 + generic-pool: 3.9.0 + yallist: 4.0.0 + '@redis/graph@1.1.1(@redis/client@1.6.0)': dependencies: '@redis/client': 1.6.0 @@ -13274,136 +13000,136 @@ snapshots: optionalDependencies: rollup: 4.35.0 - '@rollup/pluginutils@5.1.4(rollup@4.40.0)': + '@rollup/pluginutils@5.1.4(rollup@4.40.2)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.40.0 + rollup: 4.40.2 '@rollup/rollup-android-arm-eabi@4.35.0': optional: true - '@rollup/rollup-android-arm-eabi@4.40.0': + '@rollup/rollup-android-arm-eabi@4.40.2': optional: true '@rollup/rollup-android-arm64@4.35.0': optional: true - '@rollup/rollup-android-arm64@4.40.0': + '@rollup/rollup-android-arm64@4.40.2': optional: true '@rollup/rollup-darwin-arm64@4.35.0': optional: true - '@rollup/rollup-darwin-arm64@4.40.0': + '@rollup/rollup-darwin-arm64@4.40.2': optional: true '@rollup/rollup-darwin-x64@4.35.0': optional: true - '@rollup/rollup-darwin-x64@4.40.0': + '@rollup/rollup-darwin-x64@4.40.2': optional: true '@rollup/rollup-freebsd-arm64@4.35.0': optional: true - '@rollup/rollup-freebsd-arm64@4.40.0': + '@rollup/rollup-freebsd-arm64@4.40.2': optional: true '@rollup/rollup-freebsd-x64@4.35.0': optional: true - '@rollup/rollup-freebsd-x64@4.40.0': + '@rollup/rollup-freebsd-x64@4.40.2': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.35.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': optional: true '@rollup/rollup-linux-arm-musleabihf@4.35.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': + '@rollup/rollup-linux-arm-musleabihf@4.40.2': optional: true '@rollup/rollup-linux-arm64-gnu@4.35.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': + '@rollup/rollup-linux-arm64-gnu@4.40.2': optional: true '@rollup/rollup-linux-arm64-musl@4.35.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': + '@rollup/rollup-linux-arm64-musl@4.40.2': optional: true '@rollup/rollup-linux-loongarch64-gnu@4.35.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': optional: true '@rollup/rollup-linux-riscv64-gnu@4.35.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': + '@rollup/rollup-linux-riscv64-gnu@4.40.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': + '@rollup/rollup-linux-riscv64-musl@4.40.2': optional: true '@rollup/rollup-linux-s390x-gnu@4.35.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': + '@rollup/rollup-linux-s390x-gnu@4.40.2': optional: true '@rollup/rollup-linux-x64-gnu@4.35.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': + '@rollup/rollup-linux-x64-gnu@4.40.2': optional: true '@rollup/rollup-linux-x64-musl@4.35.0': optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': + '@rollup/rollup-linux-x64-musl@4.40.2': optional: true '@rollup/rollup-win32-arm64-msvc@4.35.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': + '@rollup/rollup-win32-arm64-msvc@4.40.2': optional: true '@rollup/rollup-win32-ia32-msvc@4.35.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.0': + '@rollup/rollup-win32-ia32-msvc@4.40.2': optional: true '@rollup/rollup-win32-x64-msvc@4.35.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.0': + '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.11.0': {} - '@rushstack/node-core-library@5.13.0(@types/node@22.15.18)': + '@rushstack/node-core-library@5.13.1(@types/node@22.15.18)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -13421,16 +13147,16 @@ snapshots: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.2(@types/node@22.15.18)': + '@rushstack/terminal@0.15.3(@types/node@22.15.18)': dependencies: - '@rushstack/node-core-library': 5.13.0(@types/node@22.15.18) + '@rushstack/node-core-library': 5.13.1(@types/node@22.15.18) supports-color: 8.1.1 optionalDependencies: '@types/node': 22.15.18 - '@rushstack/ts-command-line@4.23.7(@types/node@22.15.18)': + '@rushstack/ts-command-line@5.0.1(@types/node@22.15.18)': dependencies: - '@rushstack/terminal': 0.15.2(@types/node@22.15.18) + '@rushstack/terminal': 0.15.3(@types/node@22.15.18) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -13472,7 +13198,7 @@ snapshots: '@sentry/bundler-plugin-core@3.3.1(encoding@0.1.13)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 '@sentry/babel-plugin-component-annotate': 3.3.1 '@sentry/cli': 2.42.2(encoding@0.1.13) dotenv: 16.5.0 @@ -13529,12 +13255,12 @@ snapshots: '@sentry/nextjs@9.15.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.200.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(webpack@5.99.8)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@rollup/plugin-commonjs': 28.0.1(rollup@4.35.0) '@sentry-internal/browser-utils': 9.15.0 '@sentry/core': 9.15.0 '@sentry/node': 9.15.0 - '@sentry/opentelemetry': 9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.200.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0) + '@sentry/opentelemetry': 9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.200.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.33.0) '@sentry/react': 9.15.0(react@19.1.0) '@sentry/vercel-edge': 9.15.0 '@sentry/webpack-plugin': 3.3.1(encoding@0.1.13)(webpack@5.99.8) @@ -13584,32 +13310,32 @@ snapshots: '@opentelemetry/instrumentation-undici': 0.10.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@prisma/instrumentation': 6.6.0(@opentelemetry/api@1.9.0) '@sentry/core': 9.15.0 - '@sentry/opentelemetry': 9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0) - import-in-the-middle: 1.13.1 + '@sentry/opentelemetry': 9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.33.0) + import-in-the-middle: 1.13.2 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.200.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0)': + '@sentry/opentelemetry@9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.200.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.33.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.200.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@sentry/core': 9.15.0 - '@sentry/opentelemetry@9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0)': + '@sentry/opentelemetry@9.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.33.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.32.0 + '@opentelemetry/semantic-conventions': 1.33.0 '@sentry/core': 9.15.0 '@sentry/react@9.15.0(react@19.1.0)': @@ -13653,17 +13379,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.1.0': + '@smithy/config-resolver@4.1.2': dependencies: - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/types': 4.2.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.2 tslib: 2.8.1 - '@smithy/core@3.3.1': + '@smithy/core@3.3.3': dependencies: - '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-serde': 4.0.5 '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 '@smithy/util-body-length-browser': 4.0.0 @@ -13672,9 +13398,9 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.0.2': + '@smithy/credential-provider-imds@4.0.4': dependencies: - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/property-provider': 4.0.2 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 @@ -13763,31 +13489,32 @@ snapshots: '@smithy/types': 4.2.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.2': + '@smithy/middleware-endpoint@4.1.6': dependencies: - '@smithy/core': 3.3.1 - '@smithy/middleware-serde': 4.0.3 - '@smithy/node-config-provider': 4.0.2 + '@smithy/core': 3.3.3 + '@smithy/middleware-serde': 4.0.5 + '@smithy/node-config-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.0.2 '@smithy/types': 4.2.0 '@smithy/url-parser': 4.0.2 '@smithy/util-middleware': 4.0.2 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.3': + '@smithy/middleware-retry@4.1.7': dependencies: - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/protocol-http': 5.1.0 '@smithy/service-error-classification': 4.0.3 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 '@smithy/util-middleware': 4.0.2 '@smithy/util-retry': 4.0.3 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.3': + '@smithy/middleware-serde@4.0.5': dependencies: + '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 tslib: 2.8.1 @@ -13796,7 +13523,7 @@ snapshots: '@smithy/types': 4.2.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.0.2': + '@smithy/node-config-provider@4.1.1': dependencies: '@smithy/property-provider': 4.0.2 '@smithy/shared-ini-file-loader': 4.0.2 @@ -13852,10 +13579,10 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.2.2': + '@smithy/smithy-client@4.2.6': dependencies: - '@smithy/core': 3.3.1 - '@smithy/middleware-endpoint': 4.1.2 + '@smithy/core': 3.3.3 + '@smithy/middleware-endpoint': 4.1.6 '@smithy/middleware-stack': 4.0.2 '@smithy/protocol-http': 5.1.0 '@smithy/types': 4.2.0 @@ -13900,27 +13627,27 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.10': + '@smithy/util-defaults-mode-browser@4.0.14': dependencies: '@smithy/property-provider': 4.0.2 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.10': + '@smithy/util-defaults-mode-node@4.0.14': dependencies: - '@smithy/config-resolver': 4.1.0 - '@smithy/credential-provider-imds': 4.0.2 - '@smithy/node-config-provider': 4.0.2 + '@smithy/config-resolver': 4.1.2 + '@smithy/credential-provider-imds': 4.0.4 + '@smithy/node-config-provider': 4.1.1 '@smithy/property-provider': 4.0.2 - '@smithy/smithy-client': 4.2.2 + '@smithy/smithy-client': 4.2.6 '@smithy/types': 4.2.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.2': + '@smithy/util-endpoints@3.0.4': dependencies: - '@smithy/node-config-provider': 4.0.2 + '@smithy/node-config-provider': 4.1.1 '@smithy/types': 4.2.0 tslib: 2.8.1 @@ -14090,13 +13817,13 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/builder-vite@8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@storybook/builder-vite@8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@storybook/csf-plugin': 8.6.12(storybook@8.6.12(prettier@3.5.3)) browser-assert: 1.2.1 storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) '@storybook/components@8.6.12(storybook@8.6.12(prettier@3.5.3))': dependencies: @@ -14112,9 +13839,9 @@ snapshots: jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.1 + semver: 7.7.2 util: 0.12.5 - ws: 8.18.1 + ws: 8.18.2 optionalDependencies: prettier: 3.5.3 transitivePeerDependencies: @@ -14159,11 +13886,11 @@ snapshots: react-dom: 19.1.0(react@19.1.0) storybook: 8.6.12(prettier@3.5.3) - '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) - '@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + '@rollup/pluginutils': 5.1.4(rollup@4.40.2) + '@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.8.3) find-up: 5.0.0 magic-string: 0.30.17 @@ -14173,7 +13900,7 @@ snapshots: resolve: 1.22.10 storybook: 8.6.12(prettier@3.5.3) tsconfig-paths: 4.2.0 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) optionalDependencies: '@storybook/test': 8.6.12(storybook@8.6.12(prettier@3.5.3)) transitivePeerDependencies: @@ -14260,8 +13987,8 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.1 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -14271,8 +13998,8 @@ snapshots: '@testing-library/dom@8.20.1': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.1 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -14307,7 +14034,7 @@ snapshots: '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.1 '@testing-library/dom': 10.4.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -14356,10 +14083,10 @@ snapshots: '@trivago/prettier-plugin-sort-imports@5.2.2(prettier@3.5.3)': dependencies: - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 javascript-natural-sort: 0.7.1 lodash: 4.17.21 prettier: 3.5.3 @@ -14385,24 +14112,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@types/bcryptjs@2.4.6': {} @@ -14410,11 +14137,6 @@ snapshots: dependencies: '@types/node': 22.15.18 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - optional: true - '@types/doctrine@0.0.9': {} '@types/eslint-scope@3.7.7': @@ -14442,7 +14164,7 @@ snapshots: '@types/jsonwebtoken@9.0.9': dependencies: '@types/ms': 2.1.0 - '@types/node': 22.14.0 + '@types/node': 22.15.18 '@types/linkify-it@5.0.0': {} @@ -14470,27 +14192,19 @@ snapshots: '@types/node': 22.15.18 form-data: 4.0.2 - '@types/node@22.14.0': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.15.14': - dependencies: - undici-types: 6.21.0 - '@types/node@22.15.18': dependencies: undici-types: 6.21.0 '@types/nodemailer@6.4.17': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.15.18 '@types/normalize-package-data@2.4.4': {} '@types/papaparse@5.3.15': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.15.18 '@types/pg-pool@2.0.6': dependencies: @@ -14499,12 +14213,12 @@ snapshots: '@types/pg@8.6.1': dependencies: '@types/node': 22.15.18 - pg-protocol: 1.9.5 + pg-protocol: 1.10.0 pg-types: 2.2.0 '@types/qrcode@1.5.5': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.15.18 '@types/react-dom@19.1.5(@types/react@19.1.4)': dependencies: @@ -14614,7 +14328,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 optionalDependencies: typescript: 5.8.3 @@ -14627,7 +14341,7 @@ snapshots: '@typescript-eslint/types': 8.32.0 '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 typescript: 5.8.3 transitivePeerDependencies: @@ -14639,7 +14353,7 @@ snapshots: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 typescript: 5.8.3 transitivePeerDependencies: @@ -14655,11 +14369,6 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.30.1': - dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 - '@typescript-eslint/scope-manager@8.32.0': dependencies: '@typescript-eslint/types': 8.32.0 @@ -14674,7 +14383,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.8.3) - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -14686,7 +14395,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) '@typescript-eslint/utils': 8.32.0(eslint@8.57.0)(typescript@5.8.3) - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -14697,7 +14406,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -14708,8 +14417,6 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.30.1': {} - '@typescript-eslint/types@8.32.0': {} '@typescript-eslint/types@8.32.1': {} @@ -14718,10 +14425,10 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.1 + semver: 7.7.2 tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 @@ -14732,40 +14439,26 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 - debug: 4.4.0 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.32.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.32.0 '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -14775,11 +14468,11 @@ snapshots: dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -14795,7 +14488,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript @@ -14811,17 +14504,6 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.30.1(eslint@8.57.0)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) - eslint: 8.57.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.32.0(eslint@8.57.0)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) @@ -14854,11 +14536,6 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.30.1': - dependencies: - '@typescript-eslint/types': 8.30.1 - eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.32.0': dependencies: '@typescript-eslint/types': 8.32.0 @@ -14869,6 +14546,14 @@ snapshots: '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.0 + '@typespec/ts-http-runtime@0.2.2': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + '@ungap/structured-clone@1.3.0': {} '@unkey/api@0.33.1': @@ -14888,59 +14573,62 @@ snapshots: '@unkey/error': 0.2.0 zod: 3.24.4 - '@unrs/resolver-binding-darwin-arm64@1.6.2': + '@unrs/resolver-binding-darwin-arm64@1.7.2': optional: true - '@unrs/resolver-binding-darwin-x64@1.6.2': + '@unrs/resolver-binding-darwin-x64@1.7.2': optional: true - '@unrs/resolver-binding-freebsd-x64@1.6.2': + '@unrs/resolver-binding-freebsd-x64@1.7.2': optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.6.2': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.7.2': optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.6.2': + '@unrs/resolver-binding-linux-arm-musleabihf@1.7.2': optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.6.2': + '@unrs/resolver-binding-linux-arm64-gnu@1.7.2': optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.6.2': + '@unrs/resolver-binding-linux-arm64-musl@1.7.2': optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.6.2': + '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.6.2': + '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.6.2': + '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.6.2': + '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': optional: true - '@unrs/resolver-binding-linux-x64-musl@1.6.2': + '@unrs/resolver-binding-linux-x64-gnu@1.7.2': optional: true - '@unrs/resolver-binding-wasm32-wasi@1.6.2': + '@unrs/resolver-binding-linux-x64-musl@1.7.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.7.2': dependencies: '@napi-rs/wasm-runtime': 0.2.9 optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.6.2': + '@unrs/resolver-binding-win32-arm64-msvc@1.7.2': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.6.2': + '@unrs/resolver-binding-win32-ia32-msvc@1.7.2': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.6.2': + '@unrs/resolver-binding-win32-x64-msvc@1.7.2': optional: true - '@vercel/functions@2.0.2(@aws-sdk/credential-provider-web-identity@3.804.0(aws-crt@1.26.2))': + '@vercel/functions@2.0.2(@aws-sdk/credential-provider-web-identity@3.804.0)': optionalDependencies: - '@aws-sdk/credential-provider-web-identity': 3.804.0(aws-crt@1.26.2) + '@aws-sdk/credential-provider-web-identity': 3.804.0 '@vercel/og@0.6.8': dependencies: @@ -14948,10 +14636,10 @@ snapshots: satori: 0.12.2 yoga-wasm-web: 0.3.3 - '@vercel/style-guide@6.0.0(@next/eslint-plugin-next@15.3.2)(eslint@8.57.0)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@vercel/style-guide@6.0.0(@next/eslint-plugin-next@15.3.2)(eslint@8.57.0)(prettier@3.5.3)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@babel/core': 7.26.0 - '@babel/eslint-parser': 7.27.0(@babel/core@7.26.0)(eslint@8.57.0) + '@babel/core': 7.27.1 + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@8.57.0) '@rushstack/eslint-patch': 1.11.0 '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.8.3) @@ -14968,8 +14656,8 @@ snapshots: eslint-plugin-testing-library: 6.5.0(eslint@8.57.0)(typescript@5.8.3) eslint-plugin-tsdoc: 0.2.17 eslint-plugin-unicorn: 51.0.1(eslint@8.57.0) - eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) - prettier-plugin-packagejson: 2.5.10(prettier@3.5.3) + eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) + prettier-plugin-packagejson: 2.5.13(prettier@3.5.3) optionalDependencies: '@next/eslint-plugin-next': 15.3.2 eslint: 8.57.0 @@ -14982,22 +14670,22 @@ snapshots: - supports-color - vitest - '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.1 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.1.3(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@vitest/coverage-v8@3.1.3(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -15007,17 +14695,17 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vitest: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.1.44(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@vitest/eslint-plugin@1.1.44(@typescript-eslint/utils@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 optionalDependencies: typescript: 5.8.3 - vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vitest: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) '@vitest/expect@2.0.5': dependencies: @@ -15033,13 +14721,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1))': + '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.1.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) '@vitest/pretty-format@2.0.5': dependencies: @@ -15091,30 +14779,30 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@volar/language-core@2.4.12': + '@volar/language-core@2.4.13': dependencies: - '@volar/source-map': 2.4.12 + '@volar/source-map': 2.4.13 - '@volar/source-map@2.4.12': {} + '@volar/source-map@2.4.13': {} - '@volar/typescript@2.4.12': + '@volar/typescript@2.4.13': dependencies: - '@volar/language-core': 2.4.12 + '@volar/language-core': 2.4.13 path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.13': + '@vue/compiler-core@3.5.14': dependencies: - '@babel/parser': 7.27.0 - '@vue/shared': 3.5.13 + '@babel/parser': 7.27.2 + '@vue/shared': 3.5.14 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.13': + '@vue/compiler-dom@3.5.14': dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.14 + '@vue/shared': 3.5.14 '@vue/compiler-vue2@2.7.16': dependencies: @@ -15123,10 +14811,10 @@ snapshots: '@vue/language-core@2.2.0(typescript@5.8.3)': dependencies: - '@volar/language-core': 2.4.12 - '@vue/compiler-dom': 3.5.13 + '@volar/language-core': 2.4.13 + '@vue/compiler-dom': 3.5.14 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.14 alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -15134,7 +14822,7 @@ snapshots: optionalDependencies: typescript: 5.8.3 - '@vue/shared@3.5.13': {} + '@vue/shared@3.5.14': {} '@webassemblyjs/ast@1.14.1': dependencies: @@ -15258,7 +14946,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -15488,8 +15176,8 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.3): dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001715 + browserslist: 4.24.5 + caniuse-lite: 1.0.30001718 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -15500,22 +15188,6 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - aws-crt@1.26.2: - dependencies: - '@aws-sdk/util-utf8-browser': 3.259.0 - '@httptoolkit/websocket-stream': 6.0.1 - axios: 1.9.0 - buffer: 6.0.3 - crypto-js: 4.2.0 - mqtt: 4.3.8 - process: 0.11.10 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - optional: true - aws-ssl-profiles@1.1.2: {} axe-core@4.10.3: {} @@ -15530,9 +15202,9 @@ snapshots: axobject-query@4.1.0: {} - babel-plugin-transform-hook-names@1.0.2(@babel/core@7.26.10): + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.27.1): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 balanced-match@1.0.2: {} @@ -15581,7 +15253,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.4.1 + chalk: 5.0.1 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -15603,12 +15275,12 @@ snapshots: browser-assert@1.2.1: {} - browserslist@4.24.4: + browserslist@4.24.5: dependencies: - caniuse-lite: 1.0.30001715 - electron-to-chromium: 1.5.139 + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.154 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.24.5) bson@6.10.3: {} @@ -15697,7 +15369,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001715: {} + caniuse-lite@1.0.30001718: {} cfb@1.2.2: dependencies: @@ -15813,7 +15485,7 @@ snapshots: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.0) '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) transitivePeerDependencies: @@ -15863,12 +15535,6 @@ snapshots: commander@4.1.1: {} - commist@1.1.0: - dependencies: - leven: 2.1.0 - minimist: 1.2.8 - optional: true - commondir@1.0.1: {} compare-versions@6.1.1: {} @@ -15891,14 +15557,6 @@ snapshots: concat-map@0.0.1: {} - concat-stream@2.0.0: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - optional: true - concurrently@9.1.2: dependencies: chalk: 4.1.2 @@ -15930,14 +15588,11 @@ snapshots: dependencies: toggle-selection: 1.0.6 - core-js-compat@3.41.0: + core-js-compat@3.42.0: dependencies: - browserslist: 4.24.4 + browserslist: 4.24.5 - core-js@3.41.0: {} - - core-util-is@1.0.3: - optional: true + core-js@3.42.0: {} cosmiconfig@9.0.0(typescript@5.8.3): dependencies: @@ -15958,9 +15613,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crypto-js@4.2.0: - optional: true - css-background-parser@0.1.0: {} css-box-shadow@1.0.0-3: {} @@ -16000,7 +15652,7 @@ snapshots: cssstyle@4.3.1: dependencies: - '@asamuzakjp/css-color': 3.1.3 + '@asamuzakjp/css-color': 3.1.7 rrweb-cssom: 0.8.0 csstype@3.1.3: {} @@ -16052,7 +15704,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -16131,7 +15783,7 @@ snapshots: detect-indent@7.0.1: {} - detect-libc@2.0.3: {} + detect-libc@2.0.4: {} detect-newline@4.0.1: {} @@ -16204,29 +15856,13 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - optional: true - - duplexify@4.1.3: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 - optional: true - eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - electron-to-chromium@1.5.139: {} + electron-to-chromium@1.5.154: {} emoji-regex@10.4.0: {} @@ -16251,6 +15887,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.0: {} + env-paths@2.2.1: {} environment@1.1.0: {} @@ -16380,7 +16018,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.4): dependencies: - debug: 4.4.0 + debug: 4.4.1 esbuild: 0.25.4 transitivePeerDependencies: - supports-color @@ -16470,13 +16108,13 @@ snapshots: eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 + debug: 4.4.1 eslint: 8.57.0 get-tsconfig: 4.10.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.13 - unrs-resolver: 1.6.2 + unrs-resolver: 1.7.2 optionalDependencies: eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0) transitivePeerDependencies: @@ -16654,7 +16292,7 @@ snapshots: eslint-plugin-storybook@0.12.0(eslint@8.57.0)(typescript@5.8.3): dependencies: '@storybook/csf': 0.1.13 - '@typescript-eslint/utils': 8.30.1(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -16682,12 +16320,12 @@ snapshots: eslint-plugin-unicorn@51.0.1(eslint@8.57.0): dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) '@eslint/eslintrc': 2.1.4 ci-info: 4.2.0 clean-regexp: 1.0.0 - core-js-compat: 3.41.0 + core-js-compat: 3.42.0 eslint: 8.57.0 esquery: 1.6.0 indent-string: 4.0.0 @@ -16697,18 +16335,18 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.7.1 + semver: 7.7.2 strip-indent: 3.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)): + eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.8.3) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) - vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vitest: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript @@ -16731,7 +16369,7 @@ snapshots: eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 @@ -16742,7 +16380,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -16864,9 +16502,9 @@ snapshots: dependencies: strnum: 1.1.2 - fast-xml-parser@5.2.0: + fast-xml-parser@5.2.3: dependencies: - strnum: 2.0.5 + strnum: 2.1.1 fastest-stable-stringify@2.0.2: {} @@ -16953,7 +16591,7 @@ snapshots: framer-motion@12.10.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - motion-dom: 12.10.0 + motion-dom: 12.11.2 motion-utils: 12.9.4 tslib: 2.8.1 optionalDependencies: @@ -17057,8 +16695,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stdin@9.0.0: {} - get-stream@6.0.1: {} get-symbol-description@1.1.0: @@ -17075,7 +16711,7 @@ snapshots: dependencies: mem: 8.1.1 - git-hooks-list@3.2.0: {} + git-hooks-list@4.1.1: {} github-from-package@0.0.0: {} @@ -17098,7 +16734,7 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.1: + glob@11.0.2: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.0 @@ -17242,12 +16878,6 @@ snapshots: dependencies: libheif-js: 1.18.2 - help-me@3.0.0: - dependencies: - glob: 7.2.3 - readable-stream: 3.6.2 - optional: true - help-me@5.0.0: {} hex-rgb@4.3.0: {} @@ -17279,14 +16909,14 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - http-cache-semantics@4.1.1: + http-cache-semantics@4.2.0: optional: true http-proxy-agent@4.0.1: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color optional: true @@ -17294,28 +16924,28 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@5.0.0: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -17345,12 +16975,12 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.13.1: + import-in-the-middle@1.13.2: dependencies: acorn: 8.14.1 acorn-import-attributes: 1.9.5(acorn@8.14.1) cjs-module-lexer: 1.4.3 - module-details-from-path: 1.0.3 + module-details-from-path: 1.0.4 import-lazy@4.0.0: {} @@ -17434,7 +17064,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 is-callable@1.2.7: {} @@ -17565,9 +17195,6 @@ snapshots: dependencies: is-inside-container: 1.0.0 - isarray@1.0.0: - optional: true - isarray@2.0.5: {} isexe@2.0.0: {} @@ -17582,11 +17209,6 @@ snapshots: - supports-color - utf-8-validate - isomorphic-ws@4.0.1(ws@8.18.1): - dependencies: - ws: 8.18.1 - optional: true - isomorphic.js@0.2.5: {} istanbul-lib-coverage@3.2.2: {} @@ -17600,7 +17222,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 + debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -17666,9 +17288,6 @@ snapshots: js-md4@0.3.2: {} - js-sdsl@4.3.0: - optional: true - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -17690,7 +17309,7 @@ snapshots: https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.20 - parse5: 7.2.1 + parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -17700,7 +17319,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.1 + ws: 8.18.2 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -17750,7 +17369,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.1 + semver: 7.7.2 jsx-ast-utils@3.3.5: dependencies: @@ -17759,13 +17378,13 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - jwa@1.4.1: + jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jwa@2.0.0: + jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 @@ -17773,12 +17392,12 @@ snapshots: jws@3.2.2: dependencies: - jwa: 1.4.1 + jwa: 1.4.2 safe-buffer: 5.2.1 jws@4.0.0: dependencies: - jwa: 2.0.0 + jwa: 2.0.1 safe-buffer: 5.2.1 keyv@4.5.4: @@ -17799,9 +17418,6 @@ snapshots: leac@0.6.0: {} - leven@2.1.0: - optional: true - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -17809,58 +17425,12 @@ snapshots: lexical@0.31.0: {} - lib0@0.2.104: + lib0@0.2.108: dependencies: isomorphic.js: 0.2.5 libheif-js@1.18.2: {} - lightningcss-darwin-arm64@1.29.2: - optional: true - - lightningcss-darwin-x64@1.29.2: - optional: true - - lightningcss-freebsd-x64@1.29.2: - optional: true - - lightningcss-linux-arm-gnueabihf@1.29.2: - optional: true - - lightningcss-linux-arm64-gnu@1.29.2: - optional: true - - lightningcss-linux-arm64-musl@1.29.2: - optional: true - - lightningcss-linux-x64-gnu@1.29.2: - optional: true - - lightningcss-linux-x64-musl@1.29.2: - optional: true - - lightningcss-win32-arm64-msvc@1.29.2: - optional: true - - lightningcss-win32-x64-msvc@1.29.2: - optional: true - - lightningcss@1.29.2: - dependencies: - detect-libc: 2.0.3 - optionalDependencies: - lightningcss-darwin-arm64: 1.29.2 - lightningcss-darwin-x64: 1.29.2 - lightningcss-freebsd-x64: 1.29.2 - lightningcss-linux-arm-gnueabihf: 1.29.2 - lightningcss-linux-arm64-gnu: 1.29.2 - lightningcss-linux-arm64-musl: 1.29.2 - lightningcss-linux-x64-gnu: 1.29.2 - lightningcss-linux-x64-musl: 1.29.2 - lightningcss-win32-arm64-msvc: 1.29.2 - lightningcss-win32-x64-msvc: 1.29.2 - optional: true - lilconfig@3.1.3: {} linebreak@1.1.0: @@ -17878,14 +17448,14 @@ snapshots: dependencies: chalk: 5.4.1 commander: 13.1.0 - debug: 4.4.0 + debug: 4.4.1 lilconfig: 3.1.3 listr2: 8.3.3 micromatch: 4.0.8 nano-spawn: 1.0.1 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.7.1 + yaml: 2.8.0 transitivePeerDependencies: - supports-color @@ -17998,13 +17568,13 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 make-error@1.3.6: {} @@ -18014,7 +17584,7 @@ snapshots: dependencies: agentkeepalive: 4.6.0 cacache: 15.3.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-lambda: 1.0.1 @@ -18198,62 +17768,28 @@ snapshots: dependencies: obliterator: 1.6.1 - module-details-from-path@1.0.3: {} + module-details-from-path@1.0.4: {} mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 whatwg-url: 14.2.0 - mongodb@6.16.0(@aws-sdk/credential-providers@3.799.0(aws-crt@1.26.2))(socks@2.8.4): + mongodb@6.16.0(@aws-sdk/credential-providers@3.799.0)(socks@2.8.4): dependencies: '@mongodb-js/saslprep': 1.2.2 bson: 6.10.3 mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.799.0(aws-crt@1.26.2) + '@aws-sdk/credential-providers': 3.799.0 socks: 2.8.4 - motion-dom@12.10.0: + motion-dom@12.11.2: dependencies: motion-utils: 12.9.4 motion-utils@12.9.4: {} - mqtt-packet@6.10.0: - dependencies: - bl: 4.1.0 - debug: 4.4.0 - process-nextick-args: 2.0.1 - transitivePeerDependencies: - - supports-color - optional: true - - mqtt@4.3.8: - dependencies: - commist: 1.1.0 - concat-stream: 2.0.0 - debug: 4.4.0 - duplexify: 4.1.3 - help-me: 3.0.0 - inherits: 2.0.4 - lru-cache: 6.0.0 - minimist: 1.2.8 - mqtt-packet: 6.10.0 - number-allocator: 1.0.14 - pump: 3.0.2 - readable-stream: 3.6.2 - reinterval: 1.1.0 - rfdc: 1.4.1 - split2: 3.2.2 - ws: 7.5.10 - xtend: 4.0.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - ms@2.0.0: {} ms@2.1.3: {} @@ -18262,7 +17798,7 @@ snapshots: dependencies: '@tediousjs/connection-string': 0.5.0 commander: 11.1.0 - debug: 4.4.0 + debug: 4.4.1 rfdc: 1.4.1 tarn: 3.0.2 tedious: 18.6.1 @@ -18314,7 +17850,7 @@ snapshots: napi-build-utils@2.0.0: {} - napi-postinstall@0.1.5: {} + napi-postinstall@0.2.4: {} native-duplexpair@1.0.0: {} @@ -18329,15 +17865,15 @@ snapshots: next-auth@4.24.11(next@15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(nodemailer@7.0.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.1 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 next: 15.3.1(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) oauth: 0.9.15 openid-client: 5.7.1 - preact: 10.26.5 - preact-render-to-string: 5.2.6(preact@10.26.5) + preact: 10.26.6 + preact-render-to-string: 5.2.6(preact@10.26.6) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) uuid: 8.3.2 @@ -18358,7 +17894,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001715 + caniuse-lite: 1.0.30001718 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -18379,9 +17915,9 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-abi@3.74.0: + node-abi@3.75.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 node-addon-api@7.1.1: {} @@ -18410,7 +17946,7 @@ snapshots: nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.7.1 + semver: 7.7.2 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -18459,17 +17995,9 @@ snapshots: dependencies: boolbase: 1.0.0 - number-allocator@1.0.14: - dependencies: - debug: 4.4.0 - js-sdsl: 4.3.0 - transitivePeerDependencies: - - supports-color - optional: true - nwsapi@2.2.20: {} - oauth4webapi@3.5.0: {} + oauth4webapi@3.5.1: {} oauth@0.9.15: {} @@ -18544,7 +18072,7 @@ snapshots: dependencies: mimic-function: 5.0.1 - open@10.1.1: + open@10.1.2: dependencies: default-browser: 5.2.1 define-lazy-prop: 3.0.0 @@ -18573,7 +18101,7 @@ snapshots: openid-client@6.4.2: dependencies: jose: 6.0.10 - oauth4webapi: 3.5.0 + oauth4webapi: 3.5.1 optionator@0.9.4: dependencies: @@ -18638,14 +18166,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse5@7.2.1: + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.0 parseley@0.12.1: dependencies: @@ -18689,15 +18217,15 @@ snapshots: pg-cloudflare@1.2.5: optional: true - pg-connection-string@2.8.5: {} + pg-connection-string@2.9.0: {} pg-int8@1.0.1: {} - pg-pool@3.9.6(pg@8.15.6): + pg-pool@3.10.0(pg@8.15.6): dependencies: pg: 8.15.6 - pg-protocol@1.9.5: {} + pg-protocol@1.10.0: {} pg-types@2.2.0: dependencies: @@ -18709,9 +18237,9 @@ snapshots: pg@8.15.6: dependencies: - pg-connection-string: 2.8.5 - pg-pool: 3.9.6(pg@8.15.6) - pg-protocol: 1.9.5 + pg-connection-string: 2.9.0 + pg-pool: 3.10.0(pg@8.15.6) + pg-protocol: 1.10.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -18801,7 +18329,7 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.1 possible-typed-array-names@1.1.0: {} @@ -18820,7 +18348,7 @@ snapshots: postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 - yaml: 2.7.1 + yaml: 2.8.0 optionalDependencies: postcss: 8.5.3 ts-node: 10.9.2(@types/node@22.15.18)(typescript@5.8.3) @@ -18866,7 +18394,7 @@ snapshots: posthog-js@1.240.0: dependencies: - core-js: 3.41.0 + core-js: 3.42.0 fflate: 0.4.8 preact: 10.26.6 web-vitals: 4.2.4 @@ -18877,24 +18405,22 @@ snapshots: transitivePeerDependencies: - debug - preact-render-to-string@5.2.6(preact@10.26.5): + preact-render-to-string@5.2.6(preact@10.26.6): dependencies: - preact: 10.26.5 + preact: 10.26.6 pretty-format: 3.8.0 - preact@10.26.5: {} - preact@10.26.6: {} prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.3 + detect-libc: 2.0.4 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 + node-abi: 3.75.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 @@ -18903,10 +18429,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-packagejson@2.5.10(prettier@3.5.3): + prettier-plugin-packagejson@2.5.13(prettier@3.5.3): dependencies: - sort-package-json: 2.15.1 - synckit: 0.9.2 + sort-package-json: 3.2.1 + synckit: 0.11.5 optionalDependencies: prettier: 3.5.3 @@ -18937,7 +18463,7 @@ snapshots: prisma-json-types-generator@3.4.1(prisma@6.7.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@prisma/generator-helper': 6.7.0 + '@prisma/generator-helper': 6.8.0 prisma: 6.7.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 @@ -18954,9 +18480,6 @@ snapshots: prismjs@1.30.0: {} - process-nextick-args@2.0.1: - optional: true - process-warning@4.0.1: {} process@0.11.10: {} @@ -18978,7 +18501,7 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - protobufjs@7.5.0: + protobufjs@7.5.2: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -19089,9 +18612,9 @@ snapshots: react-docgen@7.1.1: dependencies: - '@babel/core': 7.26.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/core': 7.27.1 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 '@types/doctrine': 0.0.9 @@ -19109,7 +18632,7 @@ snapshots: react-error-boundary@3.1.4(react@19.1.0): dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.1 react: 19.1.0 react-fit@2.0.1(@types/react@19.1.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -19217,17 +18740,6 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - optional: true - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -19283,8 +18795,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} - regexp-tree@0.1.27: {} regexp.prototype.flags@1.5.4: @@ -19309,17 +18819,14 @@ snapshots: dependencies: jsesc: 0.5.0 - reinterval@1.1.0: - optional: true - require-directory@2.1.1: {} require-from-string@2.0.2: {} require-in-the-middle@7.5.2: dependencies: - debug: 4.4.0 - module-details-from-path: 1.0.3 + debug: 4.4.1 + module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: - supports-color @@ -19373,7 +18880,7 @@ snapshots: rimraf@6.0.1: dependencies: - glob: 11.0.1 + glob: 11.0.2 package-json-from-dist: 1.0.1 ripemd160@2.0.2: @@ -19406,37 +18913,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.35.0 fsevents: 2.3.3 - rollup@4.40.0: + rollup@4.40.2: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 + '@rollup/rollup-android-arm-eabi': 4.40.2 + '@rollup/rollup-android-arm64': 4.40.2 + '@rollup/rollup-darwin-arm64': 4.40.2 + '@rollup/rollup-darwin-x64': 4.40.2 + '@rollup/rollup-freebsd-arm64': 4.40.2 + '@rollup/rollup-freebsd-x64': 4.40.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 + '@rollup/rollup-linux-arm-musleabihf': 4.40.2 + '@rollup/rollup-linux-arm64-gnu': 4.40.2 + '@rollup/rollup-linux-arm64-musl': 4.40.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-musl': 4.40.2 + '@rollup/rollup-linux-s390x-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-musl': 4.40.2 + '@rollup/rollup-win32-arm64-msvc': 4.40.2 + '@rollup/rollup-win32-ia32-msvc': 4.40.2 + '@rollup/rollup-win32-x64-msvc': 4.40.2 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} rtl-css-js@1.16.1: dependencies: - '@babel/runtime': 7.27.0 + '@babel/runtime': 7.27.1 run-applescript@7.0.0: {} @@ -19526,7 +19033,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.1: {} + semver@7.7.2: {} seq-queue@0.0.5: {} @@ -19596,8 +19103,8 @@ snapshots: sharp@0.34.1: dependencies: color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.1 + detect-libc: 2.0.4 + semver: 7.7.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.1 '@img/sharp-darwin-x64': 0.34.1 @@ -19698,7 +19205,7 @@ snapshots: socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -19716,14 +19223,13 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@2.15.1: + sort-package-json@3.2.1: dependencies: detect-indent: 7.0.1 detect-newline: 4.0.1 - get-stdin: 9.0.0 - git-hooks-list: 3.2.0 + git-hooks-list: 4.1.1 is-plain-obj: 4.1.0 - semver: 7.7.1 + semver: 7.7.2 sort-object-keys: 1.1.3 tinyglobby: 0.2.13 @@ -19758,11 +19264,6 @@ snapshots: spdx-license-ids@3.0.21: {} - split2@3.2.2: - dependencies: - readable-stream: 3.6.2 - optional: true - split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -19838,9 +19339,6 @@ snapshots: - supports-color - utf-8-validate - stream-shift@1.0.3: - optional: true - streamsearch@1.1.0: {} string-argv@0.3.2: {} @@ -19917,11 +19415,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - optional: true - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -19952,12 +19445,12 @@ snapshots: stripe@16.12.0: dependencies: - '@types/node': 22.15.14 + '@types/node': 22.15.18 qs: 6.14.0 strnum@1.1.2: {} - strnum@2.0.5: {} + strnum@2.1.1: {} styled-jsx@5.1.6(react@19.1.0): dependencies: @@ -19996,9 +19489,9 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.9.2: + synckit@0.11.5: dependencies: - '@pkgr/core': 0.1.2 + '@pkgr/core': 0.2.4 tslib: 2.8.1 systeminformation@5.23.8: {} @@ -20063,7 +19556,7 @@ snapshots: tedious@18.6.1: dependencies: '@azure/core-auth': 1.9.0 - '@azure/identity': 4.9.0 + '@azure/identity': 4.10.0 '@azure/keyvault-keys': 4.9.0 '@js-joda/core': 5.6.5 '@types/node': 22.15.18 @@ -20309,17 +19802,14 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedarray@0.0.6: - optional: true - - typeorm@0.3.22(mongodb@6.16.0(@aws-sdk/credential-providers@3.799.0(aws-crt@1.26.2))(socks@2.8.4))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.15.6)(redis@4.7.0)(reflect-metadata@0.2.2)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)): + typeorm@0.3.22(mongodb@6.16.0(@aws-sdk/credential-providers@3.799.0)(socks@2.8.4))(mssql@11.0.1)(mysql2@3.14.1)(pg@8.15.6)(redis@4.7.0)(reflect-metadata@0.2.2)(sqlite3@5.1.7)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 3.17.0 app-root-path: 3.1.0 buffer: 6.0.3 dayjs: 1.11.13 - debug: 4.4.0 + debug: 4.4.1 dotenv: 16.5.0 glob: 10.4.5 reflect-metadata: 0.2.2 @@ -20329,7 +19819,7 @@ snapshots: uuid: 11.1.0 yargs: 17.7.2 optionalDependencies: - mongodb: 6.16.0(@aws-sdk/credential-providers@3.799.0(aws-crt@1.26.2))(socks@2.8.4) + mongodb: 6.16.0(@aws-sdk/credential-providers@3.799.0)(socks@2.8.4) mssql: 11.0.1 mysql2: 3.14.1 pg: 8.15.6 @@ -20401,30 +19891,31 @@ snapshots: acorn: 8.14.1 webpack-virtual-modules: 0.6.2 - unrs-resolver@1.6.2: + unrs-resolver@1.7.2: dependencies: - napi-postinstall: 0.1.5 + napi-postinstall: 0.2.4 optionalDependencies: - '@unrs/resolver-binding-darwin-arm64': 1.6.2 - '@unrs/resolver-binding-darwin-x64': 1.6.2 - '@unrs/resolver-binding-freebsd-x64': 1.6.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.6.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.6.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.6.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.6.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.6.2 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.6.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.6.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.6.2 - '@unrs/resolver-binding-linux-x64-musl': 1.6.2 - '@unrs/resolver-binding-wasm32-wasi': 1.6.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.6.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.6.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.6.2 + '@unrs/resolver-binding-darwin-arm64': 1.7.2 + '@unrs/resolver-binding-darwin-x64': 1.7.2 + '@unrs/resolver-binding-freebsd-x64': 1.7.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.7.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.7.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.7.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.7.2 + '@unrs/resolver-binding-linux-x64-musl': 1.7.2 + '@unrs/resolver-binding-wasm32-wasi': 1.7.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.7.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.7.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.7.2 - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.24.5): dependencies: - browserslist: 4.24.4 + browserslist: 4.24.5 escalade: 3.2.0 picocolors: 1.1.1 @@ -20481,13 +19972,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1): + vite-node@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.0 + debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -20502,26 +19993,26 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.3(@types/node@22.15.18)(rollup@4.40.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)): + vite-plugin-dts@4.5.3(@types/node@22.15.18)(rollup@4.40.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: - '@microsoft/api-extractor': 7.52.4(@types/node@22.15.18) - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) - '@volar/typescript': 2.4.12 + '@microsoft/api-extractor': 7.52.8(@types/node@22.15.18) + '@rollup/pluginutils': 5.1.4(rollup@4.40.2) + '@volar/typescript': 2.4.13 '@vue/language-core': 2.2.0(typescript@5.8.3) compare-versions: 6.1.1 - debug: 4.4.0 + debug: 4.4.1 kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 typescript: 5.8.3 optionalDependencies: - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-prerender-plugin@0.5.10(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)): + vite-prerender-plugin@0.5.10(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: kolorist: 1.8.0 magic-string: 0.30.17 @@ -20529,53 +20020,52 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: - debug: 4.4.0 + debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1): + vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.40.0 + rollup: 4.40.2 tinyglobby: 0.2.13 optionalDependencies: '@types/node': 22.15.18 fsevents: 2.3.3 jiti: 2.4.2 - lightningcss: 1.29.2 terser: 5.39.1 tsx: 4.19.4 - yaml: 2.7.1 + yaml: 2.8.0 - vitest-mock-extended@3.1.0(typescript@5.8.3)(vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)): + vitest-mock-extended@3.1.0(typescript@5.8.3)(vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)): dependencies: ts-essentials: 10.0.4(typescript@5.8.3) typescript: 5.8.3 - vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vitest: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) - vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1): + vitest@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(jsdom@26.1.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@vitest/expect': 3.1.3 - '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1)) + '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.1.3 '@vitest/runner': 3.1.3 '@vitest/snapshot': 3.1.3 '@vitest/spy': 3.1.3 '@vitest/utils': 3.1.3 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 @@ -20585,11 +20075,10 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) - vite-node: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.7.1) + vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.1.3(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.12 '@types/node': 22.15.18 jsdom: 26.1.0 transitivePeerDependencies: @@ -20648,7 +20137,7 @@ snapshots: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.1 - browserslist: 4.24.4 + browserslist: 4.24.5 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 es-module-lexer: 1.7.0 @@ -20779,10 +20268,7 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.10: - optional: true - - ws@8.18.1: {} + ws@8.18.2: {} xlsx@0.18.5: dependencies: @@ -20833,7 +20319,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.7.1: {} + yaml@2.8.0: {} yargs-parser@18.1.3: dependencies: @@ -20871,9 +20357,9 @@ snapshots: buffer-crc32: 0.2.13 pend: 1.2.0 - yjs@13.6.26: + yjs@13.6.27: dependencies: - lib0: 0.2.104 + lib0: 0.2.108 yn@3.1.1: {} diff --git a/turbo.json b/turbo.json index c0b51c6477..46855cc06d 100644 --- a/turbo.json +++ b/turbo.json @@ -170,7 +170,7 @@ "UNKEY_ROOT_KEY", "PROMETHEUS_ENABLED", "PROMETHEUS_EXPORTER_PORT", - "DISABLE_USER_MANAGEMENT" + "USER_MANAGEMENT_MINIMUM_ROLE" ], "outputs": ["dist/**", ".next/**"] },