@@ -29,7 +29,7 @@ export const VariablesLayout = ({
variant="outline"
onClick={() => onAddVariableClick()}
>
-
+
{children}
diff --git a/ui-v2/src/components/variables/variable-dialog/variable-dialog.tsx b/ui-v2/src/components/variables/variable-dialog/variable-dialog.tsx
index 35adc151c168..10e4e6caf6d7 100644
--- a/ui-v2/src/components/variables/variable-dialog/variable-dialog.tsx
+++ b/ui-v2/src/components/variables/variable-dialog/variable-dialog.tsx
@@ -1,16 +1,14 @@
+import type { components } from "@/api/prefect";
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogContent,
+ DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
- DialogDescription,
DialogTrigger,
} from "@/components/ui/dialog";
-import { zodResolver } from "@hookform/resolvers/zod";
-import { useForm } from "react-hook-form";
-import { z } from "zod";
import {
Form,
FormControl,
@@ -20,13 +18,15 @@ import {
FormMessage,
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
-import type { components } from "@/api/prefect";
-import type { JSONValue } from "@/lib/types";
-import { TagsInput } from "@/components/ui/tags-input";
import { JsonInput } from "@/components/ui/json-input";
-import { useEffect, useMemo } from "react";
-import { useCreateVariable, useUpdateVariable } from "@/hooks/variables";
+import { TagsInput } from "@/components/ui/tags-input";
import { useToast } from "@/hooks/use-toast";
+import { useCreateVariable, useUpdateVariable } from "@/hooks/variables";
+import type { JSONValue } from "@/lib/types";
+import { zodResolver } from "@hookform/resolvers/zod";
+import { useEffect, useMemo } from "react";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
const formSchema = z.object({
name: z.string().min(2, { message: "Name must be at least 2 characters" }),
@@ -93,6 +93,7 @@ export const VariableDialog = ({
toast({
title: "Variable updated",
});
+ onOpenChange(false);
},
onError: (error) => {
const message =
@@ -115,6 +116,7 @@ export const VariableDialog = ({
toast({
title: "Variable created",
});
+ onOpenChange(false);
},
onError: (error) => {
const message =
diff --git a/ui-v2/src/hooks/deployments/deployments.test.tsx b/ui-v2/src/hooks/deployments/deployments.test.tsx
new file mode 100644
index 000000000000..e3da587ece69
--- /dev/null
+++ b/ui-v2/src/hooks/deployments/deployments.test.tsx
@@ -0,0 +1,103 @@
+import { renderHook, waitFor } from "@testing-library/react";
+import { http, HttpResponse } from "msw";
+import { describe, expect, it } from "vitest";
+
+import {
+ type Deployment,
+ useCountDeployments,
+ usePaginateDeployments,
+} from "./index";
+
+import { createWrapper, server } from "@tests/utils";
+
+describe("deployments hooks", () => {
+ const seedDeployments = (): Deployment[] => [
+ {
+ id: "deployment-1",
+ created: "2021-01-01T00:00:00Z",
+ updated: "2021-01-01T00:00:00Z",
+ name: "Test Deployment 1",
+ version: "1.0",
+ tags: ["test"],
+ schedules: [],
+ work_queue_name: "default",
+ work_pool_name: "default",
+ parameter_openapi_schema: {},
+ status: "READY",
+ description: null,
+ storage_document_id: null,
+ infrastructure_document_id: null,
+ path: null,
+ entrypoint: null,
+ flow_id: "test-flow-id",
+ paused: false,
+ enforce_parameter_schema: false,
+ },
+ ];
+
+ const mockFetchDeploymentsAPI = (deployments: Array
) => {
+ server.use(
+ http.post("http://localhost:4200/api/deployments/paginate", () => {
+ return HttpResponse.json(deployments);
+ }),
+ );
+ };
+
+ const mockFetchDeploymentsCountAPI = (count: number) => {
+ server.use(
+ http.post("http://localhost:4200/api/deployments/count", () => {
+ return HttpResponse.json(count);
+ }),
+ );
+ };
+
+ const paginationFilter = {
+ page: 1,
+ limit: 10,
+ sort: "NAME_ASC" as const,
+ };
+
+ const countFilter = {
+ offset: 0,
+ sort: "NAME_ASC" as const,
+ };
+
+ /**
+ * Data Management:
+ * - Asserts deployment list data is fetched and stored correctly
+ */
+ it("stores paginated deployments data into the appropriate query", async () => {
+ // Mock API response
+ const mockList = seedDeployments();
+ mockFetchDeploymentsAPI(mockList);
+
+ // Initialize hook
+ const { result } = renderHook(
+ () => usePaginateDeployments(paginationFilter),
+ { wrapper: createWrapper() },
+ );
+
+ // Assert
+ await waitFor(() => expect(result.current.isSuccess).toBe(true));
+ expect(result.current.data).toEqual(mockList);
+ });
+
+ /**
+ * Data Management:
+ * - Asserts deployment count data is fetched and stored correctly
+ */
+ it("stores deployment count data into the appropriate query", async () => {
+ // Mock API response
+ const mockCount = 1;
+ mockFetchDeploymentsCountAPI(mockCount);
+
+ // Initialize hook
+ const { result } = renderHook(() => useCountDeployments(countFilter), {
+ wrapper: createWrapper(),
+ });
+
+ // Assert
+ await waitFor(() => expect(result.current.isSuccess).toBe(true));
+ expect(result.current.data).toEqual(mockCount);
+ });
+});
diff --git a/ui-v2/src/hooks/deployments/index.ts b/ui-v2/src/hooks/deployments/index.ts
new file mode 100644
index 000000000000..7b475b8cc6b6
--- /dev/null
+++ b/ui-v2/src/hooks/deployments/index.ts
@@ -0,0 +1,193 @@
+import type { components } from "@/api/prefect";
+import { getQueryService } from "@/api/service";
+import {
+ type QueryClient,
+ queryOptions,
+ useSuspenseQuery,
+} from "@tanstack/react-query";
+
+export type Deployment = components["schemas"]["DeploymentResponse"];
+export type DeploymentsFilter =
+ components["schemas"]["Body_read_deployments_deployments_filter_post"];
+export type DeploymentsPaginationFilter =
+ components["schemas"]["Body_paginate_deployments_deployments_paginate_post"];
+
+/**
+ * Query key factory for deployments-related queries
+ *
+ * @property {function} all - Returns base key for all deployment queries
+ * @property {function} lists - Returns key for all list-type deployment queries
+ * @property {function} list - Generates key for specific filtered deployment queries
+ * @property {function} counts - Returns key for all count-type deployment queries
+ * @property {function} count - Generates key for specific filtered count queries
+ *
+ * ```
+ * all => ['deployments']
+ * lists => ['deployments', 'list']
+ * list => ['deployments', 'list', { ...filter }]
+ * counts => ['deployments', 'counts']
+ * count => ['deployments', 'counts', { ...filter }]
+ * ```
+ */
+export const queryKeyFactory = {
+ all: () => ["deployments"] as const,
+ lists: () => [...queryKeyFactory.all(), "list"] as const,
+ list: (filter: DeploymentsFilter | DeploymentsPaginationFilter) =>
+ [...queryKeyFactory.lists(), filter] as const,
+ counts: () => [...queryKeyFactory.all(), "counts"] as const,
+ count: (filter: DeploymentsFilter) =>
+ [...queryKeyFactory.counts(), filter] as const,
+};
+
+// ----------------------------
+// Query Options Factories
+// ----------------------------
+
+/**
+ * Builds a query configuration for fetching paginated deployments
+ *
+ * @param filter - Pagination and filter options including:
+ * - page: Page number to fetch (default: 1)
+ * - limit: Number of items per page (default: 10)
+ * - sort: Sort order for results (default: "NAME_ASC")
+ * - deployments: Optional deployment-specific filters
+ * @returns Query configuration object for use with TanStack Query
+ *
+ * @example
+ * ```ts
+ * const query = buildPaginateDeploymentsQuery({
+ * page: 2,
+ * limit: 25,
+ * sort: "CREATED_DESC"
+ * });
+ * ```
+ */
+export const buildPaginateDeploymentsQuery = (
+ filter: DeploymentsPaginationFilter = {
+ page: 1,
+ limit: 10,
+ sort: "NAME_ASC",
+ },
+) =>
+ queryOptions({
+ queryKey: queryKeyFactory.list(filter),
+ queryFn: async () => {
+ const res = await getQueryService().POST("/deployments/paginate", {
+ body: filter,
+ });
+ return res.data ?? [];
+ },
+ });
+
+/**
+ * Builds a query configuration for counting deployments based on filter criteria
+ *
+ * @param filter - Filter options for the deployments count query including:
+ * - offset: Number of items to skip (default: 0)
+ * - sort: Sort order for results (default: "NAME_ASC")
+ * - deployments: Optional deployment-specific filters
+ * @returns Query configuration object for use with TanStack Query
+ *
+ * @example
+ * ```ts
+ * const query = buildCountDeploymentsQuery({
+ * offset: 0,
+ * limit: 10,
+ * sort: "NAME_ASC",
+ * deployments: {
+ * name: { like_: "my-deployment" }
+ * }
+ * });
+ * ```
+ */
+export const buildCountDeploymentsQuery = (
+ filter: DeploymentsFilter = { offset: 0, sort: "NAME_ASC" },
+) =>
+ queryOptions({
+ queryKey: queryKeyFactory.list(filter),
+ queryFn: async () => {
+ const res = await getQueryService().POST("/deployments/count", {
+ body: filter,
+ });
+ return res.data ?? [];
+ },
+ });
+
+// ----------------------------
+// Queries
+// ----------------------------
+
+/**
+ * Hook for fetching paginated deployments with suspense
+ *
+ * @param filter - Pagination and filter options for the deployments query
+ * @returns SuspenseQueryResult containing the paginated deployments data
+ *
+ * @example
+ * ```ts
+ * const { data: deployments } = usePaginateDeployments({
+ * page: 1,
+ * limit: 25,
+ * sort: "NAME_ASC",
+ * deployments: {
+ * name: { like_: "my-deployment" }
+ * }
+ * });
+ * ```
+ */
+export const usePaginateDeployments = (
+ filter: DeploymentsPaginationFilter = {
+ page: 1,
+ limit: 10,
+ sort: "NAME_ASC",
+ },
+) => useSuspenseQuery(buildPaginateDeploymentsQuery(filter));
+
+/**
+ * Data loader for the usePaginateDeployments hook, used by TanStack Router
+ * Prefetches paginated deployments data
+ *
+ * @param deps - Filter options to use for prefetching deployments
+ * @param context - Router context containing queryClient
+ * @returns Promise that resolves when deployments data is prefetched
+ */
+usePaginateDeployments.loader = ({
+ context,
+ deps,
+}: {
+ deps: DeploymentsPaginationFilter;
+ context: { queryClient: QueryClient };
+}) => context.queryClient.ensureQueryData(buildPaginateDeploymentsQuery(deps));
+
+/**
+ * Hook for fetching the count of deployments based on filter criteria with suspense
+ *
+ * @param filter - Filter options for the deployments count query
+ * @returns SuspenseQueryResult containing the count of deployments
+ *
+ * @example
+ * ```ts
+ * const { data: count } = useCountDeployments({
+ * deployments: { name: { like_: "my-deployment" } }
+ * });
+ * ```
+ */
+export const useCountDeployments = (
+ filter: DeploymentsFilter = { offset: 0, sort: "NAME_ASC" },
+) => useSuspenseQuery(buildCountDeploymentsQuery(filter));
+
+/**
+ * Data loader for the useCountDeployments hook, used by TanStack Router
+ * Prefetches count of deployments
+ *
+ * @param deps - Filter options to use for prefetching deployments
+ * @param context - Router context containing queryClient
+ * @returns Promise that resolves when deployments data is prefetched
+ */
+useCountDeployments.loader = ({
+ context,
+ deps,
+}: {
+ deps: DeploymentsFilter;
+ context: { queryClient: QueryClient };
+}) => context.queryClient.ensureQueryData(buildCountDeploymentsQuery(deps));
diff --git a/ui-v2/src/hooks/global-concurrency-limits.test.tsx b/ui-v2/src/hooks/global-concurrency-limits.test.tsx
new file mode 100644
index 000000000000..8d86ac261d8a
--- /dev/null
+++ b/ui-v2/src/hooks/global-concurrency-limits.test.tsx
@@ -0,0 +1,247 @@
+import { QueryClient } from "@tanstack/react-query";
+import { act, renderHook, waitFor } from "@testing-library/react";
+import { createWrapper, server } from "@tests/utils";
+import { http, HttpResponse } from "msw";
+import { describe, expect, it } from "vitest";
+
+import {
+ type GlobalConcurrencyLimit,
+ queryKeyFactory,
+ useCreateGlobalConcurrencyLimit,
+ useDeleteGlobalConcurrencyLimit,
+ useListGlobalConcurrencyLimits,
+ useUpdateGlobalConcurrencyLimit,
+} from "./global-concurrency-limits";
+
+describe("global concurrency limits hooks", () => {
+ const seedGlobalConcurrencyLimits = () => [
+ {
+ id: "0",
+ created: "2021-01-01T00:00:00Z",
+ updated: "2021-01-01T00:00:00Z",
+ active: false,
+ name: "global concurrency limit 0",
+ limit: 0,
+ active_slots: 0,
+ slot_decay_per_second: 0,
+ },
+ ];
+
+ const mockFetchGlobalConcurrencyLimitsAPI = (
+ globalConcurrencyLimits: Array,
+ ) => {
+ server.use(
+ http.post(
+ "http://localhost:4200/api/v2/concurrency_limits/filter",
+ () => {
+ return HttpResponse.json(globalConcurrencyLimits);
+ },
+ ),
+ );
+ };
+
+ const filter = {
+ offset: 0,
+ };
+
+ /**
+ * Data Management:
+ * - Asserts global concurrency limit list data is fetched based on the APIs invoked for the hook
+ */
+ it("is stores list data into the appropriate list query when using useQuery()", async () => {
+ // ------------ Mock API requests when cache is empty
+ const mockList = seedGlobalConcurrencyLimits();
+ mockFetchGlobalConcurrencyLimitsAPI(mockList);
+
+ // ------------ Initialize hooks to test
+ const { result } = renderHook(
+ () => useListGlobalConcurrencyLimits(filter),
+ { wrapper: createWrapper() },
+ );
+
+ // ------------ Assert
+ await waitFor(() => expect(result.current.isSuccess).toBe(true));
+ expect(result.current.data).toEqual(mockList);
+ });
+
+ /**
+ * Data Management:
+ * - Asserts global concurrency limit calls delete API and refetches updated list
+ */
+ it("useDeleteGlobalConcurrencyLimit() invalidates cache and fetches updated value", async () => {
+ const ID_TO_DELETE = "0";
+ const queryClient = new QueryClient();
+
+ // ------------ Mock API requests after queries are invalidated
+ const mockData = seedGlobalConcurrencyLimits().filter(
+ (limit) => limit.id !== ID_TO_DELETE,
+ );
+ mockFetchGlobalConcurrencyLimitsAPI(mockData);
+
+ // ------------ Initialize cache
+ queryClient.setQueryData(
+ queryKeyFactory.list(filter),
+ seedGlobalConcurrencyLimits(),
+ );
+
+ // ------------ Initialize hooks to test
+ const { result: useListGlobalConcurrencyLimitsResult } = renderHook(
+ () => useListGlobalConcurrencyLimits(filter),
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ const { result: useDeleteGlobalConcurrencyLimitResult } = renderHook(
+ useDeleteGlobalConcurrencyLimit,
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ // ------------ Invoke mutation
+ act(() =>
+ useDeleteGlobalConcurrencyLimitResult.current.deleteGlobalConcurrencyLimit(
+ ID_TO_DELETE,
+ ),
+ );
+
+ // ------------ Assert
+ await waitFor(() =>
+ expect(useDeleteGlobalConcurrencyLimitResult.current.isSuccess).toBe(
+ true,
+ ),
+ );
+ expect(useListGlobalConcurrencyLimitsResult.current.data).toHaveLength(0);
+ });
+
+ /**
+ * Data Management:
+ * - Asserts create mutation API is called.
+ * - Upon create mutation API being called, cache is invalidated and asserts cache invalidation APIS are called
+ */
+ it("useCreateGlobalConcurrencyLimit() invalidates cache and fetches updated value", async () => {
+ const queryClient = new QueryClient();
+ const MOCK_NEW_LIMIT_ID = "1";
+ const MOCK_NEW_LIMIT = {
+ active: true,
+ active_slots: 0,
+ denied_slots: 0,
+ limit: 0,
+ name: "global concurrency limit 1",
+ slot_decay_per_second: 0,
+ };
+
+ // ------------ Mock API requests after queries are invalidated
+ const NEW_LIMIT_DATA = {
+ ...MOCK_NEW_LIMIT,
+ id: MOCK_NEW_LIMIT_ID,
+ created: "2021-01-01T00:00:00Z",
+ updated: "2021-01-01T00:00:00Z",
+ active_slots: 0,
+ slot_decay_per_second: 0,
+ };
+
+ const mockData = [...seedGlobalConcurrencyLimits(), NEW_LIMIT_DATA];
+ mockFetchGlobalConcurrencyLimitsAPI(mockData);
+
+ // ------------ Initialize cache
+ queryClient.setQueryData(
+ queryKeyFactory.list(filter),
+ seedGlobalConcurrencyLimits(),
+ );
+
+ // ------------ Initialize hooks to test
+ const { result: useListGlobalConcurrencyLimitsResult } = renderHook(
+ () => useListGlobalConcurrencyLimits(filter),
+ { wrapper: createWrapper({ queryClient }) },
+ );
+ const { result: useCreateGlobalConcurrencyLimitResult } = renderHook(
+ useCreateGlobalConcurrencyLimit,
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ // ------------ Invoke mutation
+ act(() =>
+ useCreateGlobalConcurrencyLimitResult.current.createGlobalConcurrencyLimit(
+ MOCK_NEW_LIMIT,
+ ),
+ );
+
+ // ------------ Assert
+ await waitFor(() =>
+ expect(useCreateGlobalConcurrencyLimitResult.current.isSuccess).toBe(
+ true,
+ ),
+ );
+ expect(useListGlobalConcurrencyLimitsResult.current.data).toHaveLength(2);
+ const newLimit = useListGlobalConcurrencyLimitsResult.current.data?.find(
+ (limit) => limit.id === MOCK_NEW_LIMIT_ID,
+ );
+ expect(newLimit).toMatchObject(NEW_LIMIT_DATA);
+ });
+
+ /**
+ * Data Management:
+ * - Asserts update mutation API is called.
+ * - Upon update mutation API being called, cache invalidates global concurrency limit details cache
+ */
+ it("useUpdateGlobalConcurrencyLimit() invalidates cache and fetches updated value", async () => {
+ const queryClient = new QueryClient();
+ const MOCK_UPDATE_LIMIT_ID = "0";
+ const UPDATED_LIMIT_BODY = {
+ active: true,
+ active_slots: 0,
+ denied_slots: 0,
+ limit: 0,
+ name: "global concurrency limit updated",
+ slot_decay_per_second: 0,
+ };
+ const UPDATED_LIMIT = {
+ ...UPDATED_LIMIT_BODY,
+ id: MOCK_UPDATE_LIMIT_ID,
+ };
+
+ // ------------ Mock API requests after queries are invalidated
+ const mockData = seedGlobalConcurrencyLimits().map((limit) =>
+ limit.id === MOCK_UPDATE_LIMIT_ID ? UPDATED_LIMIT : limit,
+ );
+ mockFetchGlobalConcurrencyLimitsAPI(mockData);
+
+ // ------------ Initialize cache
+
+ queryClient.setQueryData(
+ queryKeyFactory.list(filter),
+ seedGlobalConcurrencyLimits(),
+ );
+
+ // ------------ Initialize hooks to test
+ const { result: useListGlobalConcurrencyLimitsResult } = renderHook(
+ () => useListGlobalConcurrencyLimits(filter),
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ const { result: useUpdateGlobalConcurrencyLimitResult } = renderHook(
+ useUpdateGlobalConcurrencyLimit,
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ // ------------ Invoke mutation
+ act(() =>
+ useUpdateGlobalConcurrencyLimitResult.current.updateGlobalConcurrencyLimit(
+ {
+ id_or_name: MOCK_UPDATE_LIMIT_ID,
+ ...UPDATED_LIMIT_BODY,
+ },
+ ),
+ );
+
+ // ------------ Assert
+ await waitFor(() =>
+ expect(useUpdateGlobalConcurrencyLimitResult.current.isSuccess).toBe(
+ true,
+ ),
+ );
+
+ const limit = useListGlobalConcurrencyLimitsResult.current.data?.find(
+ (limit) => limit.id === MOCK_UPDATE_LIMIT_ID,
+ );
+ expect(limit).toMatchObject(UPDATED_LIMIT);
+ });
+});
diff --git a/ui-v2/src/hooks/global-concurrency-limits.ts b/ui-v2/src/hooks/global-concurrency-limits.ts
new file mode 100644
index 000000000000..8fbd00e32475
--- /dev/null
+++ b/ui-v2/src/hooks/global-concurrency-limits.ts
@@ -0,0 +1,197 @@
+import type { components } from "@/api/prefect";
+import { getQueryService } from "@/api/service";
+import {
+ queryOptions,
+ useMutation,
+ useQueryClient,
+ useSuspenseQuery,
+} from "@tanstack/react-query";
+
+export type GlobalConcurrencyLimit =
+ components["schemas"]["GlobalConcurrencyLimitResponse"];
+export type GlobalConcurrencyLimitsFilter =
+ components["schemas"]["Body_read_all_concurrency_limits_v2_v2_concurrency_limits_filter_post"];
+
+/**
+ * ```
+ * ๐๏ธ Global concurrency limits queries construction ๐ท
+ * all => ['global-concurrency-limits'] // key to match ['global-concurrency-limits', ...
+ * list => ['global-concurrency-limits', 'list'] // key to match ['global-concurrency-limits', 'list', ...
+ * ['global-concurrency-limits', 'list', { ...filter1 }]
+ * ['global-concurrency-limits', 'list', { ...filter2 }]
+ * ```
+ * */
+export const queryKeyFactory = {
+ all: () => ["global-concurrency-limits"] as const,
+ lists: () => [...queryKeyFactory.all(), "list"] as const,
+ list: (filter: GlobalConcurrencyLimitsFilter) =>
+ [...queryKeyFactory.lists(), filter] as const,
+};
+
+// ----- ๐ Queries ๐๏ธ
+// ----------------------------
+export const buildListGlobalConcurrencyLimitsQuery = (
+ filter: GlobalConcurrencyLimitsFilter = { offset: 0 },
+) =>
+ queryOptions({
+ queryKey: queryKeyFactory.list(filter),
+ queryFn: async () => {
+ const res = await getQueryService().POST(
+ "/v2/concurrency_limits/filter",
+ { body: filter },
+ );
+ return res.data ?? [];
+ },
+ });
+
+/**
+ *
+ * @param filter
+ * @returns list of global concurrency limits as a SuspenseQueryResult object
+ */
+
+export const useListGlobalConcurrencyLimits = (
+ filter: GlobalConcurrencyLimitsFilter = { offset: 0 },
+) => useSuspenseQuery(buildListGlobalConcurrencyLimitsQuery(filter));
+
+// ----- โ๐ผ Mutations ๐๏ธ
+// ----------------------------
+
+/**
+ * Hook for deleting a global concurrency limit
+ *
+ * @returns Mutation object for deleting a global concurrency limit with loading/error states and trigger function
+ *
+ * @example
+ * ```ts
+ * const { deleteGlobalConcurrencyLimit } = useDeleteGlobalConcurrencyLimit();
+ *
+ * // Delete a global concurrency limit by id or name
+ * deleteGlobalConcurrencyLimit('id-to-delete', {
+ * onSuccess: () => {
+ * // Handle successful deletion
+ * },
+ * onError: (error) => {
+ * console.error('Failed to delete global concurrency limit:', error);
+ * }
+ * });
+ * ```
+ */
+export const useDeleteGlobalConcurrencyLimit = () => {
+ const queryClient = useQueryClient();
+ const { mutate: deleteGlobalConcurrencyLimit, ...rest } = useMutation({
+ mutationFn: (id_or_name: string) =>
+ getQueryService().DELETE("/v2/concurrency_limits/{id_or_name}", {
+ params: { path: { id_or_name } },
+ }),
+ onSuccess: () => {
+ // After a successful deletion, invalidate the listing queries only to refetch
+ return queryClient.invalidateQueries({
+ queryKey: queryKeyFactory.lists(),
+ });
+ },
+ });
+ return {
+ deleteGlobalConcurrencyLimit,
+ ...rest,
+ };
+};
+
+/**
+ * Hook for creating a new global concurrency limit
+ *
+ * @returns Mutation object for creating a global concurrency limit with loading/error states and trigger function
+ *
+ * @example
+ * ```ts
+ * const { createGlobalConcurrencyLimit, isLoading } = useCreateGlobalConcurrencyLimit();
+ *
+ * // Create a new global concurrency limit
+ * createGlobalConcurrencyLimit({
+ * active: true
+ * limit: 0
+ * name: "my limit"
+ * slot_decay_per_second: 0
+ * }, {
+ * onSuccess: () => {
+ * // Handle successful creation
+ * console.log('Global concurrency limit created successfully');
+ * },
+ * onError: (error) => {
+ * // Handle error
+ * console.error('Failed to create global concurrency limit:', error);
+ * }
+ * });
+ * ```
+ */
+export const useCreateGlobalConcurrencyLimit = () => {
+ const queryClient = useQueryClient();
+ const { mutate: createGlobalConcurrencyLimit, ...rest } = useMutation({
+ mutationFn: (body: components["schemas"]["ConcurrencyLimitV2Create"]) =>
+ getQueryService().POST("/v2/concurrency_limits/", {
+ body,
+ }),
+ onSuccess: () => {
+ // After a successful creation, invalidate the listing queries only to refetch
+ return queryClient.invalidateQueries({
+ queryKey: queryKeyFactory.lists(),
+ });
+ },
+ });
+ return {
+ createGlobalConcurrencyLimit,
+ ...rest,
+ };
+};
+
+type GlobalConcurrencyLimitUpdateWithId =
+ components["schemas"]["ConcurrencyLimitV2Update"] & {
+ id_or_name: string;
+ };
+
+/**
+ * Hook for updating an existing global concurrency limit
+ *
+ * @returns Mutation object for updating a global concurrency limit with loading/error states and trigger function
+ *
+ * @example
+ * ```ts
+ * const { udateGlobalConcurrencyLimit } = useUpdateGlobalConcurrencyLimit();
+ *
+ * // Update an existing global concurrency limit
+ * updateGlobalConcurrencyLimit({
+ * id_or_name: "1",
+ * active: true
+ * limit: 0
+ * name: "my limit"
+ * slot_decay_per_second: 0
+ * }, {
+ * onSuccess: () => {
+ * // Handle successful update
+ * },
+ * onError: (error) => {
+ * console.error('Failed to update global concurrency limit:', error);
+ * }
+ * });
+ * ```
+ */
+export const useUpdateGlobalConcurrencyLimit = () => {
+ const queryClient = useQueryClient();
+ const { mutate: updateGlobalConcurrencyLimit, ...rest } = useMutation({
+ mutationFn: ({ id_or_name, ...body }: GlobalConcurrencyLimitUpdateWithId) =>
+ getQueryService().PATCH("/v2/concurrency_limits/{id_or_name}", {
+ body,
+ params: { path: { id_or_name } },
+ }),
+ onSuccess: () => {
+ // After a successful creation, invalidate lists queries
+ return queryClient.invalidateQueries({
+ queryKey: queryKeyFactory.lists(),
+ });
+ },
+ });
+ return {
+ updateGlobalConcurrencyLimit,
+ ...rest,
+ };
+};
diff --git a/ui-v2/src/hooks/task-run-concurrency-limits.test.tsx b/ui-v2/src/hooks/task-run-concurrency-limits.test.tsx
new file mode 100644
index 000000000000..f0aa58522b8d
--- /dev/null
+++ b/ui-v2/src/hooks/task-run-concurrency-limits.test.tsx
@@ -0,0 +1,248 @@
+import { QueryClient } from "@tanstack/react-query";
+import { act, renderHook, waitFor } from "@testing-library/react";
+import { createWrapper, server } from "@tests/utils";
+import { http, HttpResponse } from "msw";
+import { describe, expect, it } from "vitest";
+import {
+ type TaskRunConcurrencyLimit,
+ queryKeyFactory,
+ useCreateTaskRunConcurrencyLimit,
+ useDeleteTaskRunConcurrencyLimit,
+ useGetTaskRunConcurrencyLimit,
+ useListTaskRunConcurrencyLimits,
+ useResetTaskRunConcurrencyLimitTag,
+} from "./task-run-concurrency-limits";
+
+describe("task run concurrency limits hooks", () => {
+ const seedData = () => [
+ {
+ id: "0",
+ created: "2021-01-01T00:00:00Z",
+ updated: "2021-01-01T00:00:00Z",
+ tag: "my tag 0",
+ concurrency_limit: 1,
+ active_slots: [] as Array,
+ },
+ ];
+
+ const mockFetchDetailsAPI = (data: TaskRunConcurrencyLimit) => {
+ server.use(
+ http.get("http://localhost:4200/api/concurrency_limits/:id", () => {
+ return HttpResponse.json(data);
+ }),
+ );
+ };
+
+ const mockFetchListAPI = (data: Array) => {
+ server.use(
+ http.post("http://localhost:4200/api/concurrency_limits/filter", () => {
+ return HttpResponse.json(data);
+ }),
+ );
+ };
+
+ const mockCreateAPI = (data: TaskRunConcurrencyLimit) => {
+ server.use(
+ http.post("http://localhost:4200/api/concurrency_limits/", () => {
+ return HttpResponse.json(data, { status: 201 });
+ }),
+ );
+ };
+
+ const filter = {
+ offset: 0,
+ };
+
+ /**
+ * Data Management:
+ * - Asserts task run concurrency limit list data is fetched based on the APIs invoked for the hook
+ */
+ it("useListTaskRunConcurrencyLimits() stores list data into the appropriate list query", async () => {
+ // ------------ Mock API requests when cache is empty
+ const mockList = seedData();
+ mockFetchListAPI(seedData());
+
+ // ------------ Initialize hooks to test
+ const { result } = renderHook(
+ () => useListTaskRunConcurrencyLimits(filter),
+ { wrapper: createWrapper({}) },
+ );
+
+ // ------------ Assert
+ await waitFor(() => expect(result.current.isSuccess).toBe(true));
+ expect(result.current.data).toEqual(mockList);
+ });
+
+ /**
+ * Data Management:
+ * - Asserts task run concurrency limit detail data is fetched based on the APIs invoked for the hook
+ */
+ it("useGetTaskRunConcurrencyLimit() stores details data into the appropriate details query", async () => {
+ // ------------ Mock API requests when cache is empty
+ const mockData = seedData()[0];
+ mockFetchDetailsAPI(mockData);
+
+ // ------------ Initialize hooks to test
+ const { result } = renderHook(
+ () => useGetTaskRunConcurrencyLimit(mockData.id),
+ { wrapper: createWrapper({}) },
+ );
+
+ // ------------ Assert
+ await waitFor(() => expect(result.current.isSuccess).toBe(true));
+ expect(result.current.data).toMatchObject(mockData);
+ });
+
+ /**
+ * Data Management:
+ * - Asserts task run concurrency limit calls delete API and refetches updated list
+ */
+ it("useDeleteTaskRunConcurrencyLimit() invalidates cache and fetches updated value", async () => {
+ const ID_TO_DELETE = "0";
+ const queryClient = new QueryClient();
+
+ // ------------ Mock API requests after queries are invalidated
+ const mockData = seedData().filter((limit) => limit.id !== ID_TO_DELETE);
+ mockFetchListAPI(mockData);
+
+ // ------------ Initialize cache
+ queryClient.setQueryData(queryKeyFactory.list(filter), seedData());
+
+ // ------------ Initialize hooks to test
+ const { result: useListTaskRunConcurrencyLimitsResult } = renderHook(
+ () => useListTaskRunConcurrencyLimits(filter),
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ const { result: useDeleteTaskRunConcurrencyLimitResult } = renderHook(
+ useDeleteTaskRunConcurrencyLimit,
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ // ------------ Invoke mutation
+ act(() =>
+ useDeleteTaskRunConcurrencyLimitResult.current.deleteTaskRunConcurrencyLimit(
+ ID_TO_DELETE,
+ ),
+ );
+
+ // ------------ Assert
+ await waitFor(() =>
+ expect(useDeleteTaskRunConcurrencyLimitResult.current.isSuccess).toBe(
+ true,
+ ),
+ );
+ expect(useListTaskRunConcurrencyLimitsResult.current.data).toHaveLength(0);
+ });
+
+ /**
+ * Data Management:
+ * - Asserts create mutation API is called.
+ * - Upon create mutation API being called, cache is invalidated and asserts cache invalidation APIS are called
+ */
+ it("useCreateTaskRunConcurrencyLimit() invalidates cache and fetches updated value", async () => {
+ const queryClient = new QueryClient();
+ const MOCK_NEW_DATA_ID = "1";
+ const MOCK_NEW_DATA = {
+ tag: "my tag 1",
+ concurrency_limit: 2,
+ active_slots: [],
+ };
+
+ // ------------ Mock API requests after queries are invalidated
+ const NEW_LIMIT_DATA = {
+ ...MOCK_NEW_DATA,
+ id: MOCK_NEW_DATA_ID,
+ created: "2021-01-01T00:00:00Z",
+ updated: "2021-01-01T00:00:00Z",
+ };
+
+ const mockData = [...seedData(), NEW_LIMIT_DATA];
+ mockFetchListAPI(mockData);
+ mockCreateAPI(NEW_LIMIT_DATA);
+
+ // ------------ Initialize cache
+ queryClient.setQueryData(queryKeyFactory.list(filter), seedData());
+
+ // ------------ Initialize hooks to test
+ const { result: useListTaskRunConcurrencyLimitsResult } = renderHook(
+ () => useListTaskRunConcurrencyLimits(filter),
+ { wrapper: createWrapper({ queryClient }) },
+ );
+ const { result: useCreateTaskRunConcurrencyLimitResult } = renderHook(
+ useCreateTaskRunConcurrencyLimit,
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ // ------------ Invoke mutation
+ act(() =>
+ useCreateTaskRunConcurrencyLimitResult.current.createTaskRunConcurrencyLimit(
+ MOCK_NEW_DATA,
+ ),
+ );
+
+ // ------------ Assert
+ await waitFor(() =>
+ expect(useCreateTaskRunConcurrencyLimitResult.current.isSuccess).toBe(
+ true,
+ ),
+ );
+ expect(useListTaskRunConcurrencyLimitsResult.current.data).toHaveLength(2);
+ const newLimit = useListTaskRunConcurrencyLimitsResult.current.data?.find(
+ (limit) => limit.id === MOCK_NEW_DATA_ID,
+ );
+ expect(newLimit).toMatchObject(NEW_LIMIT_DATA);
+ });
+ /**
+ * Data Management:
+ * - Asserts reset mutation API is called.
+ * - Upon resetting active task run mutation API being called, cache is invalidated and asserts cache invalidation APIS are called
+ */
+ it("useCreateTaskRunConcurrencyLimit() invalidates cache and fetches updated value", async () => {
+ const queryClient = new QueryClient();
+ const MOCK_TAG_NAME = "my tag 0";
+
+ // ------------ Mock API requests after queries are invalidated
+ const mockData = seedData().map((limit) =>
+ limit.tag === MOCK_TAG_NAME
+ ? {
+ ...limit,
+ active_slots: [],
+ }
+ : limit,
+ );
+
+ mockFetchListAPI(mockData);
+
+ // ------------ Initialize cache
+ queryClient.setQueryData(queryKeyFactory.list(filter), seedData());
+
+ // ------------ Initialize hooks to test
+ const { result: useListTaskRunConcurrencyLimitsResult } = renderHook(
+ () => useListTaskRunConcurrencyLimits(filter),
+ { wrapper: createWrapper({ queryClient }) },
+ );
+ const { result: useResetTaskRunConcurrencyLimitTagResults } = renderHook(
+ useResetTaskRunConcurrencyLimitTag,
+ { wrapper: createWrapper({ queryClient }) },
+ );
+
+ // ------------ Invoke mutation
+ act(() =>
+ useResetTaskRunConcurrencyLimitTagResults.current.resetTaskRunConcurrencyLimitTag(
+ MOCK_TAG_NAME,
+ ),
+ );
+
+ // ------------ Assert
+ await waitFor(() =>
+ expect(useResetTaskRunConcurrencyLimitTagResults.current.isSuccess).toBe(
+ true,
+ ),
+ );
+ const limit = useListTaskRunConcurrencyLimitsResult.current.data?.find(
+ (limit) => limit.tag === MOCK_TAG_NAME,
+ );
+ expect(limit?.active_slots).toHaveLength(0);
+ });
+});
diff --git a/ui-v2/src/hooks/task-run-concurrency-limits.ts b/ui-v2/src/hooks/task-run-concurrency-limits.ts
new file mode 100644
index 000000000000..6a6d51800bf4
--- /dev/null
+++ b/ui-v2/src/hooks/task-run-concurrency-limits.ts
@@ -0,0 +1,206 @@
+import type { components } from "@/api/prefect";
+import { getQueryService } from "@/api/service";
+import {
+ queryOptions,
+ useMutation,
+ useQueryClient,
+ useSuspenseQuery,
+} from "@tanstack/react-query";
+
+export type TaskRunConcurrencyLimit = components["schemas"]["ConcurrencyLimit"];
+export type TaskRunConcurrencyLimitsFilter =
+ components["schemas"]["Body_read_concurrency_limits_concurrency_limits_filter_post"];
+
+/**
+ * ```
+ * ๐๏ธ Task run concurrency limits queries construction ๐ท
+ * all => ['task-run-concurrency-limits'] // key to match ['task-run-concurrency-limits', ...
+ * list => ['task-run-concurrency-limits', 'list'] // key to match ['task-run-concurrency-limits', 'list', ...
+ * ['task-run-concurrency-limits', 'list', { ...filter1 }]
+ * ['task-run-concurrency-limits', 'list', { ...filter2 }]
+ * details => ['task-run-concurrency-limits', 'details'] // key to match ['task-run-concurrency-limits', 'details', ...
+ * ['task-run-concurrency-limits', 'details', id1]
+ * ['task-run-concurrency-limits', 'details', id2]
+ * ```
+ * */
+export const queryKeyFactory = {
+ all: () => ["task-run-concurrency-limits"] as const,
+ lists: () => [...queryKeyFactory.all(), "list"] as const,
+ list: (filter: TaskRunConcurrencyLimitsFilter) =>
+ [...queryKeyFactory.lists(), filter] as const,
+ details: () => [...queryKeyFactory.all(), "details"] as const,
+ detail: (id: string) => [...queryKeyFactory.details(), id] as const,
+};
+
+// ----- ๐ Queries ๐๏ธ
+// ----------------------------
+export const buildListTaskRunConcurrencyLimitsQuery = (
+ filter: TaskRunConcurrencyLimitsFilter = { offset: 0 },
+) =>
+ queryOptions({
+ queryKey: queryKeyFactory.list(filter),
+ queryFn: async () => {
+ const res = await getQueryService().POST("/concurrency_limits/filter", {
+ body: filter,
+ });
+ return res.data ?? [];
+ },
+ refetchInterval: 30_000,
+ });
+
+export const buildDetailTaskRunConcurrencyLimitsQuery = (id: string) =>
+ queryOptions({
+ queryKey: queryKeyFactory.detail(id),
+ queryFn: async () => {
+ const res = await getQueryService().GET("/concurrency_limits/{id}", {
+ params: { path: { id } },
+ });
+ return res.data as TaskRunConcurrencyLimit; // Expecting data to be truthy;
+ },
+ });
+
+/**
+ *
+ * @param filter
+ * @returns list of task run concurrency limits as a SuspenseQueryResult object
+ */
+export const useListTaskRunConcurrencyLimits = (
+ filter: TaskRunConcurrencyLimitsFilter = { offset: 0 },
+) => useSuspenseQuery(buildListTaskRunConcurrencyLimitsQuery(filter));
+
+/**
+ *
+ * @returns details of task run concurrency limits as a SuspenseQueryResult object
+ */
+export const useGetTaskRunConcurrencyLimit = (id: string) =>
+ useSuspenseQuery(buildDetailTaskRunConcurrencyLimitsQuery(id));
+
+// ----- โ๐ผ Mutations ๐๏ธ
+// ----------------------------
+
+/**
+ * Hook for deleting a task run concurrency limit
+ *
+ * @returns Mutation object for deleting a task run concurrency limit with loading/error states and trigger function
+ *
+ * @example
+ * ```ts
+ * const { deleteTaskRunConcurrencyLimit } = useDeleteTaskRunConcurrencyLimit();
+ *
+ * // Delete a taskRun concurrency limit by id or name
+ * deleteTaskRunConcurrencyLimit('id-to-delete', {
+ * onSuccess: () => {
+ * // Handle successful deletion
+ * },
+ * onError: (error) => {
+ * console.error('Failed to delete task run concurrency limit:', error);
+ * }
+ * });
+ * ```
+ */
+export const useDeleteTaskRunConcurrencyLimit = () => {
+ const queryClient = useQueryClient();
+ const { mutate: deleteTaskRunConcurrencyLimit, ...rest } = useMutation({
+ mutationFn: (id: string) =>
+ getQueryService().DELETE("/concurrency_limits/{id}", {
+ params: { path: { id } },
+ }),
+ onSuccess: () => {
+ // After a successful deletion, invalidate the listing queries only to refetch
+ return queryClient.invalidateQueries({
+ queryKey: queryKeyFactory.lists(),
+ });
+ },
+ });
+ return {
+ deleteTaskRunConcurrencyLimit,
+ ...rest,
+ };
+};
+
+/**
+ * Hook for creating a new task run concurrency limit
+ *
+ * @returns Mutation object for creating a task run concurrency limit with loading/error states and trigger function
+ *
+ * @example
+ * ```ts
+ * const { createTaskRunConcurrencyLimit, isLoading } = useCreateTaskRunConcurrencyLimit();
+ *
+ * // Create a new task run concurrency limit
+ * createTaskRunConcurrencyLimit({
+ * tag: "my tag"
+ * concurrency_limit: 9000
+ * }, {
+ * onSuccess: () => {
+ * // Handle successful creation
+ * console.log('Task Run concurrency limit created successfully');
+ * },
+ * onError: (error) => {
+ * // Handle error
+ * console.error('Failed to create task run concurrency limit:', error);
+ * }
+ * });
+ * ```
+ */
+export const useCreateTaskRunConcurrencyLimit = () => {
+ const queryClient = useQueryClient();
+ const { mutate: createTaskRunConcurrencyLimit, ...rest } = useMutation({
+ mutationFn: (body: components["schemas"]["ConcurrencyLimitCreate"]) =>
+ getQueryService().POST("/concurrency_limits/", {
+ body,
+ }),
+ onSuccess: () => {
+ // After a successful creation, invalidate the listing queries only to refetch
+ return queryClient.invalidateQueries({
+ queryKey: queryKeyFactory.lists(),
+ });
+ },
+ });
+ return {
+ createTaskRunConcurrencyLimit,
+ ...rest,
+ };
+};
+
+/**
+ * Hook for resetting a concurrency limit's active task runs based on the tag name
+ *
+ * @returns Mutation object for resetting a task run concurrency limit with loading/error states and trigger function
+ *
+ * @example
+ * ```ts
+ * const { resetTaskRunConcurrencyLimitTag, isLoading } = useResetTaskRunConcurrencyLimitTag();
+ *
+ * // Create a new task run concurrency limit
+ * resetTaskRunConcurrencyLimitTag('my-tag', {
+ * onSuccess: () => {
+ * // Handle successful creation
+ * console.log('Task Run concurrency limit tag reset successfully');
+ * },
+ * onError: (error) => {
+ * // Handle error
+ * console.error('Failed to reset task run concurrency limit', error);
+ * }
+ * });
+ * ```
+ */
+export const useResetTaskRunConcurrencyLimitTag = () => {
+ const queryClient = useQueryClient();
+ const { mutate: resetTaskRunConcurrencyLimitTag, ...rest } = useMutation({
+ mutationFn: (tag: string) =>
+ getQueryService().POST("/concurrency_limits/tag/{tag}/reset", {
+ params: { path: { tag } },
+ }),
+ onSuccess: () => {
+ // After a successful reset, invalidate all to get an updated list and details list
+ return queryClient.invalidateQueries({
+ queryKey: queryKeyFactory.all(),
+ });
+ },
+ });
+ return {
+ resetTaskRunConcurrencyLimitTag,
+ ...rest,
+ };
+};
diff --git a/ui-v2/src/hooks/use-is-overflowing.ts b/ui-v2/src/hooks/use-is-overflowing.ts
index a2890c14f70b..93747aaa705e 100644
--- a/ui-v2/src/hooks/use-is-overflowing.ts
+++ b/ui-v2/src/hooks/use-is-overflowing.ts
@@ -1,6 +1,6 @@
-import { type RefObject, useState, useEffect } from "react";
+import { type RefObject, useEffect, useState } from "react";
-export const useIsOverflowing = (ref: RefObject) => {
+export const useIsOverflowing = (ref: RefObject) => {
const [isOverflowing, setIsOverflowing] = useState(false);
useEffect(() => {
if (ref.current) {
diff --git a/ui-v2/src/hooks/use-set.test.ts b/ui-v2/src/hooks/use-set.test.ts
index e00d8c84bd91..afa1c15c3765 100644
--- a/ui-v2/src/hooks/use-set.test.ts
+++ b/ui-v2/src/hooks/use-set.test.ts
@@ -1,7 +1,7 @@
import { act, renderHook } from "@testing-library/react";
import { useSet } from "./use-set";
-import { describe, it, expect } from "vitest";
+import { describe, expect, it } from "vitest";
describe("useSet", () => {
it("add() to set", () => {
diff --git a/ui-v2/src/hooks/variables.test.tsx b/ui-v2/src/hooks/variables.test.tsx
index ba104cbfc430..70a03b40d77b 100644
--- a/ui-v2/src/hooks/variables.test.tsx
+++ b/ui-v2/src/hooks/variables.test.tsx
@@ -1,9 +1,10 @@
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { QueryClient } from "@tanstack/react-query";
import { act, renderHook, waitFor } from "@testing-library/react";
import { http, HttpResponse } from "msw";
import { describe, expect, it } from "vitest";
import { components } from "@/api/prefect";
+import { createWrapper, server } from "@tests/utils";
import {
buildCountQuery,
@@ -14,8 +15,6 @@ import {
useVariables,
} from "./variables";
-import { server } from "../../tests/mocks/node";
-
describe("variable hooks", () => {
const seedVariables = () => [
{
@@ -40,14 +39,6 @@ describe("variable hooks", () => {
}),
);
};
-
- const createQueryWrapper = ({ queryClient = new QueryClient() }) => {
- const QueryWrapper = ({ children }: { children: React.ReactNode }) => (
- {children}
- );
- return QueryWrapper;
- };
-
const variableFilter = {
offset: 0,
sort: "CREATED_DESC" as const,
@@ -66,7 +57,7 @@ describe("variable hooks", () => {
// ------------ Initialize hooks to test
const { result } = renderHook(() => useVariables(variableFilter), {
- wrapper: createQueryWrapper({ queryClient }),
+ wrapper: createWrapper({ queryClient }),
});
// ------------ Assert
@@ -103,11 +94,11 @@ describe("variable hooks", () => {
// ------------ Initialize hooks to test
const { result: useVariablesResult } = renderHook(
() => useVariables(variableFilter),
- { wrapper: createQueryWrapper({ queryClient }) },
+ { wrapper: createWrapper({ queryClient }) },
);
const { result: useDeleteVariableResult } = renderHook(useDeleteVariable, {
- wrapper: createQueryWrapper({ queryClient }),
+ wrapper: createWrapper({ queryClient }),
});
// ------------ Invoke mutation
@@ -166,10 +157,10 @@ describe("variable hooks", () => {
// ------------ Initialize hooks to test
const { result: useVariablesResult } = renderHook(
() => useVariables(variableFilter),
- { wrapper: createQueryWrapper({ queryClient }) },
+ { wrapper: createWrapper({ queryClient }) },
);
const { result: useCreateVariableResult } = renderHook(useCreateVariable, {
- wrapper: createQueryWrapper({ queryClient }),
+ wrapper: createWrapper({ queryClient }),
});
// ------------ Invoke mutation
@@ -228,10 +219,10 @@ describe("variable hooks", () => {
// ------------ Initialize hooks to test
const { result: useVariablesResult } = renderHook(
() => useVariables(variableFilter),
- { wrapper: createQueryWrapper({ queryClient }) },
+ { wrapper: createWrapper({ queryClient }) },
);
const { result: useUpdateVariableResult } = renderHook(useUpdateVariable, {
- wrapper: createQueryWrapper({ queryClient }),
+ wrapper: createWrapper({ queryClient }),
});
// ------------ Invoke mutation
diff --git a/ui-v2/src/routeTree.gen.ts b/ui-v2/src/routeTree.gen.ts
index 9d8aa9d6b3b7..38c957524b24 100644
--- a/ui-v2/src/routeTree.gen.ts
+++ b/ui-v2/src/routeTree.gen.ts
@@ -10,356 +10,400 @@
// Import Routes
-import { Route as rootRoute } from "./routes/__root";
-import { Route as WorkPoolsImport } from "./routes/work-pools";
-import { Route as VariablesImport } from "./routes/variables";
-import { Route as SettingsImport } from "./routes/settings";
-import { Route as RunsImport } from "./routes/runs";
-import { Route as NotificationsImport } from "./routes/notifications";
-import { Route as EventsImport } from "./routes/events";
-import { Route as DeploymentsImport } from "./routes/deployments";
-import { Route as DashboardImport } from "./routes/dashboard";
-import { Route as ConcurrencyLimitsImport } from "./routes/concurrency-limits";
-import { Route as BlocksImport } from "./routes/blocks";
-import { Route as AutomationsImport } from "./routes/automations";
-import { Route as IndexImport } from "./routes/index";
-import { Route as FlowsIndexImport } from "./routes/flows/index";
-import { Route as FlowsFlowIdImport } from "./routes/flows/flow.$id";
+import { Route as rootRoute } from './routes/__root'
+import { Route as WorkPoolsImport } from './routes/work-pools'
+import { Route as VariablesImport } from './routes/variables'
+import { Route as SettingsImport } from './routes/settings'
+import { Route as NotificationsImport } from './routes/notifications'
+import { Route as EventsImport } from './routes/events'
+import { Route as DashboardImport } from './routes/dashboard'
+import { Route as ConcurrencyLimitsImport } from './routes/concurrency-limits'
+import { Route as BlocksImport } from './routes/blocks'
+import { Route as AutomationsImport } from './routes/automations'
+import { Route as IndexImport } from './routes/index'
+import { Route as RunsIndexImport } from './routes/runs/index'
+import { Route as FlowsIndexImport } from './routes/flows/index'
+import { Route as DeploymentsIndexImport } from './routes/deployments/index'
+import { Route as RunsFlowRunIdImport } from './routes/runs/flow-run.$id'
+import { Route as FlowsFlowIdImport } from './routes/flows/flow.$id'
+import { Route as DeploymentsDeploymentIdImport } from './routes/deployments/deployment.$id'
// Create/Update Routes
const WorkPoolsRoute = WorkPoolsImport.update({
- id: "/work-pools",
- path: "/work-pools",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/work-pools',
+ path: '/work-pools',
+ getParentRoute: () => rootRoute,
+} as any)
const VariablesRoute = VariablesImport.update({
- id: "/variables",
- path: "/variables",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/variables',
+ path: '/variables',
+ getParentRoute: () => rootRoute,
+} as any)
const SettingsRoute = SettingsImport.update({
- id: "/settings",
- path: "/settings",
- getParentRoute: () => rootRoute,
-} as any);
-
-const RunsRoute = RunsImport.update({
- id: "/runs",
- path: "/runs",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/settings',
+ path: '/settings',
+ getParentRoute: () => rootRoute,
+} as any)
const NotificationsRoute = NotificationsImport.update({
- id: "/notifications",
- path: "/notifications",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/notifications',
+ path: '/notifications',
+ getParentRoute: () => rootRoute,
+} as any)
const EventsRoute = EventsImport.update({
- id: "/events",
- path: "/events",
- getParentRoute: () => rootRoute,
-} as any);
-
-const DeploymentsRoute = DeploymentsImport.update({
- id: "/deployments",
- path: "/deployments",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/events',
+ path: '/events',
+ getParentRoute: () => rootRoute,
+} as any)
const DashboardRoute = DashboardImport.update({
- id: "/dashboard",
- path: "/dashboard",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/dashboard',
+ path: '/dashboard',
+ getParentRoute: () => rootRoute,
+} as any)
const ConcurrencyLimitsRoute = ConcurrencyLimitsImport.update({
- id: "/concurrency-limits",
- path: "/concurrency-limits",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/concurrency-limits',
+ path: '/concurrency-limits',
+ getParentRoute: () => rootRoute,
+} as any)
const BlocksRoute = BlocksImport.update({
- id: "/blocks",
- path: "/blocks",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/blocks',
+ path: '/blocks',
+ getParentRoute: () => rootRoute,
+} as any)
const AutomationsRoute = AutomationsImport.update({
- id: "/automations",
- path: "/automations",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/automations',
+ path: '/automations',
+ getParentRoute: () => rootRoute,
+} as any)
const IndexRoute = IndexImport.update({
- id: "/",
- path: "/",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/',
+ path: '/',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const RunsIndexRoute = RunsIndexImport.update({
+ id: '/runs/',
+ path: '/runs/',
+ getParentRoute: () => rootRoute,
+} as any)
const FlowsIndexRoute = FlowsIndexImport.update({
- id: "/flows/",
- path: "/flows/",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/flows/',
+ path: '/flows/',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const DeploymentsIndexRoute = DeploymentsIndexImport.update({
+ id: '/deployments/',
+ path: '/deployments/',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const RunsFlowRunIdRoute = RunsFlowRunIdImport.update({
+ id: '/runs/flow-run/$id',
+ path: '/runs/flow-run/$id',
+ getParentRoute: () => rootRoute,
+} as any)
const FlowsFlowIdRoute = FlowsFlowIdImport.update({
- id: "/flows/flow/$id",
- path: "/flows/flow/$id",
- getParentRoute: () => rootRoute,
-} as any);
+ id: '/flows/flow/$id',
+ path: '/flows/flow/$id',
+ getParentRoute: () => rootRoute,
+} as any)
+
+const DeploymentsDeploymentIdRoute = DeploymentsDeploymentIdImport.update({
+ id: '/deployments/deployment/$id',
+ path: '/deployments/deployment/$id',
+ getParentRoute: () => rootRoute,
+} as any)
// Populate the FileRoutesByPath interface
-declare module "@tanstack/react-router" {
- interface FileRoutesByPath {
- "/": {
- id: "/";
- path: "/";
- fullPath: "/";
- preLoaderRoute: typeof IndexImport;
- parentRoute: typeof rootRoute;
- };
- "/automations": {
- id: "/automations";
- path: "/automations";
- fullPath: "/automations";
- preLoaderRoute: typeof AutomationsImport;
- parentRoute: typeof rootRoute;
- };
- "/blocks": {
- id: "/blocks";
- path: "/blocks";
- fullPath: "/blocks";
- preLoaderRoute: typeof BlocksImport;
- parentRoute: typeof rootRoute;
- };
- "/concurrency-limits": {
- id: "/concurrency-limits";
- path: "/concurrency-limits";
- fullPath: "/concurrency-limits";
- preLoaderRoute: typeof ConcurrencyLimitsImport;
- parentRoute: typeof rootRoute;
- };
- "/dashboard": {
- id: "/dashboard";
- path: "/dashboard";
- fullPath: "/dashboard";
- preLoaderRoute: typeof DashboardImport;
- parentRoute: typeof rootRoute;
- };
- "/deployments": {
- id: "/deployments";
- path: "/deployments";
- fullPath: "/deployments";
- preLoaderRoute: typeof DeploymentsImport;
- parentRoute: typeof rootRoute;
- };
- "/events": {
- id: "/events";
- path: "/events";
- fullPath: "/events";
- preLoaderRoute: typeof EventsImport;
- parentRoute: typeof rootRoute;
- };
- "/notifications": {
- id: "/notifications";
- path: "/notifications";
- fullPath: "/notifications";
- preLoaderRoute: typeof NotificationsImport;
- parentRoute: typeof rootRoute;
- };
- "/runs": {
- id: "/runs";
- path: "/runs";
- fullPath: "/runs";
- preLoaderRoute: typeof RunsImport;
- parentRoute: typeof rootRoute;
- };
- "/settings": {
- id: "/settings";
- path: "/settings";
- fullPath: "/settings";
- preLoaderRoute: typeof SettingsImport;
- parentRoute: typeof rootRoute;
- };
- "/variables": {
- id: "/variables";
- path: "/variables";
- fullPath: "/variables";
- preLoaderRoute: typeof VariablesImport;
- parentRoute: typeof rootRoute;
- };
- "/work-pools": {
- id: "/work-pools";
- path: "/work-pools";
- fullPath: "/work-pools";
- preLoaderRoute: typeof WorkPoolsImport;
- parentRoute: typeof rootRoute;
- };
- "/flows/": {
- id: "/flows/";
- path: "/flows";
- fullPath: "/flows";
- preLoaderRoute: typeof FlowsIndexImport;
- parentRoute: typeof rootRoute;
- };
- "/flows/flow/$id": {
- id: "/flows/flow/$id";
- path: "/flows/flow/$id";
- fullPath: "/flows/flow/$id";
- preLoaderRoute: typeof FlowsFlowIdImport;
- parentRoute: typeof rootRoute;
- };
- }
+declare module '@tanstack/react-router' {
+ interface FileRoutesByPath {
+ '/': {
+ id: '/'
+ path: '/'
+ fullPath: '/'
+ preLoaderRoute: typeof IndexImport
+ parentRoute: typeof rootRoute
+ }
+ '/automations': {
+ id: '/automations'
+ path: '/automations'
+ fullPath: '/automations'
+ preLoaderRoute: typeof AutomationsImport
+ parentRoute: typeof rootRoute
+ }
+ '/blocks': {
+ id: '/blocks'
+ path: '/blocks'
+ fullPath: '/blocks'
+ preLoaderRoute: typeof BlocksImport
+ parentRoute: typeof rootRoute
+ }
+ '/concurrency-limits': {
+ id: '/concurrency-limits'
+ path: '/concurrency-limits'
+ fullPath: '/concurrency-limits'
+ preLoaderRoute: typeof ConcurrencyLimitsImport
+ parentRoute: typeof rootRoute
+ }
+ '/dashboard': {
+ id: '/dashboard'
+ path: '/dashboard'
+ fullPath: '/dashboard'
+ preLoaderRoute: typeof DashboardImport
+ parentRoute: typeof rootRoute
+ }
+ '/events': {
+ id: '/events'
+ path: '/events'
+ fullPath: '/events'
+ preLoaderRoute: typeof EventsImport
+ parentRoute: typeof rootRoute
+ }
+ '/notifications': {
+ id: '/notifications'
+ path: '/notifications'
+ fullPath: '/notifications'
+ preLoaderRoute: typeof NotificationsImport
+ parentRoute: typeof rootRoute
+ }
+ '/settings': {
+ id: '/settings'
+ path: '/settings'
+ fullPath: '/settings'
+ preLoaderRoute: typeof SettingsImport
+ parentRoute: typeof rootRoute
+ }
+ '/variables': {
+ id: '/variables'
+ path: '/variables'
+ fullPath: '/variables'
+ preLoaderRoute: typeof VariablesImport
+ parentRoute: typeof rootRoute
+ }
+ '/work-pools': {
+ id: '/work-pools'
+ path: '/work-pools'
+ fullPath: '/work-pools'
+ preLoaderRoute: typeof WorkPoolsImport
+ parentRoute: typeof rootRoute
+ }
+ '/deployments/': {
+ id: '/deployments/'
+ path: '/deployments'
+ fullPath: '/deployments'
+ preLoaderRoute: typeof DeploymentsIndexImport
+ parentRoute: typeof rootRoute
+ }
+ '/flows/': {
+ id: '/flows/'
+ path: '/flows'
+ fullPath: '/flows'
+ preLoaderRoute: typeof FlowsIndexImport
+ parentRoute: typeof rootRoute
+ }
+ '/runs/': {
+ id: '/runs/'
+ path: '/runs'
+ fullPath: '/runs'
+ preLoaderRoute: typeof RunsIndexImport
+ parentRoute: typeof rootRoute
+ }
+ '/deployments/deployment/$id': {
+ id: '/deployments/deployment/$id'
+ path: '/deployments/deployment/$id'
+ fullPath: '/deployments/deployment/$id'
+ preLoaderRoute: typeof DeploymentsDeploymentIdImport
+ parentRoute: typeof rootRoute
+ }
+ '/flows/flow/$id': {
+ id: '/flows/flow/$id'
+ path: '/flows/flow/$id'
+ fullPath: '/flows/flow/$id'
+ preLoaderRoute: typeof FlowsFlowIdImport
+ parentRoute: typeof rootRoute
+ }
+ '/runs/flow-run/$id': {
+ id: '/runs/flow-run/$id'
+ path: '/runs/flow-run/$id'
+ fullPath: '/runs/flow-run/$id'
+ preLoaderRoute: typeof RunsFlowRunIdImport
+ parentRoute: typeof rootRoute
+ }
+ }
}
// Create and export the route tree
export interface FileRoutesByFullPath {
- "/": typeof IndexRoute;
- "/automations": typeof AutomationsRoute;
- "/blocks": typeof BlocksRoute;
- "/concurrency-limits": typeof ConcurrencyLimitsRoute;
- "/dashboard": typeof DashboardRoute;
- "/deployments": typeof DeploymentsRoute;
- "/events": typeof EventsRoute;
- "/notifications": typeof NotificationsRoute;
- "/runs": typeof RunsRoute;
- "/settings": typeof SettingsRoute;
- "/variables": typeof VariablesRoute;
- "/work-pools": typeof WorkPoolsRoute;
- "/flows": typeof FlowsIndexRoute;
- "/flows/flow/$id": typeof FlowsFlowIdRoute;
+ '/': typeof IndexRoute
+ '/automations': typeof AutomationsRoute
+ '/blocks': typeof BlocksRoute
+ '/concurrency-limits': typeof ConcurrencyLimitsRoute
+ '/dashboard': typeof DashboardRoute
+ '/events': typeof EventsRoute
+ '/notifications': typeof NotificationsRoute
+ '/settings': typeof SettingsRoute
+ '/variables': typeof VariablesRoute
+ '/work-pools': typeof WorkPoolsRoute
+ '/deployments': typeof DeploymentsIndexRoute
+ '/flows': typeof FlowsIndexRoute
+ '/runs': typeof RunsIndexRoute
+ '/deployments/deployment/$id': typeof DeploymentsDeploymentIdRoute
+ '/flows/flow/$id': typeof FlowsFlowIdRoute
+ '/runs/flow-run/$id': typeof RunsFlowRunIdRoute
}
export interface FileRoutesByTo {
- "/": typeof IndexRoute;
- "/automations": typeof AutomationsRoute;
- "/blocks": typeof BlocksRoute;
- "/concurrency-limits": typeof ConcurrencyLimitsRoute;
- "/dashboard": typeof DashboardRoute;
- "/deployments": typeof DeploymentsRoute;
- "/events": typeof EventsRoute;
- "/notifications": typeof NotificationsRoute;
- "/runs": typeof RunsRoute;
- "/settings": typeof SettingsRoute;
- "/variables": typeof VariablesRoute;
- "/work-pools": typeof WorkPoolsRoute;
- "/flows": typeof FlowsIndexRoute;
- "/flows/flow/$id": typeof FlowsFlowIdRoute;
+ '/': typeof IndexRoute
+ '/automations': typeof AutomationsRoute
+ '/blocks': typeof BlocksRoute
+ '/concurrency-limits': typeof ConcurrencyLimitsRoute
+ '/dashboard': typeof DashboardRoute
+ '/events': typeof EventsRoute
+ '/notifications': typeof NotificationsRoute
+ '/settings': typeof SettingsRoute
+ '/variables': typeof VariablesRoute
+ '/work-pools': typeof WorkPoolsRoute
+ '/deployments': typeof DeploymentsIndexRoute
+ '/flows': typeof FlowsIndexRoute
+ '/runs': typeof RunsIndexRoute
+ '/deployments/deployment/$id': typeof DeploymentsDeploymentIdRoute
+ '/flows/flow/$id': typeof FlowsFlowIdRoute
+ '/runs/flow-run/$id': typeof RunsFlowRunIdRoute
}
export interface FileRoutesById {
- __root__: typeof rootRoute;
- "/": typeof IndexRoute;
- "/automations": typeof AutomationsRoute;
- "/blocks": typeof BlocksRoute;
- "/concurrency-limits": typeof ConcurrencyLimitsRoute;
- "/dashboard": typeof DashboardRoute;
- "/deployments": typeof DeploymentsRoute;
- "/events": typeof EventsRoute;
- "/notifications": typeof NotificationsRoute;
- "/runs": typeof RunsRoute;
- "/settings": typeof SettingsRoute;
- "/variables": typeof VariablesRoute;
- "/work-pools": typeof WorkPoolsRoute;
- "/flows/": typeof FlowsIndexRoute;
- "/flows/flow/$id": typeof FlowsFlowIdRoute;
+ __root__: typeof rootRoute
+ '/': typeof IndexRoute
+ '/automations': typeof AutomationsRoute
+ '/blocks': typeof BlocksRoute
+ '/concurrency-limits': typeof ConcurrencyLimitsRoute
+ '/dashboard': typeof DashboardRoute
+ '/events': typeof EventsRoute
+ '/notifications': typeof NotificationsRoute
+ '/settings': typeof SettingsRoute
+ '/variables': typeof VariablesRoute
+ '/work-pools': typeof WorkPoolsRoute
+ '/deployments/': typeof DeploymentsIndexRoute
+ '/flows/': typeof FlowsIndexRoute
+ '/runs/': typeof RunsIndexRoute
+ '/deployments/deployment/$id': typeof DeploymentsDeploymentIdRoute
+ '/flows/flow/$id': typeof FlowsFlowIdRoute
+ '/runs/flow-run/$id': typeof RunsFlowRunIdRoute
}
export interface FileRouteTypes {
- fileRoutesByFullPath: FileRoutesByFullPath;
- fullPaths:
- | "/"
- | "/automations"
- | "/blocks"
- | "/concurrency-limits"
- | "/dashboard"
- | "/deployments"
- | "/events"
- | "/notifications"
- | "/runs"
- | "/settings"
- | "/variables"
- | "/work-pools"
- | "/flows"
- | "/flows/flow/$id";
- fileRoutesByTo: FileRoutesByTo;
- to:
- | "/"
- | "/automations"
- | "/blocks"
- | "/concurrency-limits"
- | "/dashboard"
- | "/deployments"
- | "/events"
- | "/notifications"
- | "/runs"
- | "/settings"
- | "/variables"
- | "/work-pools"
- | "/flows"
- | "/flows/flow/$id";
- id:
- | "__root__"
- | "/"
- | "/automations"
- | "/blocks"
- | "/concurrency-limits"
- | "/dashboard"
- | "/deployments"
- | "/events"
- | "/notifications"
- | "/runs"
- | "/settings"
- | "/variables"
- | "/work-pools"
- | "/flows/"
- | "/flows/flow/$id";
- fileRoutesById: FileRoutesById;
+ fileRoutesByFullPath: FileRoutesByFullPath
+ fullPaths:
+ | '/'
+ | '/automations'
+ | '/blocks'
+ | '/concurrency-limits'
+ | '/dashboard'
+ | '/events'
+ | '/notifications'
+ | '/settings'
+ | '/variables'
+ | '/work-pools'
+ | '/deployments'
+ | '/flows'
+ | '/runs'
+ | '/deployments/deployment/$id'
+ | '/flows/flow/$id'
+ | '/runs/flow-run/$id'
+ fileRoutesByTo: FileRoutesByTo
+ to:
+ | '/'
+ | '/automations'
+ | '/blocks'
+ | '/concurrency-limits'
+ | '/dashboard'
+ | '/events'
+ | '/notifications'
+ | '/settings'
+ | '/variables'
+ | '/work-pools'
+ | '/deployments'
+ | '/flows'
+ | '/runs'
+ | '/deployments/deployment/$id'
+ | '/flows/flow/$id'
+ | '/runs/flow-run/$id'
+ id:
+ | '__root__'
+ | '/'
+ | '/automations'
+ | '/blocks'
+ | '/concurrency-limits'
+ | '/dashboard'
+ | '/events'
+ | '/notifications'
+ | '/settings'
+ | '/variables'
+ | '/work-pools'
+ | '/deployments/'
+ | '/flows/'
+ | '/runs/'
+ | '/deployments/deployment/$id'
+ | '/flows/flow/$id'
+ | '/runs/flow-run/$id'
+ fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
- IndexRoute: typeof IndexRoute;
- AutomationsRoute: typeof AutomationsRoute;
- BlocksRoute: typeof BlocksRoute;
- ConcurrencyLimitsRoute: typeof ConcurrencyLimitsRoute;
- DashboardRoute: typeof DashboardRoute;
- DeploymentsRoute: typeof DeploymentsRoute;
- EventsRoute: typeof EventsRoute;
- NotificationsRoute: typeof NotificationsRoute;
- RunsRoute: typeof RunsRoute;
- SettingsRoute: typeof SettingsRoute;
- VariablesRoute: typeof VariablesRoute;
- WorkPoolsRoute: typeof WorkPoolsRoute;
- FlowsIndexRoute: typeof FlowsIndexRoute;
- FlowsFlowIdRoute: typeof FlowsFlowIdRoute;
+ IndexRoute: typeof IndexRoute
+ AutomationsRoute: typeof AutomationsRoute
+ BlocksRoute: typeof BlocksRoute
+ ConcurrencyLimitsRoute: typeof ConcurrencyLimitsRoute
+ DashboardRoute: typeof DashboardRoute
+ EventsRoute: typeof EventsRoute
+ NotificationsRoute: typeof NotificationsRoute
+ SettingsRoute: typeof SettingsRoute
+ VariablesRoute: typeof VariablesRoute
+ WorkPoolsRoute: typeof WorkPoolsRoute
+ DeploymentsIndexRoute: typeof DeploymentsIndexRoute
+ FlowsIndexRoute: typeof FlowsIndexRoute
+ RunsIndexRoute: typeof RunsIndexRoute
+ DeploymentsDeploymentIdRoute: typeof DeploymentsDeploymentIdRoute
+ FlowsFlowIdRoute: typeof FlowsFlowIdRoute
+ RunsFlowRunIdRoute: typeof RunsFlowRunIdRoute
}
const rootRouteChildren: RootRouteChildren = {
- IndexRoute: IndexRoute,
- AutomationsRoute: AutomationsRoute,
- BlocksRoute: BlocksRoute,
- ConcurrencyLimitsRoute: ConcurrencyLimitsRoute,
- DashboardRoute: DashboardRoute,
- DeploymentsRoute: DeploymentsRoute,
- EventsRoute: EventsRoute,
- NotificationsRoute: NotificationsRoute,
- RunsRoute: RunsRoute,
- SettingsRoute: SettingsRoute,
- VariablesRoute: VariablesRoute,
- WorkPoolsRoute: WorkPoolsRoute,
- FlowsIndexRoute: FlowsIndexRoute,
- FlowsFlowIdRoute: FlowsFlowIdRoute,
-};
+ IndexRoute: IndexRoute,
+ AutomationsRoute: AutomationsRoute,
+ BlocksRoute: BlocksRoute,
+ ConcurrencyLimitsRoute: ConcurrencyLimitsRoute,
+ DashboardRoute: DashboardRoute,
+ EventsRoute: EventsRoute,
+ NotificationsRoute: NotificationsRoute,
+ SettingsRoute: SettingsRoute,
+ VariablesRoute: VariablesRoute,
+ WorkPoolsRoute: WorkPoolsRoute,
+ DeploymentsIndexRoute: DeploymentsIndexRoute,
+ FlowsIndexRoute: FlowsIndexRoute,
+ RunsIndexRoute: RunsIndexRoute,
+ DeploymentsDeploymentIdRoute: DeploymentsDeploymentIdRoute,
+ FlowsFlowIdRoute: FlowsFlowIdRoute,
+ RunsFlowRunIdRoute: RunsFlowRunIdRoute,
+}
export const routeTree = rootRoute
- ._addFileChildren(rootRouteChildren)
- ._addFileTypes();
+ ._addFileChildren(rootRouteChildren)
+ ._addFileTypes()
/* ROUTE_MANIFEST_START
{
@@ -372,15 +416,17 @@ export const routeTree = rootRoute
"/blocks",
"/concurrency-limits",
"/dashboard",
- "/deployments",
"/events",
"/notifications",
- "/runs",
"/settings",
"/variables",
"/work-pools",
+ "/deployments/",
"/flows/",
- "/flows/flow/$id"
+ "/runs/",
+ "/deployments/deployment/$id",
+ "/flows/flow/$id",
+ "/runs/flow-run/$id"
]
},
"/": {
@@ -398,18 +444,12 @@ export const routeTree = rootRoute
"/dashboard": {
"filePath": "dashboard.tsx"
},
- "/deployments": {
- "filePath": "deployments.tsx"
- },
"/events": {
"filePath": "events.tsx"
},
"/notifications": {
"filePath": "notifications.tsx"
},
- "/runs": {
- "filePath": "runs.tsx"
- },
"/settings": {
"filePath": "settings.tsx"
},
@@ -419,11 +459,23 @@ export const routeTree = rootRoute
"/work-pools": {
"filePath": "work-pools.tsx"
},
+ "/deployments/": {
+ "filePath": "deployments/index.tsx"
+ },
"/flows/": {
"filePath": "flows/index.tsx"
},
+ "/runs/": {
+ "filePath": "runs/index.tsx"
+ },
+ "/deployments/deployment/$id": {
+ "filePath": "deployments/deployment.$id.tsx"
+ },
"/flows/flow/$id": {
"filePath": "flows/flow.$id.tsx"
+ },
+ "/runs/flow-run/$id": {
+ "filePath": "runs/flow-run.$id.tsx"
}
}
}
diff --git a/ui-v2/src/router.tsx b/ui-v2/src/router.tsx
index 7480f2554ff8..be8f04d012a5 100644
--- a/ui-v2/src/router.tsx
+++ b/ui-v2/src/router.tsx
@@ -1,7 +1,7 @@
+import { QueryClient } from "@tanstack/react-query";
import { createRouter } from "@tanstack/react-router";
// Import the generated route tree
import { routeTree } from "./routeTree.gen";
-import { QueryClient } from "@tanstack/react-query";
export const queryClient = new QueryClient();
diff --git a/ui-v2/src/routes/concurrency-limits.tsx b/ui-v2/src/routes/concurrency-limits.tsx
index 1cd00ccde0bc..dd130e853cb3 100644
--- a/ui-v2/src/routes/concurrency-limits.tsx
+++ b/ui-v2/src/routes/concurrency-limits.tsx
@@ -1,9 +1,32 @@
+import { ConcurrencyPage } from "@/components/concurrency/concurrency-page";
+import { buildListGlobalConcurrencyLimitsQuery } from "@/hooks/global-concurrency-limits";
+import { buildListTaskRunConcurrencyLimitsQuery } from "@/hooks/task-run-concurrency-limits";
import { createFileRoute } from "@tanstack/react-router";
+import { zodSearchValidator } from "@tanstack/router-zod-adapter";
+import { z } from "zod";
-export const Route = createFileRoute("/concurrency-limits")({
- component: RouteComponent,
+/**
+ * Schema for validating URL search parameters for the Concurrency Limits page.
+ * @property {'global' | 'task-run'} tab used designate which tab view to display
+ */
+const searchParams = z.object({
+ search: z.string().optional(),
+ tab: z.enum(["global", "task-run"]).default("global"),
});
-function RouteComponent() {
- return "๐ง๐ง Pardon our dust! ๐ง๐ง";
-}
+export type TabOptions = z.infer["tab"];
+
+export const Route = createFileRoute("/concurrency-limits")({
+ validateSearch: zodSearchValidator(searchParams),
+ component: ConcurrencyPage,
+ wrapInSuspense: true,
+ loader: ({ context }) =>
+ Promise.all([
+ context.queryClient.ensureQueryData(
+ buildListGlobalConcurrencyLimitsQuery(),
+ ),
+ context.queryClient.ensureQueryData(
+ buildListTaskRunConcurrencyLimitsQuery(),
+ ),
+ ]),
+});
diff --git a/ui-v2/src/routes/deployments/deployment.$id.tsx b/ui-v2/src/routes/deployments/deployment.$id.tsx
new file mode 100644
index 000000000000..44a16f6b1fdb
--- /dev/null
+++ b/ui-v2/src/routes/deployments/deployment.$id.tsx
@@ -0,0 +1,9 @@
+import { createFileRoute } from "@tanstack/react-router";
+
+export const Route = createFileRoute("/deployments/deployment/$id")({
+ component: RouteComponent,
+});
+
+function RouteComponent() {
+ return "๐ง๐ง Pardon our dust! ๐ง๐ง";
+}
diff --git a/ui-v2/src/routes/deployments.tsx b/ui-v2/src/routes/deployments/index.tsx
similarity index 75%
rename from ui-v2/src/routes/deployments.tsx
rename to ui-v2/src/routes/deployments/index.tsx
index 03040fac7e76..87bda58933f4 100644
--- a/ui-v2/src/routes/deployments.tsx
+++ b/ui-v2/src/routes/deployments/index.tsx
@@ -1,6 +1,6 @@
import { createFileRoute } from "@tanstack/react-router";
-export const Route = createFileRoute("/deployments")({
+export const Route = createFileRoute("/deployments/")({
component: RouteComponent,
});
diff --git a/ui-v2/src/routes/runs/flow-run.$id.tsx b/ui-v2/src/routes/runs/flow-run.$id.tsx
new file mode 100644
index 000000000000..7a37729b3199
--- /dev/null
+++ b/ui-v2/src/routes/runs/flow-run.$id.tsx
@@ -0,0 +1,16 @@
+import { DeploymentsEmptyState } from "@/components/deployments/empty-state";
+import { DeploymentsPageHeader } from "@/components/deployments/header";
+import { createFileRoute } from "@tanstack/react-router";
+
+export const Route = createFileRoute("/runs/flow-run/$id")({
+ component: RouteComponent,
+});
+
+function RouteComponent() {
+ return (
+
+
+
+
+ );
+}
diff --git a/ui-v2/src/routes/runs.tsx b/ui-v2/src/routes/runs/index.tsx
similarity index 77%
rename from ui-v2/src/routes/runs.tsx
rename to ui-v2/src/routes/runs/index.tsx
index 9490f4cc6157..fc47d744294a 100644
--- a/ui-v2/src/routes/runs.tsx
+++ b/ui-v2/src/routes/runs/index.tsx
@@ -1,6 +1,6 @@
import { createFileRoute } from "@tanstack/react-router";
-export const Route = createFileRoute("/runs")({
+export const Route = createFileRoute("/runs/")({
component: RouteComponent,
});
diff --git a/ui-v2/src/routes/variables.tsx b/ui-v2/src/routes/variables.tsx
index 36984350c7d5..866ed60eecec 100644
--- a/ui-v2/src/routes/variables.tsx
+++ b/ui-v2/src/routes/variables.tsx
@@ -1,20 +1,20 @@
-import { VariablesLayout } from "@/components/variables/layout";
-import { createFileRoute } from "@tanstack/react-router";
-import { z } from "zod";
-import { zodSearchValidator } from "@tanstack/router-zod-adapter";
-import type {
- ColumnFiltersState,
- PaginationState,
-} from "@tanstack/react-table";
-import { useCallback, useMemo } from "react";
import type { components } from "@/api/prefect";
import { VariablesDataTable } from "@/components/variables/data-table";
+import { VariablesEmptyState } from "@/components/variables/empty-state";
+import { VariablesLayout } from "@/components/variables/layout";
import {
VariableDialog,
useVariableDialog,
} from "@/components/variables/variable-dialog";
-import { VariablesEmptyState } from "@/components/variables/empty-state";
import { useVariables } from "@/hooks/variables";
+import { createFileRoute } from "@tanstack/react-router";
+import type {
+ ColumnFiltersState,
+ PaginationState,
+} from "@tanstack/react-table";
+import { zodSearchValidator } from "@tanstack/router-zod-adapter";
+import { useCallback, useMemo } from "react";
+import { z } from "zod";
/**
* Schema for validating URL search parameters for the variables page.
diff --git a/ui-v2/tests/api/service.test.ts b/ui-v2/tests/api/service.test.ts
index f122a2ff8602..2975586060f0 100644
--- a/ui-v2/tests/api/service.test.ts
+++ b/ui-v2/tests/api/service.test.ts
@@ -1,7 +1,7 @@
-import { describe, it, expect } from "vitest";
+import { describe, expect, it } from "vitest";
-import type { paths } from "../../src/api/prefect";
import createClient from "openapi-fetch";
+import type { paths } from "../../src/api/prefect";
describe("API Service", () => {
it("can paginate flows", async () => {
diff --git a/ui-v2/tests/app.test.tsx b/ui-v2/tests/app.test.tsx
index fe55ed1cd743..168c809192a2 100644
--- a/ui-v2/tests/app.test.tsx
+++ b/ui-v2/tests/app.test.tsx
@@ -1,6 +1,6 @@
-import { describe, it, expect } from "vitest";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
+import { describe, expect, it } from "vitest";
import { App } from "../src/app";
import { router } from "../src/router";
diff --git a/ui-v2/tests/setup.ts b/ui-v2/tests/setup.ts
index 93009dff1683..25f6157ec106 100644
--- a/ui-v2/tests/setup.ts
+++ b/ui-v2/tests/setup.ts
@@ -1,9 +1,9 @@
///
-import { expect, afterEach, vi, beforeAll, afterAll } from "vitest";
-import { cleanup } from "@testing-library/react";
import * as matchers from "@testing-library/jest-dom/matchers";
+import { cleanup } from "@testing-library/react";
+import { afterAll, afterEach, beforeAll, expect, vi } from "vitest";
import "@testing-library/jest-dom";
-import { server } from "./mocks/node";
+import { server } from "./utils";
beforeAll(() => {
server.listen({
@@ -14,7 +14,9 @@ beforeAll(() => {
},
});
});
-afterEach(() => server.resetHandlers());
+afterEach(() => {
+ server.resetHandlers();
+});
afterAll(() => server.close());
expect.extend(matchers);
@@ -47,3 +49,25 @@ vi.mock("@tanstack/router-devtools", () => ({
vi.mock("@tanstack/react-query-devtool", () => ({
ReactQueryDevtools: () => null,
}));
+
+// Add this to your existing setup.ts file
+class ResizeObserverMock {
+ observe() {}
+ unobserve() {}
+ disconnect() {}
+}
+
+global.ResizeObserver = ResizeObserverMock;
+
+// Add this along with the ResizeObserver mock
+Element.prototype.getBoundingClientRect = vi.fn(() => ({
+ width: 500,
+ height: 300,
+ top: 0,
+ left: 0,
+ bottom: 0,
+ right: 0,
+ x: 0,
+ y: 0,
+ toJSON: () => {},
+}));
diff --git a/ui-v2/tests/mocks/handlers.ts b/ui-v2/tests/utils/handlers.ts
similarity index 52%
rename from ui-v2/tests/mocks/handlers.ts
rename to ui-v2/tests/utils/handlers.ts
index d649a6da6aac..31184c4a83ab 100644
--- a/ui-v2/tests/mocks/handlers.ts
+++ b/ui-v2/tests/utils/handlers.ts
@@ -1,5 +1,41 @@
import { http, HttpResponse } from "msw";
+const globalConcurrencyLimitsHandlers = [
+ http.post("http://localhost:4200/api/v2/concurrency_limits/filter", () => {
+ return HttpResponse.json([]);
+ }),
+ http.post("http://localhost:4200/api/v2/concurrency_limits/", () => {
+ return HttpResponse.json({ status: "success" }, { status: 201 });
+ }),
+ http.patch(
+ "http://localhost:4200/api/v2/concurrency_limits/:id_or_name",
+ () => {
+ return new HttpResponse(null, { status: 204 });
+ },
+ ),
+ http.delete(
+ "http://localhost:4200/api/v2/concurrency_limits/:id_or_name",
+ () => {
+ return HttpResponse.json({ status: 204 });
+ },
+ ),
+];
+
+const taskRunConcurrencyLimitsHandlers = [
+ http.post("http://localhost:4200/api/concurrency_limits/filter", () => {
+ return HttpResponse.json([]);
+ }),
+ http.post(
+ "http://localhost:4200/api/concurrency_limits/tag/:tag/reset",
+ () => {
+ return HttpResponse.json({ status: 200 });
+ },
+ ),
+ http.delete("http://localhost:4200/api/concurrency_limits/:id", () => {
+ return HttpResponse.json({ status: 204 });
+ }),
+];
+
const variablesHandlers = [
http.post("http://localhost:4200/api/variables/", () => {
return HttpResponse.json({ status: "success" }, { status: 201 });
@@ -40,5 +76,7 @@ export const handlers = [
http.post("http://localhost:4200/api/deployments/count", () => {
return HttpResponse.json(1);
}),
+ ...globalConcurrencyLimitsHandlers,
+ ...taskRunConcurrencyLimitsHandlers,
...variablesHandlers,
];
diff --git a/ui-v2/tests/utils/index.ts b/ui-v2/tests/utils/index.ts
new file mode 100644
index 000000000000..afa45ae6562d
--- /dev/null
+++ b/ui-v2/tests/utils/index.ts
@@ -0,0 +1,21 @@
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { createElement } from "react";
+export { server } from "./node";
+
+/* Wraps render() components with app-wide providers
+ *
+ * @example
+ * import { createWrapper } from '@tests/utils'
+ *
+ * ```tsx
+ * const result = render(, {
+ * wrapper: createWrapper(),
+ * });
+ * ```
+ */
+export const createWrapper = ({ queryClient = new QueryClient() } = {}) => {
+ // Written with createElement because our current vite config doesn't support jsx in tests/
+ const Wrapper = ({ children }: { children: React.ReactNode }) =>
+ createElement(QueryClientProvider, { client: queryClient }, children);
+ return Wrapper;
+};
diff --git a/ui-v2/tests/mocks/node.ts b/ui-v2/tests/utils/node.ts
similarity index 100%
rename from ui-v2/tests/mocks/node.ts
rename to ui-v2/tests/utils/node.ts
diff --git a/ui-v2/tests/variables/mocks.tsx b/ui-v2/tests/variables/mocks.tsx
index bcc963380a3e..0bacc9183b7f 100644
--- a/ui-v2/tests/variables/mocks.tsx
+++ b/ui-v2/tests/variables/mocks.tsx
@@ -1,5 +1,5 @@
-import { vi } from "vitest";
import React from "react";
+import { vi } from "vitest";
// Mock out JsonInput because the underlying CodeMirror editor
// relies on browser APIs that are not available in JSDOM.
diff --git a/ui-v2/tests/variables/variables.test.tsx b/ui-v2/tests/variables/variables.test.tsx
index 0701e268888f..37ed06da7f62 100644
--- a/ui-v2/tests/variables/variables.test.tsx
+++ b/ui-v2/tests/variables/variables.test.tsx
@@ -1,4 +1,8 @@
import "./mocks";
+import { Toaster } from "@/components/ui/toaster";
+import { VariablesDataTable } from "@/components/variables/data-table";
+import { router } from "@/router";
+import { RouterProvider } from "@tanstack/react-router";
import {
getByLabelText,
getByTestId,
@@ -6,34 +10,25 @@ import {
render,
screen,
} from "@testing-library/react";
-import { VariablesDataTable } from "@/components/variables/data-table";
import userEvent from "@testing-library/user-event";
+import { createWrapper, server } from "@tests/utils";
+import { http, HttpResponse } from "msw";
import {
+ afterEach,
+ beforeAll,
+ beforeEach,
describe,
- it,
expect,
+ it,
vi,
- afterEach,
- beforeEach,
- beforeAll,
} from "vitest";
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-import { Toaster } from "@/components/ui/toaster";
-import { server } from "../mocks/node";
-import { HttpResponse } from "msw";
-import { http } from "msw";
-import { router } from "@/router";
-import { RouterProvider } from "@tanstack/react-router";
const renderVariablesPage = async () => {
const user = userEvent.setup();
- const queryClient = new QueryClient();
// Render with router provider
- const result = render(
-
-
- ,
- );
+ const result = render(, {
+ wrapper: createWrapper(),
+ });
await user.click(screen.getByRole("link", { name: "Variables" }));
return result;
};
@@ -89,6 +84,7 @@ describe("Variables page", () => {
await user.click(screen.getByRole("button", { name: "Create" }));
expect(screen.getByText("Variable created")).toBeVisible();
+ expect(screen.queryByRole("dialog")).not.toBeInTheDocument();
});
it("should show validation errors", async () => {
@@ -336,21 +332,19 @@ describe("Variables page", () => {
tags: ["tag2"],
},
];
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
expect(screen.getByText("2 Variables")).toBeVisible();
// Table headers
@@ -382,21 +376,19 @@ describe("Variables page", () => {
}));
const onPaginationChange = vi.fn();
const user = userEvent.setup();
- const queryClient = new QueryClient();
const { rerender } = render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
expect(screen.getByText("20 Variables")).toBeVisible();
@@ -413,19 +405,17 @@ describe("Variables page", () => {
expect(onPaginationChange).toHaveBeenCalled();
rerender(
-
-
- ,
+ ,
);
expect(screen.getByText("Page 2 of 2")).toBeVisible();
@@ -453,21 +443,19 @@ describe("Variables page", () => {
tags: ["tag1"],
},
];
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
await user.click(screen.getByRole("button", { expanded: false }));
@@ -487,21 +475,19 @@ describe("Variables page", () => {
tags: ["tag1"],
},
];
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
await user.click(screen.getByRole("button", { expanded: false }));
@@ -521,21 +507,19 @@ describe("Variables page", () => {
tags: ["tag1"],
},
];
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
await user.click(screen.getByRole("button", { expanded: false }));
@@ -555,9 +539,8 @@ describe("Variables page", () => {
tags: ["tag1"],
},
];
- const queryClient = new QueryClient();
render(
-
+ <>
{
onSortingChange={vi.fn()}
onVariableEdit={vi.fn()}
/>
- ,
+ >,
+ { wrapper: createWrapper() },
);
await user.click(screen.getByRole("button", { expanded: false }));
@@ -591,21 +575,19 @@ describe("Variables page", () => {
},
];
const onColumnFiltersChange = vi.fn();
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
// Clear any initial calls from mounting
@@ -636,21 +618,19 @@ describe("Variables page", () => {
];
const onColumnFiltersChange = vi.fn();
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
// Clear any initial calls from mounting
@@ -681,21 +661,19 @@ describe("Variables page", () => {
];
const onSortingChange = vi.fn();
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
const select = screen.getByRole("combobox", {
@@ -725,21 +703,19 @@ describe("Variables page", () => {
},
];
const onPaginationChange = vi.fn();
- const queryClient = new QueryClient();
render(
-
-
- ,
+ ,
+ { wrapper: createWrapper() },
);
const select = screen.getByRole("combobox", {
diff --git a/ui-v2/tsconfig.app.json b/ui-v2/tsconfig.app.json
index 2642b700885a..f2cb1ee0f02c 100644
--- a/ui-v2/tsconfig.app.json
+++ b/ui-v2/tsconfig.app.json
@@ -7,7 +7,8 @@
"skipLibCheck": true,
"baseUrl": ".",
"paths": {
- "@/*": ["./src/*"]
+ "@/*": ["./src/*"],
+ "@tests/*": ["./tests/*"]
},
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
diff --git a/ui-v2/tsconfig.json b/ui-v2/tsconfig.json
index 827701bce8d9..436b934cbf1a 100644
--- a/ui-v2/tsconfig.json
+++ b/ui-v2/tsconfig.json
@@ -11,7 +11,8 @@
"compilerOptions": {
"baseUrl": ".",
"paths": {
- "@/*": ["./src/*"]
+ "@/*": ["./src/*"],
+ "@tests/*": ["./tests/*"]
}
}
}
diff --git a/ui-v2/vite.config.ts b/ui-v2/vite.config.ts
index 799c680a2c79..754519c9b538 100644
--- a/ui-v2/vite.config.ts
+++ b/ui-v2/vite.config.ts
@@ -10,10 +10,14 @@ export default defineConfig({
globals: true,
environment: "jsdom",
setupFiles: "./tests/setup.ts",
+ coverage: {
+ exclude: ["**/*.stories.tsx", "**/*.test.tsx"],
+ },
},
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
+ "@tests": path.resolve(__dirname, "./tests"),
},
},
});
diff --git a/ui/package-lock.json b/ui/package-lock.json
index 70a46ec2bf49..5e1f5a8956e1 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -8,15 +8,15 @@
"name": "@prefecthq/ui",
"version": "2.8.0",
"dependencies": {
- "@prefecthq/prefect-design": "2.14.14",
- "@prefecthq/prefect-ui-library": "3.11.21",
+ "@prefecthq/prefect-design": "2.14.15",
+ "@prefecthq/prefect-ui-library": "3.11.24",
"@prefecthq/vue-charts": "2.0.5",
"@prefecthq/vue-compositions": "1.11.5",
"@types/lodash.debounce": "4.0.9",
"axios": "1.7.4",
"lodash.debounce": "4.0.8",
"lodash.merge": "^4.6.2",
- "tailwindcss": "3.4.15",
+ "tailwindcss": "3.4.16",
"vue": "3.5.13",
"vue-router": "4.5.0"
},
@@ -28,7 +28,7 @@
"eslint": "^8.57.1",
"ts-node": "10.9.2",
"typescript": "^5.7.2",
- "vite": "5.4.11",
+ "vite": "6.0.3",
"vue-tsc": "^2.1.10"
}
},
@@ -118,9 +118,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
- "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
"cpu": [
"ppc64"
],
@@ -130,13 +130,13 @@
"aix"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
- "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
"cpu": [
"arm"
],
@@ -146,13 +146,13 @@
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
- "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
"cpu": [
"arm64"
],
@@ -162,13 +162,13 @@
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
- "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
"cpu": [
"x64"
],
@@ -178,13 +178,13 @@
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
- "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
"cpu": [
"arm64"
],
@@ -194,13 +194,13 @@
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
- "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
"cpu": [
"x64"
],
@@ -210,13 +210,13 @@
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
- "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
"cpu": [
"arm64"
],
@@ -226,13 +226,13 @@
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
- "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
"cpu": [
"x64"
],
@@ -242,13 +242,13 @@
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
- "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
"cpu": [
"arm"
],
@@ -258,13 +258,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
- "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
"cpu": [
"arm64"
],
@@ -274,13 +274,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
- "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
"cpu": [
"ia32"
],
@@ -290,13 +290,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
- "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
"cpu": [
"loong64"
],
@@ -306,13 +306,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
- "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
"cpu": [
"mips64el"
],
@@ -322,13 +322,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
- "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
"cpu": [
"ppc64"
],
@@ -338,13 +338,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
- "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
"cpu": [
"riscv64"
],
@@ -354,13 +354,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
- "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
"cpu": [
"s390x"
],
@@ -370,13 +370,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
- "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
"cpu": [
"x64"
],
@@ -386,13 +386,13 @@
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
- "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
"cpu": [
"x64"
],
@@ -402,13 +402,29 @@
"netbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
- "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
"cpu": [
"x64"
],
@@ -418,13 +434,13 @@
"openbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
- "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
"cpu": [
"x64"
],
@@ -434,13 +450,13 @@
"sunos"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
- "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
"cpu": [
"arm64"
],
@@ -450,13 +466,13 @@
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
- "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
"cpu": [
"ia32"
],
@@ -466,13 +482,13 @@
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
- "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
"cpu": [
"x64"
],
@@ -482,7 +498,7 @@
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@eslint-community/eslint-utils": {
@@ -1096,9 +1112,9 @@
}
},
"node_modules/@prefecthq/prefect-design": {
- "version": "2.14.14",
- "resolved": "https://registry.npmjs.org/@prefecthq/prefect-design/-/prefect-design-2.14.14.tgz",
- "integrity": "sha512-yg56mzYBH40yes74YPhE5kX5JAdH/AAj0CIdRLVgm7GKN+V0IMN684NLlDiSqYJlhR4UYKDyb4rusS+O/ZTOEw==",
+ "version": "2.14.15",
+ "resolved": "https://registry.npmjs.org/@prefecthq/prefect-design/-/prefect-design-2.14.15.tgz",
+ "integrity": "sha512-baAVVvn8oNAz2w5gIeppMTxT2cHayRgqG4VT7jYxXBr8oxhIo4nr7/5XM/eHjPmcxN7jSGpdzaiTNXcVKTuZgQ==",
"dependencies": {
"@fontsource-variable/inconsolata": "^5.0.18",
"@fontsource-variable/inter": "^5.0.18",
@@ -1133,13 +1149,13 @@
}
},
"node_modules/@prefecthq/prefect-ui-library": {
- "version": "3.11.21",
- "resolved": "https://registry.npmjs.org/@prefecthq/prefect-ui-library/-/prefect-ui-library-3.11.21.tgz",
- "integrity": "sha512-wBQmSAXUhGIJCQX7kTeMBxkLCVSJMhfClSDqAm/IKPNAN8Wr7r2A9uRemJspdVgk2KLolGOhAagAlHi1pZtzlg==",
+ "version": "3.11.24",
+ "resolved": "https://registry.npmjs.org/@prefecthq/prefect-ui-library/-/prefect-ui-library-3.11.24.tgz",
+ "integrity": "sha512-ZJyTKldD6h1MoDqxDQe8GldiS1TLnMa3Bi0lPQthehZUPGqBtwZm+5uXe+Gh0oiyw8CrgrQnv+agffKFWSLqbQ==",
"dependencies": {
"@prefecthq/graphs": "2.4.1",
"axios": "1.7.4",
- "cronstrue": "^2.51.0",
+ "cronstrue": "^2.52.0",
"d3": "7.9.0",
"date-fns": "4.1.0",
"date-fns-tz": "3.2.0",
@@ -1147,11 +1163,11 @@
"lodash.merge": "4.6.2"
},
"peerDependencies": {
- "@prefecthq/prefect-design": "^2.11.5",
+ "@prefecthq/prefect-design": "^2.14.15",
"@prefecthq/vue-charts": "^2.0.3",
"@prefecthq/vue-compositions": "^1.11.4",
"vee-validate": "^4.7.0",
- "vue": "^3.4.26",
+ "vue": "^3.5.0",
"vue-router": "^4.3.0"
}
},
@@ -1210,9 +1226,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz",
- "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz",
+ "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==",
"cpu": [
"arm"
],
@@ -1223,9 +1239,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz",
- "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz",
+ "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==",
"cpu": [
"arm64"
],
@@ -1236,9 +1252,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz",
- "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz",
+ "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==",
"cpu": [
"arm64"
],
@@ -1249,9 +1265,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz",
- "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz",
+ "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==",
"cpu": [
"x64"
],
@@ -1261,10 +1277,36 @@
"darwin"
]
},
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz",
+ "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz",
+ "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz",
- "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz",
+ "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==",
"cpu": [
"arm"
],
@@ -1275,9 +1317,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz",
- "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz",
+ "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==",
"cpu": [
"arm"
],
@@ -1288,9 +1330,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz",
- "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz",
+ "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==",
"cpu": [
"arm64"
],
@@ -1301,9 +1343,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz",
- "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz",
+ "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==",
"cpu": [
"arm64"
],
@@ -1313,10 +1355,23 @@
"linux"
]
},
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz",
+ "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz",
- "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz",
+ "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==",
"cpu": [
"ppc64"
],
@@ -1327,9 +1382,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz",
- "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz",
+ "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==",
"cpu": [
"riscv64"
],
@@ -1340,9 +1395,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz",
- "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz",
+ "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==",
"cpu": [
"s390x"
],
@@ -1353,9 +1408,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz",
- "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz",
+ "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==",
"cpu": [
"x64"
],
@@ -1366,9 +1421,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz",
- "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz",
+ "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==",
"cpu": [
"x64"
],
@@ -1379,9 +1434,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz",
- "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz",
+ "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==",
"cpu": [
"arm64"
],
@@ -1392,9 +1447,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz",
- "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz",
+ "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==",
"cpu": [
"ia32"
],
@@ -1405,9 +1460,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz",
- "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz",
+ "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==",
"cpu": [
"x64"
],
@@ -1518,9 +1573,9 @@
"integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ=="
},
"node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true
},
"node_modules/@types/json-schema": {
@@ -2626,9 +2681,9 @@
"devOptional": true
},
"node_modules/cronstrue": {
- "version": "2.51.0",
- "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.51.0.tgz",
- "integrity": "sha512-7EG9VaZZ5SRbZ7m25dmP6xaS0qe9ay6wywMskFOU/lMDKa+3gZr2oeT5OUfXwRP/Bcj8wxdYJ65AHU70CI3tsw==",
+ "version": "2.52.0",
+ "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.52.0.tgz",
+ "integrity": "sha512-NKgHbWkSZXJUcaBHSsyzC8eegD6bBd4O0oCI6XMIJ+y4Bq3v4w7sY3wfWoKPuVlq9pQHRB6od0lmKpIqi8TlKA==",
"bin": {
"cronstrue": "bin/cli.js"
}
@@ -3369,41 +3424,42 @@
}
},
"node_modules/esbuild": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
- "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
"dev": true,
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.21.5",
- "@esbuild/android-arm": "0.21.5",
- "@esbuild/android-arm64": "0.21.5",
- "@esbuild/android-x64": "0.21.5",
- "@esbuild/darwin-arm64": "0.21.5",
- "@esbuild/darwin-x64": "0.21.5",
- "@esbuild/freebsd-arm64": "0.21.5",
- "@esbuild/freebsd-x64": "0.21.5",
- "@esbuild/linux-arm": "0.21.5",
- "@esbuild/linux-arm64": "0.21.5",
- "@esbuild/linux-ia32": "0.21.5",
- "@esbuild/linux-loong64": "0.21.5",
- "@esbuild/linux-mips64el": "0.21.5",
- "@esbuild/linux-ppc64": "0.21.5",
- "@esbuild/linux-riscv64": "0.21.5",
- "@esbuild/linux-s390x": "0.21.5",
- "@esbuild/linux-x64": "0.21.5",
- "@esbuild/netbsd-x64": "0.21.5",
- "@esbuild/openbsd-x64": "0.21.5",
- "@esbuild/sunos-x64": "0.21.5",
- "@esbuild/win32-arm64": "0.21.5",
- "@esbuild/win32-ia32": "0.21.5",
- "@esbuild/win32-x64": "0.21.5"
+ "@esbuild/aix-ppc64": "0.24.0",
+ "@esbuild/android-arm": "0.24.0",
+ "@esbuild/android-arm64": "0.24.0",
+ "@esbuild/android-x64": "0.24.0",
+ "@esbuild/darwin-arm64": "0.24.0",
+ "@esbuild/darwin-x64": "0.24.0",
+ "@esbuild/freebsd-arm64": "0.24.0",
+ "@esbuild/freebsd-x64": "0.24.0",
+ "@esbuild/linux-arm": "0.24.0",
+ "@esbuild/linux-arm64": "0.24.0",
+ "@esbuild/linux-ia32": "0.24.0",
+ "@esbuild/linux-loong64": "0.24.0",
+ "@esbuild/linux-mips64el": "0.24.0",
+ "@esbuild/linux-ppc64": "0.24.0",
+ "@esbuild/linux-riscv64": "0.24.0",
+ "@esbuild/linux-s390x": "0.24.0",
+ "@esbuild/linux-x64": "0.24.0",
+ "@esbuild/netbsd-x64": "0.24.0",
+ "@esbuild/openbsd-arm64": "0.24.0",
+ "@esbuild/openbsd-x64": "0.24.0",
+ "@esbuild/sunos-x64": "0.24.0",
+ "@esbuild/win32-arm64": "0.24.0",
+ "@esbuild/win32-ia32": "0.24.0",
+ "@esbuild/win32-x64": "0.24.0"
}
},
"node_modules/escalade": {
@@ -4830,11 +4886,14 @@
}
},
"node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"engines": {
- "node": ">=10"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
}
},
"node_modules/lines-and-columns": {
@@ -5843,17 +5902,6 @@
}
}
},
- "node_modules/postcss-load-config/node_modules/lilconfig": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
- "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
"node_modules/postcss-nested": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
@@ -6096,12 +6144,12 @@
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
},
"node_modules/rollup": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz",
- "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz",
+ "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==",
"dev": true,
"dependencies": {
- "@types/estree": "1.0.5"
+ "@types/estree": "1.0.6"
},
"bin": {
"rollup": "dist/bin/rollup"
@@ -6111,22 +6159,25 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.22.4",
- "@rollup/rollup-android-arm64": "4.22.4",
- "@rollup/rollup-darwin-arm64": "4.22.4",
- "@rollup/rollup-darwin-x64": "4.22.4",
- "@rollup/rollup-linux-arm-gnueabihf": "4.22.4",
- "@rollup/rollup-linux-arm-musleabihf": "4.22.4",
- "@rollup/rollup-linux-arm64-gnu": "4.22.4",
- "@rollup/rollup-linux-arm64-musl": "4.22.4",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4",
- "@rollup/rollup-linux-riscv64-gnu": "4.22.4",
- "@rollup/rollup-linux-s390x-gnu": "4.22.4",
- "@rollup/rollup-linux-x64-gnu": "4.22.4",
- "@rollup/rollup-linux-x64-musl": "4.22.4",
- "@rollup/rollup-win32-arm64-msvc": "4.22.4",
- "@rollup/rollup-win32-ia32-msvc": "4.22.4",
- "@rollup/rollup-win32-x64-msvc": "4.22.4",
+ "@rollup/rollup-android-arm-eabi": "4.28.1",
+ "@rollup/rollup-android-arm64": "4.28.1",
+ "@rollup/rollup-darwin-arm64": "4.28.1",
+ "@rollup/rollup-darwin-x64": "4.28.1",
+ "@rollup/rollup-freebsd-arm64": "4.28.1",
+ "@rollup/rollup-freebsd-x64": "4.28.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.28.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.28.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.28.1",
+ "@rollup/rollup-linux-arm64-musl": "4.28.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.28.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.28.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.28.1",
+ "@rollup/rollup-linux-x64-gnu": "4.28.1",
+ "@rollup/rollup-linux-x64-musl": "4.28.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.28.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.28.1",
+ "@rollup/rollup-win32-x64-msvc": "4.28.1",
"fsevents": "~2.3.2"
}
},
@@ -6551,9 +6602,9 @@
}
},
"node_modules/tailwindcss": {
- "version": "3.4.15",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz",
- "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==",
+ "version": "3.4.16",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz",
+ "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -6564,7 +6615,7 @@
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.21.6",
- "lilconfig": "^2.1.0",
+ "lilconfig": "^3.1.3",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
@@ -6938,20 +6989,20 @@
}
},
"node_modules/vite": {
- "version": "5.4.11",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
- "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz",
+ "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==",
"dev": true,
"dependencies": {
- "esbuild": "^0.21.3",
- "postcss": "^8.4.43",
- "rollup": "^4.20.0"
+ "esbuild": "^0.24.0",
+ "postcss": "^8.4.49",
+ "rollup": "^4.23.0"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
- "node": "^18.0.0 || >=20.0.0"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
@@ -6960,19 +7011,25 @@
"fsevents": "~2.3.3"
},
"peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
"less": "*",
"lightningcss": "^1.21.0",
"sass": "*",
"sass-embedded": "*",
"stylus": "*",
"sugarss": "*",
- "terser": "^5.4.0"
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
+ "jiti": {
+ "optional": true
+ },
"less": {
"optional": true
},
@@ -6993,6 +7050,12 @@
},
"terser": {
"optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
}
}
},
@@ -7408,163 +7471,170 @@
}
},
"@esbuild/aix-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
- "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
"dev": true,
"optional": true
},
"@esbuild/android-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
- "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
"dev": true,
"optional": true
},
"@esbuild/android-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
- "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
"dev": true,
"optional": true
},
"@esbuild/android-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
- "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
"dev": true,
"optional": true
},
"@esbuild/darwin-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
- "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
"dev": true,
"optional": true
},
"@esbuild/darwin-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
- "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
"dev": true,
"optional": true
},
"@esbuild/freebsd-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
- "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
"dev": true,
"optional": true
},
"@esbuild/freebsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
- "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
- "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
"dev": true,
"optional": true
},
"@esbuild/linux-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
- "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
"dev": true,
"optional": true
},
"@esbuild/linux-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
- "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
"dev": true,
"optional": true
},
"@esbuild/linux-loong64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
- "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
"dev": true,
"optional": true
},
"@esbuild/linux-mips64el": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
- "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
"dev": true,
"optional": true
},
"@esbuild/linux-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
- "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-riscv64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
- "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
"dev": true,
"optional": true
},
"@esbuild/linux-s390x": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
- "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
"dev": true,
"optional": true
},
"@esbuild/linux-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
- "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
"dev": true,
"optional": true
},
"@esbuild/netbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
- "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/openbsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
"dev": true,
"optional": true
},
"@esbuild/openbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
- "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
"dev": true,
"optional": true
},
"@esbuild/sunos-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
- "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
"dev": true,
"optional": true
},
"@esbuild/win32-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
- "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
"dev": true,
"optional": true
},
"@esbuild/win32-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
- "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
"dev": true,
"optional": true
},
"@esbuild/win32-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
- "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
"dev": true,
"optional": true
},
@@ -8032,9 +8102,9 @@
}
},
"@prefecthq/prefect-design": {
- "version": "2.14.14",
- "resolved": "https://registry.npmjs.org/@prefecthq/prefect-design/-/prefect-design-2.14.14.tgz",
- "integrity": "sha512-yg56mzYBH40yes74YPhE5kX5JAdH/AAj0CIdRLVgm7GKN+V0IMN684NLlDiSqYJlhR4UYKDyb4rusS+O/ZTOEw==",
+ "version": "2.14.15",
+ "resolved": "https://registry.npmjs.org/@prefecthq/prefect-design/-/prefect-design-2.14.15.tgz",
+ "integrity": "sha512-baAVVvn8oNAz2w5gIeppMTxT2cHayRgqG4VT7jYxXBr8oxhIo4nr7/5XM/eHjPmcxN7jSGpdzaiTNXcVKTuZgQ==",
"requires": {
"@fontsource-variable/inconsolata": "^5.0.18",
"@fontsource-variable/inter": "^5.0.18",
@@ -8062,13 +8132,13 @@
}
},
"@prefecthq/prefect-ui-library": {
- "version": "3.11.21",
- "resolved": "https://registry.npmjs.org/@prefecthq/prefect-ui-library/-/prefect-ui-library-3.11.21.tgz",
- "integrity": "sha512-wBQmSAXUhGIJCQX7kTeMBxkLCVSJMhfClSDqAm/IKPNAN8Wr7r2A9uRemJspdVgk2KLolGOhAagAlHi1pZtzlg==",
+ "version": "3.11.24",
+ "resolved": "https://registry.npmjs.org/@prefecthq/prefect-ui-library/-/prefect-ui-library-3.11.24.tgz",
+ "integrity": "sha512-ZJyTKldD6h1MoDqxDQe8GldiS1TLnMa3Bi0lPQthehZUPGqBtwZm+5uXe+Gh0oiyw8CrgrQnv+agffKFWSLqbQ==",
"requires": {
"@prefecthq/graphs": "2.4.1",
"axios": "1.7.4",
- "cronstrue": "^2.51.0",
+ "cronstrue": "^2.52.0",
"d3": "7.9.0",
"date-fns": "4.1.0",
"date-fns-tz": "3.2.0",
@@ -8109,114 +8179,135 @@
}
},
"@rollup/rollup-android-arm-eabi": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz",
- "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz",
+ "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==",
"dev": true,
"optional": true
},
"@rollup/rollup-android-arm64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz",
- "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz",
+ "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==",
"dev": true,
"optional": true
},
"@rollup/rollup-darwin-arm64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz",
- "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz",
+ "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==",
"dev": true,
"optional": true
},
"@rollup/rollup-darwin-x64": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz",
- "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz",
+ "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-freebsd-arm64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz",
+ "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-freebsd-x64": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz",
+ "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz",
- "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz",
+ "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz",
- "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz",
+ "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-arm64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz",
- "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz",
+ "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-arm64-musl": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz",
- "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz",
+ "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==",
+ "dev": true,
+ "optional": true
+ },
+ "@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz",
+ "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz",
- "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz",
+ "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz",
- "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz",
+ "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-s390x-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz",
- "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz",
+ "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-x64-gnu": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz",
- "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz",
+ "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==",
"dev": true,
"optional": true
},
"@rollup/rollup-linux-x64-musl": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz",
- "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz",
+ "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==",
"dev": true,
"optional": true
},
"@rollup/rollup-win32-arm64-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz",
- "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz",
+ "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==",
"dev": true,
"optional": true
},
"@rollup/rollup-win32-ia32-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz",
- "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz",
+ "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==",
"dev": true,
"optional": true
},
"@rollup/rollup-win32-x64-msvc": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz",
- "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz",
+ "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==",
"dev": true,
"optional": true
},
@@ -8302,9 +8393,9 @@
"integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ=="
},
"@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true
},
"@types/json-schema": {
@@ -9068,9 +9159,9 @@
"devOptional": true
},
"cronstrue": {
- "version": "2.51.0",
- "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.51.0.tgz",
- "integrity": "sha512-7EG9VaZZ5SRbZ7m25dmP6xaS0qe9ay6wywMskFOU/lMDKa+3gZr2oeT5OUfXwRP/Bcj8wxdYJ65AHU70CI3tsw=="
+ "version": "2.52.0",
+ "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.52.0.tgz",
+ "integrity": "sha512-NKgHbWkSZXJUcaBHSsyzC8eegD6bBd4O0oCI6XMIJ+y4Bq3v4w7sY3wfWoKPuVlq9pQHRB6od0lmKpIqi8TlKA=="
},
"cross-spawn": {
"version": "7.0.6",
@@ -9614,34 +9705,35 @@
}
},
"esbuild": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
- "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
- "dev": true,
- "requires": {
- "@esbuild/aix-ppc64": "0.21.5",
- "@esbuild/android-arm": "0.21.5",
- "@esbuild/android-arm64": "0.21.5",
- "@esbuild/android-x64": "0.21.5",
- "@esbuild/darwin-arm64": "0.21.5",
- "@esbuild/darwin-x64": "0.21.5",
- "@esbuild/freebsd-arm64": "0.21.5",
- "@esbuild/freebsd-x64": "0.21.5",
- "@esbuild/linux-arm": "0.21.5",
- "@esbuild/linux-arm64": "0.21.5",
- "@esbuild/linux-ia32": "0.21.5",
- "@esbuild/linux-loong64": "0.21.5",
- "@esbuild/linux-mips64el": "0.21.5",
- "@esbuild/linux-ppc64": "0.21.5",
- "@esbuild/linux-riscv64": "0.21.5",
- "@esbuild/linux-s390x": "0.21.5",
- "@esbuild/linux-x64": "0.21.5",
- "@esbuild/netbsd-x64": "0.21.5",
- "@esbuild/openbsd-x64": "0.21.5",
- "@esbuild/sunos-x64": "0.21.5",
- "@esbuild/win32-arm64": "0.21.5",
- "@esbuild/win32-ia32": "0.21.5",
- "@esbuild/win32-x64": "0.21.5"
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+ "dev": true,
+ "requires": {
+ "@esbuild/aix-ppc64": "0.24.0",
+ "@esbuild/android-arm": "0.24.0",
+ "@esbuild/android-arm64": "0.24.0",
+ "@esbuild/android-x64": "0.24.0",
+ "@esbuild/darwin-arm64": "0.24.0",
+ "@esbuild/darwin-x64": "0.24.0",
+ "@esbuild/freebsd-arm64": "0.24.0",
+ "@esbuild/freebsd-x64": "0.24.0",
+ "@esbuild/linux-arm": "0.24.0",
+ "@esbuild/linux-arm64": "0.24.0",
+ "@esbuild/linux-ia32": "0.24.0",
+ "@esbuild/linux-loong64": "0.24.0",
+ "@esbuild/linux-mips64el": "0.24.0",
+ "@esbuild/linux-ppc64": "0.24.0",
+ "@esbuild/linux-riscv64": "0.24.0",
+ "@esbuild/linux-s390x": "0.24.0",
+ "@esbuild/linux-x64": "0.24.0",
+ "@esbuild/netbsd-x64": "0.24.0",
+ "@esbuild/openbsd-arm64": "0.24.0",
+ "@esbuild/openbsd-x64": "0.24.0",
+ "@esbuild/sunos-x64": "0.24.0",
+ "@esbuild/win32-arm64": "0.24.0",
+ "@esbuild/win32-ia32": "0.24.0",
+ "@esbuild/win32-x64": "0.24.0"
}
},
"escalade": {
@@ -10663,9 +10755,9 @@
}
},
"lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="
},
"lines-and-columns": {
"version": "1.2.4",
@@ -11380,13 +11472,6 @@
"requires": {
"lilconfig": "^3.0.0",
"yaml": "^2.3.4"
- },
- "dependencies": {
- "lilconfig": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
- "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow=="
- }
}
},
"postcss-nested": {
@@ -11544,28 +11629,31 @@
"integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
},
"rollup": {
- "version": "4.22.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz",
- "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==",
- "dev": true,
- "requires": {
- "@rollup/rollup-android-arm-eabi": "4.22.4",
- "@rollup/rollup-android-arm64": "4.22.4",
- "@rollup/rollup-darwin-arm64": "4.22.4",
- "@rollup/rollup-darwin-x64": "4.22.4",
- "@rollup/rollup-linux-arm-gnueabihf": "4.22.4",
- "@rollup/rollup-linux-arm-musleabihf": "4.22.4",
- "@rollup/rollup-linux-arm64-gnu": "4.22.4",
- "@rollup/rollup-linux-arm64-musl": "4.22.4",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4",
- "@rollup/rollup-linux-riscv64-gnu": "4.22.4",
- "@rollup/rollup-linux-s390x-gnu": "4.22.4",
- "@rollup/rollup-linux-x64-gnu": "4.22.4",
- "@rollup/rollup-linux-x64-musl": "4.22.4",
- "@rollup/rollup-win32-arm64-msvc": "4.22.4",
- "@rollup/rollup-win32-ia32-msvc": "4.22.4",
- "@rollup/rollup-win32-x64-msvc": "4.22.4",
- "@types/estree": "1.0.5",
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz",
+ "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==",
+ "dev": true,
+ "requires": {
+ "@rollup/rollup-android-arm-eabi": "4.28.1",
+ "@rollup/rollup-android-arm64": "4.28.1",
+ "@rollup/rollup-darwin-arm64": "4.28.1",
+ "@rollup/rollup-darwin-x64": "4.28.1",
+ "@rollup/rollup-freebsd-arm64": "4.28.1",
+ "@rollup/rollup-freebsd-x64": "4.28.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.28.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.28.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.28.1",
+ "@rollup/rollup-linux-arm64-musl": "4.28.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.28.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.28.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.28.1",
+ "@rollup/rollup-linux-x64-gnu": "4.28.1",
+ "@rollup/rollup-linux-x64-musl": "4.28.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.28.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.28.1",
+ "@rollup/rollup-win32-x64-msvc": "4.28.1",
+ "@types/estree": "1.0.6",
"fsevents": "~2.3.2"
}
},
@@ -11856,9 +11944,9 @@
}
},
"tailwindcss": {
- "version": "3.4.15",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz",
- "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==",
+ "version": "3.4.16",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz",
+ "integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==",
"requires": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -11869,7 +11957,7 @@
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.21.6",
- "lilconfig": "^2.1.0",
+ "lilconfig": "^3.1.3",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
@@ -12144,15 +12232,15 @@
}
},
"vite": {
- "version": "5.4.11",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
- "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.3.tgz",
+ "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==",
"dev": true,
"requires": {
- "esbuild": "^0.21.3",
+ "esbuild": "^0.24.0",
"fsevents": "~2.3.3",
- "postcss": "^8.4.43",
- "rollup": "^4.20.0"
+ "postcss": "^8.4.49",
+ "rollup": "^4.23.0"
}
},
"vscode-uri": {
diff --git a/ui/package.json b/ui/package.json
index 0f1d6af30c15..f68e5c7646a8 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -10,15 +10,15 @@
"validate:types": "vue-tsc --noEmit"
},
"dependencies": {
- "@prefecthq/prefect-design": "2.14.14",
- "@prefecthq/prefect-ui-library": "3.11.21",
+ "@prefecthq/prefect-design": "2.14.15",
+ "@prefecthq/prefect-ui-library": "3.11.24",
"@prefecthq/vue-charts": "2.0.5",
"@prefecthq/vue-compositions": "1.11.5",
"@types/lodash.debounce": "4.0.9",
"axios": "1.7.4",
"lodash.debounce": "4.0.8",
"lodash.merge": "^4.6.2",
- "tailwindcss": "3.4.15",
+ "tailwindcss": "3.4.16",
"vue": "3.5.13",
"vue-router": "4.5.0"
},
@@ -30,7 +30,7 @@
"eslint": "^8.57.1",
"ts-node": "10.9.2",
"typescript": "^5.7.2",
- "vite": "5.4.11",
+ "vite": "6.0.3",
"vue-tsc": "^2.1.10"
}
}