From e490dd6eeff641828f3593d14dcdf0a5b3f843a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isak=20Stenstr=C3=B6m?= Date: Tue, 14 Jan 2025 11:59:38 +0100 Subject: [PATCH 1/4] Replace favicon Co-authored-by: Oscar Falk --- frontend/src/app/icon.ico | Bin 9062 -> 0 bytes frontend/src/app/icon.svg | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+) delete mode 100644 frontend/src/app/icon.ico create mode 100644 frontend/src/app/icon.svg diff --git a/frontend/src/app/icon.ico b/frontend/src/app/icon.ico deleted file mode 100644 index 6cc2b26b146cfbaa1723cd581646336d893c7596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9062 zcmeHMO-xf+6h18vS}Is9tqP)j=u8-QOlE^dg^1!0il`C%7yt1e#Tb>u=`hjRI5BY& zCvl;P3u0VI;=+XsVO+Ryp@|C@E-cZ+g^Q_iVPayq^L@7z-+Q!7`^qG<=q0D^Ip^MU z&pY?NbG~~K@rWU&DfsrwUB5_+h*VT0`R-zozadNNO}Pts$Mlrmlx{<0be_l$7y}d1 z1frb@&6AWYU%p&!-MS@b&YY3w&!5Zo?c3$y!-w+z{d>87{kpWZwaKMRm*mi)Lvrul zJ$e25wLE$9L_U4`Bx~2Mm4Sf)xp?uS?Ay0bIyyS!%9Sf}^5jW*`}VCod-hCPT3Y1J zojY>w+&Ovq@}=zFy;~kVdL$n{e2|+rZ_1`ko20+LUydFfT{*`cJ;2wB@) zM~Bi%t2Pvh*!5-p8oNGJVe1gC3$Cnn1P6`IraX3(Fa2jueHsz8z>XQuJ_pWbrFBaI^63`F7fy zj(G6kfyNY%A3xUkg}8+nh4_OwhPZ|}Cxu^#O^AJnVN%$HScX`KScZ7##*G_On|KS> z3K1woAnOR!rfa_0kdl(EI2^7h3mFw-Y^gtN=r%JcC^4$W+FS~Jl0pPVHTmfDs$`80 z6_Kqqr;pX-63y0nB31Krt4#8a2A@PSORre8l%LI8rp?8!j3t8ph{v5TC*1C#1d+{Eaq_ z_*8VX5h*yT;woxC51LYFg$U#ufu^P=6LmMXb?erybhg^jP)B2+_H_DuWVpBJ+PrzQ z+PQP50v6D;YuBzp@Ud;%wp~Mgk6U&4{i3U@i%=u)hUaeIxN)PNd(WOdDqDhoL-|hL z(9mG6TemL3XWP4XZ_b1m^yK3M;y&2f*{SCRUQ#Y70Ut~^J}h3mxE{~0*Lwf{{mLz2 z{%daLZ)|M5jlHbrJ$Ue-azl(4_GiM){J_9^-GO118#-{{fWmvBRweT2i&CSh2t5&T_(Rf@DlZA-IAE+}g zwrts=;A>*dnl*#SyG@hXoeCZ1VU9}l_4Qqz3VXTQSh;d#obL$N{lbL{dE=d2=f~Q_ z_>OSRaj&D!pFbbV)kePku`lAprrdLQH{$u)%XK_rz+Cl$?+CC4WAJ0HHm0IK{OE!o zgV+L zGvk?s=MvT#;_FOjBGyRc=DqJK&l)>Uw*o@lHAO z|5!|Zcj~g`Q#A~GDwgdSYd`ux8+ewCvA6cm^c&Bf_RPe8PJN00+3fB<)R2DwAHts2 diff --git a/frontend/src/app/icon.svg b/frontend/src/app/icon.svg new file mode 100644 index 00000000..8728b245 --- /dev/null +++ b/frontend/src/app/icon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + From fe5f2bfeae8cc0ebf5423a8ed7a65ff64b3c87c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isak=20Stenstr=C3=B6m?= Date: Tue, 14 Jan 2025 13:32:38 +0100 Subject: [PATCH 2/4] Remove number animations in the frontend Co-authored-by: Oscar Falk --- frontend/package-lock.json | 19 ------------ frontend/package.json | 1 - frontend/src/app/trends/page.tsx | 15 ++++------ .../components/ActionCacheMetrics/index.tsx | 15 ++++------ .../components/ActionDataMetrics/index.tsx | 13 +++----- frontend/src/components/CommandLine/index.tsx | 1 - .../src/components/MemoryMetrics/index.tsx | 8 ----- .../src/components/NetworkMetrics/index.tsx | 21 +++++-------- .../src/components/TargetMetrics/index.tsx | 15 ++++------ .../Targets/TargetDetails/index.tsx | 9 ++---- .../components/Targets/TargetGrid/index.tsx | 5 +--- frontend/src/components/TestDetails/index.tsx | 13 +++----- frontend/src/components/TestGrid/index.tsx | 4 --- .../src/components/TestsMetrics/index.tsx | 18 +++++------ .../src/components/TimingMetrics/index.tsx | 30 ++++++++----------- 15 files changed, 53 insertions(+), 134 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8355fb15..1cd9e1e6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19,7 +19,6 @@ "lodash": "^4.17.21", "next": "14.2.3", "react": "^18", - "react-countup": "^6.5.3", "react-dom": "^18", "recharts": "^2.12.7", "uuid": "^9.0.1", @@ -4155,12 +4154,6 @@ } } }, - "node_modules/countup.js": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.8.0.tgz", - "integrity": "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==", - "license": "MIT" - }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", @@ -8275,18 +8268,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-countup": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.5.3.tgz", - "integrity": "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==", - "license": "MIT", - "dependencies": { - "countup.js": "^2.8.0" - }, - "peerDependencies": { - "react": ">= 16.3.0" - } - }, "node_modules/react-dom": { "version": "18.3.1", "license": "MIT", diff --git a/frontend/package.json b/frontend/package.json index d0781afe..5f2ef8aa 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -28,7 +28,6 @@ "next-runtime-env": "^3.2.2", "rc-menu": "^9.13.0", "react": "^18.3.1", - "react-countup": "^6.5.3", "react-dom": "^18.3.1", "recharts": "^2.12.7", "uuid": "^9.0.1", diff --git a/frontend/src/app/trends/page.tsx b/frontend/src/app/trends/page.tsx index f1646a60..fac58ca8 100644 --- a/frontend/src/app/trends/page.tsx +++ b/frontend/src/app/trends/page.tsx @@ -10,7 +10,6 @@ import { useQuery } from '@apollo/client'; import FIND_BUILD_DURATIONS from './index.graphql'; import { AreaChart, XAxis, YAxis, CartesianGrid, Tooltip, Area } from 'recharts'; import type { StatisticProps } from "antd/lib"; -import CountUp from 'react-countup'; const Page: React.FC = () => { @@ -59,10 +58,6 @@ const Page: React.FC = () => { } }); - const formatter: StatisticProps['formatter'] = (value) => ( - - ); - var avg: number = dataPoints.reduce((sum, item) => sum + item.duration, 0) / dataPoints.length; var medianVals = dataPoints.map(x => x.duration).sort((a, b) => a - b); var medianMid = Math.floor(dataPoints.length / 2); @@ -91,11 +86,11 @@ const Page: React.FC = () => { titleBits={[Invocation Durations]}> - - - - - + + + + + diff --git a/frontend/src/components/ActionCacheMetrics/index.tsx b/frontend/src/components/ActionCacheMetrics/index.tsx index 0923faab..b6193b3d 100644 --- a/frontend/src/components/ActionCacheMetrics/index.tsx +++ b/frontend/src/components/ActionCacheMetrics/index.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useState } from "react"; import { PieChart, Pie, Cell, Legend, BarChart, Bar, LabelList } from 'recharts'; import { Table, Row, Col, Statistic, Tooltip, Space } from 'antd'; import type { StatisticProps, TableColumnsType } from "antd/lib"; -import CountUp from 'react-countup'; import { ActionCacheStatistics, ActionSummary, MissDetail } from "@/graphql/__generated__/graphql"; import PortalCard from "../PortalCard"; import { PieChartOutlined, DashboardOutlined, HddOutlined } from "@ant-design/icons"; @@ -18,10 +17,6 @@ interface MissDetailDisplayDataType { rate: string; } -const formatter: StatisticProps['formatter'] = (value) => ( - -); - var ac_colors = [ "grey", //unknown @@ -114,11 +109,11 @@ const AcMetrics: React.FC<{ acMetrics: ActionSummary | undefined; }> = ({ acMetr - - - - - + + + + + diff --git a/frontend/src/components/ActionDataMetrics/index.tsx b/frontend/src/components/ActionDataMetrics/index.tsx index ec69d796..b892aa07 100644 --- a/frontend/src/components/ActionDataMetrics/index.tsx +++ b/frontend/src/components/ActionDataMetrics/index.tsx @@ -3,7 +3,6 @@ import { PieChart, Pie, Cell } from 'recharts'; import { Table, Row, Col, Space, Statistic } from 'antd'; import { BuildOutlined, PieChartOutlined } from "@ant-design/icons"; import type { StatisticProps, TableColumnsType } from "antd/lib"; -import CountUp from 'react-countup'; import { ActionSummary, ActionData } from "@/graphql/__generated__/graphql"; import PortalCard from "../PortalCard"; import { renderActiveShape, newColorFind } from "../Utilities/renderShape" @@ -16,10 +15,6 @@ interface ActionDataGraphDisplayType { color: string; } -const formatter: StatisticProps['formatter'] = (value) => ( - -); - interface ActionDataColumnType { key: React.Key; mnemonic: string; @@ -107,10 +102,10 @@ const ActionDataMetrics: React.FC<{ acMetrics: ActionSummary | undefined; }> = ( } type="inner" titleBits={["Actions"]}> - - - - + + + + diff --git a/frontend/src/components/CommandLine/index.tsx b/frontend/src/components/CommandLine/index.tsx index 4864e969..0437127a 100644 --- a/frontend/src/components/CommandLine/index.tsx +++ b/frontend/src/components/CommandLine/index.tsx @@ -2,7 +2,6 @@ import React from "react"; import { Space, Table, Row, Col, Statistic, List } from 'antd'; import { CodeOutlined, DeploymentUnitOutlined, SearchOutlined } from '@ant-design/icons'; import type { StatisticProps, TableColumnsType } from "antd/lib"; -import CountUp from 'react-countup'; import { BazelCommand, TargetMetrics, TargetPair } from "@/graphql/__generated__/graphql"; import PortalCard from "../PortalCard"; import { SearchFilterIcon, SearchWidget } from '@/components/SearchWidgets'; diff --git a/frontend/src/components/MemoryMetrics/index.tsx b/frontend/src/components/MemoryMetrics/index.tsx index d7e97dfa..1e3f530d 100644 --- a/frontend/src/components/MemoryMetrics/index.tsx +++ b/frontend/src/components/MemoryMetrics/index.tsx @@ -2,7 +2,6 @@ import React, { useCallback, useState } from "react"; import { PieChart, Pie, Cell, Legend } from "recharts"; import { Table, Row, Col, Statistic, Space } from "antd"; import type { StatisticProps, TableColumnsType } from "antd/lib"; -import CountUp from "react-countup"; import { MemoryMetrics, GarbageMetrics } from "@/graphql/__generated__/graphql"; import PortalCard from "../PortalCard"; import { PieChartOutlined, HddOutlined } from "@ant-design/icons"; @@ -16,10 +15,6 @@ interface GarbageMetricDetailDisplayType { color: string; } -const formatter: StatisticProps["formatter"] = (value) => ( - -); - const garbage_columns: TableColumnsType = [ { title: "Type", @@ -70,17 +65,14 @@ const MemoryMetricsDisplay: React.FC<{ diff --git a/frontend/src/components/NetworkMetrics/index.tsx b/frontend/src/components/NetworkMetrics/index.tsx index c99b3bd7..01da1f6a 100644 --- a/frontend/src/components/NetworkMetrics/index.tsx +++ b/frontend/src/components/NetworkMetrics/index.tsx @@ -2,14 +2,9 @@ import React from "react"; import { Statistic, Space, Row } from 'antd'; import { FieldTimeOutlined } from "@ant-design/icons"; import type { StatisticProps } from "antd/lib"; -import CountUp from 'react-countup'; import { NetworkMetrics, SystemNetworkStats } from "@/graphql/__generated__/graphql"; import PortalCard from "../PortalCard"; -const formatter: StatisticProps['formatter'] = (value) => ( - -); - const NetworkMetricsDisplay: React.FC<{ networkMetrics: NetworkMetrics | undefined }> = ({ networkMetrics: networkMetrics }) => { @@ -19,14 +14,14 @@ const NetworkMetricsDisplay: React.FC<{ networkMetrics: NetworkMetrics | undefin }> - - - - - - - - + + + + + + + + diff --git a/frontend/src/components/TargetMetrics/index.tsx b/frontend/src/components/TargetMetrics/index.tsx index 19e78517..1629a174 100644 --- a/frontend/src/components/TargetMetrics/index.tsx +++ b/frontend/src/components/TargetMetrics/index.tsx @@ -2,7 +2,6 @@ import React from "react"; import { Space, Table, Row, Col, Statistic } from 'antd'; import { DeploymentUnitOutlined, SearchOutlined } from '@ant-design/icons'; import type { StatisticProps, TableColumnsType } from "antd/lib"; -import CountUp from 'react-countup'; import { TargetMetrics, TargetPair } from "@/graphql/__generated__/graphql"; import PortalCard from "../PortalCard"; import { SearchFilterIcon, SearchWidget } from '@/components/SearchWidgets'; @@ -20,10 +19,6 @@ interface TargetDataType { failure_reason: string //failure reason if any } -const formatter: StatisticProps['formatter'] = (value) => ( - -); - const TargetMetricsDisplay: React.FC<{ targetMetrics: TargetMetrics | undefined | null, targetData: TargetPair[] | undefined | null, @@ -176,11 +171,11 @@ const TargetMetricsDisplay: React.FC<{ } titleBits={["Targets"]}> - - - - - + + + + + diff --git a/frontend/src/components/Targets/TargetDetails/index.tsx b/frontend/src/components/Targets/TargetDetails/index.tsx index 57cda98e..1bf191eb 100644 --- a/frontend/src/components/Targets/TargetDetails/index.tsx +++ b/frontend/src/components/Targets/TargetDetails/index.tsx @@ -2,7 +2,6 @@ import React, { useState } from 'react'; import { Space, Row, Statistic, TableColumnsType, Table } from 'antd'; import { TestStatusEnum } from '../../TestStatusTag'; import type { StatisticProps } from "antd/lib"; -import CountUp from 'react-countup'; import { useQuery } from '@apollo/client'; import { FindTargetsQueryVariables } from '@/graphql/__generated__/graphql'; import PortalAlert from '../../PortalAlert'; @@ -20,10 +19,6 @@ interface Props { label: string } -const formatter: StatisticProps['formatter'] = (value) => ( - -); - export interface TargetStatusType { label: string invocationId: string, @@ -90,8 +85,8 @@ const TestDetails: React.FC = ({ label }) => {

{label}

- - + + } titleBits={["Target Duration Over Time"]} > diff --git a/frontend/src/components/Targets/TargetGrid/index.tsx b/frontend/src/components/Targets/TargetGrid/index.tsx index 9aff674c..1301d9f9 100644 --- a/frontend/src/components/Targets/TargetGrid/index.tsx +++ b/frontend/src/components/Targets/TargetGrid/index.tsx @@ -3,7 +3,6 @@ import { TableColumnsType } from "antd/lib" import { Space, Row, Statistic, Table, TableProps, TablePaginationConfig, Pagination, Alert } from 'antd'; import { TestStatusEnum } from '../../TestStatusTag'; import type { StatisticProps } from "antd/lib"; -import CountUp from 'react-countup'; import { SearchFilterIcon, SearchWidget } from '@/components/SearchWidgets'; import { SearchOutlined } from '@ant-design/icons'; import { useQuery } from '@apollo/client'; @@ -30,9 +29,7 @@ interface TargetGridRowDataType { key: React.Key; label: string; } -const formatter: StatisticProps['formatter'] = (value) => ( - -); + const PAGE_SIZE = 20 const columns: TableColumnsType = [ { diff --git a/frontend/src/components/TestDetails/index.tsx b/frontend/src/components/TestDetails/index.tsx index a2a5bbd1..9e9c1d28 100644 --- a/frontend/src/components/TestDetails/index.tsx +++ b/frontend/src/components/TestDetails/index.tsx @@ -2,7 +2,6 @@ import React, { useState } from 'react'; import { Space, Row, Statistic, TableColumnsType, Table } from 'antd'; import TestStatusTag, { TestStatusEnum } from '../TestStatusTag'; import type { StatisticProps } from "antd/lib"; -import CountUp from 'react-countup'; import { useQuery } from '@apollo/client'; import { FindTestsQueryVariables, TestCollectionOverallStatus } from '@/graphql/__generated__/graphql'; import TestGridRow from '../TestGridRow'; @@ -20,10 +19,6 @@ interface Props { label: string } -const formatter: StatisticProps['formatter'] = (value) => ( - -); - export interface TestStatusType { label: string invocationId: string, @@ -113,10 +108,10 @@ const TestDetails: React.FC = ({ label }) => {

{label}

- - - - + + + + } titleBits={["Test Duration Over Time"]} > diff --git a/frontend/src/components/TestGrid/index.tsx b/frontend/src/components/TestGrid/index.tsx index 323cb223..50b54f06 100644 --- a/frontend/src/components/TestGrid/index.tsx +++ b/frontend/src/components/TestGrid/index.tsx @@ -3,7 +3,6 @@ import { TableColumnsType } from "antd/lib" import { Space, Row, Statistic, Table, TableProps, TablePaginationConfig, Pagination } from 'antd'; import { TestStatusEnum } from '../TestStatusTag'; import type { StatisticProps } from "antd/lib"; -import CountUp from 'react-countup'; import { SearchFilterIcon, SearchWidget } from '@/components/SearchWidgets'; import { SearchOutlined } from '@ant-design/icons'; import { useQuery } from '@apollo/client'; @@ -19,9 +18,6 @@ import { millisecondsToTime } from '../Utilities/time'; import { GET_TEST_LABELS } from './graphql'; interface Props {} -const formatter: StatisticProps['formatter'] = (value) => ( - -); export interface TestStatusType { label: string invocationId: string, diff --git a/frontend/src/components/TestsMetrics/index.tsx b/frontend/src/components/TestsMetrics/index.tsx index 2f459f63..144e4606 100644 --- a/frontend/src/components/TestsMetrics/index.tsx +++ b/frontend/src/components/TestsMetrics/index.tsx @@ -1,7 +1,6 @@ import React from "react"; import { Table, Row, Statistic, Space } from 'antd'; import type { StatisticProps, TableColumnsType } from "antd/lib"; -import CountUp from 'react-countup'; import TestStatusTag from "../TestStatusTag"; import { TestCollection } from "@/graphql/__generated__/graphql"; import { TestStatusEnum } from "../TestStatusTag"; @@ -22,9 +21,6 @@ interface TestDataType { cached_remote: boolean | null; duration: number; } -const formatter: StatisticProps['formatter'] = (value) => ( - -); const test_columns: TableColumnsType = [ { @@ -196,13 +192,13 @@ const TestMetricsDisplay: React.FC<{ } titleBits={["Tests"]}> - - - - - - - + + + + + + + diff --git a/frontend/src/components/TimingMetrics/index.tsx b/frontend/src/components/TimingMetrics/index.tsx index 84d7bc32..a3b83b4f 100644 --- a/frontend/src/components/TimingMetrics/index.tsx +++ b/frontend/src/components/TimingMetrics/index.tsx @@ -2,15 +2,9 @@ import React from "react"; import { Statistic, Space, Row } from 'antd'; import { FieldTimeOutlined, BuildOutlined, } from "@ant-design/icons"; import type { StatisticProps } from "antd/lib"; -import CountUp from 'react-countup'; import { BuildGraphMetrics, TimingMetrics } from "@/graphql/__generated__/graphql"; import PortalCard from "../PortalCard"; - -const formatter: StatisticProps['formatter'] = (value) => ( - -); - const TimingMetricsDisplay: React.FC<{ buildGraphMetrics: BuildGraphMetrics | undefined, timingMetrics: TimingMetrics | undefined @@ -24,24 +18,24 @@ const TimingMetricsDisplay: React.FC<{ }> - - - - - + + + + + }> - - - - - - - + + + + + + + From e167029dfe9d382c25fe04fdc5b0aa0b4f1afd2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isak=20Stenstr=C3=B6m?= Date: Wed, 19 Feb 2025 13:25:36 +0100 Subject: [PATCH 3/4] Integrate bb-scheduler web interface into bb-portal Co-authored-by: Oscar Falk --- .bazelignore | 1 + BUILD.bazel | 6 + MODULE.bazel | 26 + MODULE.bazel.lock | 597 +- README.md | 4 + cmd/bb_portal/BUILD.bazel | 10 +- cmd/bb_portal/grpcweb_proxy_server.go | 83 + cmd/bb_portal/main.go | 4 +- config/portal.jsonnet | 35 + frontend/.env | 1 + frontend/package-lock.json | 5919 ++++++++--- frontend/package.json | 18 +- frontend/pnpm-lock.yaml | 3198 ++++-- frontend/scripts/grpc-client-gen.sh | 22 + frontend/src/app/operations/[slug]/page.tsx | 35 + frontend/src/app/operations/page.tsx | 26 + frontend/src/app/scheduler/page.tsx | 24 + frontend/src/app/scheduler/workers/page.tsx | 81 + .../src/components/AppBar/index.module.css | 6 +- frontend/src/components/AppBar/index.tsx | 42 +- .../src/components/OperationDetails/index.tsx | 94 + .../OperationStateDisplay/index.tsx | 104 + .../components/OperationStatusTag/index.tsx | 102 + .../src/components/OperationsGrid/Columns.tsx | 56 + .../src/components/OperationsGrid/index.tsx | 81 + .../src/components/OperationsGrid/utils.ts | 24 + .../index.module.css | 11 + .../OperationsInvocationFilter/index.tsx | 37 + .../PlatformQueuesTable/Columns.tsx | 123 + .../components/PlatformQueuesTable/index.tsx | 76 + .../components/PlatformQueuesTable/types.ts | 6 + .../src/components/PropertyTagList/index.tsx | 25 + .../src/components/PropertyTagList/types.ts | 4 + .../src/components/SchedulerGrid/index.tsx | 45 + frontend/src/components/Utilities/time.ts | 15 +- frontend/src/components/WorkersGrid/index.tsx | 116 + frontend/src/components/WorkersInfo/index.tsx | 34 + .../src/components/WorkersTable/Columns.tsx | 82 + .../src/components/WorkersTable/index.tsx | 113 + frontend/src/components/WorkersTable/types.ts | 6 + .../WorkersTablePageSelector/index.tsx | 38 + .../WorkersTableTypeSelector/index.tsx | 30 + frontend/src/context/GrpcClientsContext.tsx | 11 + frontend/src/context/GrpcClientsProvider.tsx | 31 + .../remote/execution/v2/remote_execution.ts | 9357 +++++++++++++++++ .../grpc-client/build/bazel/semver/semver.ts | 155 + .../buildqueuestate/buildqueuestate.ts | 4456 ++++++++ .../lib/grpc-client/google/api/annotations.ts | 9 + .../src/lib/grpc-client/google/api/client.ts | 2549 +++++ .../src/lib/grpc-client/google/api/http.ts | 766 ++ .../grpc-client/google/api/launch_stage.ts | 121 + .../google/longrunning/operations.ts | 1172 +++ .../lib/grpc-client/google/protobuf/any.ts | 247 + .../grpc-client/google/protobuf/descriptor.ts | 6712 ++++++++++++ .../grpc-client/google/protobuf/duration.ts | 185 + .../lib/grpc-client/google/protobuf/empty.ts | 82 + .../lib/grpc-client/google/protobuf/struct.ts | 584 + .../grpc-client/google/protobuf/timestamp.ts | 214 + .../grpc-client/google/protobuf/wrappers.ts | 687 ++ .../src/lib/grpc-client/google/rpc/status.ts | 153 + .../opentelemetry/proto/common/v1/common.ts | 592 ++ .../execution/v2/remote_execution.proto | 2189 ++++ .../src/proto/build/bazel/semver/semver.proto | 41 + .../buildqueuestate/buildqueuestate.proto | 586 ++ .../src/proto/google/api/annotations.proto | 31 + frontend/src/proto/google/api/client.proto | 472 + frontend/src/proto/google/api/http.proto | 371 + .../src/proto/google/api/launch_stage.proto | 72 + .../proto/google/longrunning/operations.proto | 246 + frontend/src/proto/google/protobuf/any.proto | 162 + .../proto/google/protobuf/descriptor.proto | 1354 +++ .../src/proto/google/protobuf/duration.proto | 115 + .../src/proto/google/protobuf/empty.proto | 51 + .../src/proto/google/protobuf/timestamp.proto | 144 + .../src/proto/google/protobuf/wrappers.proto | 157 + frontend/src/proto/google/rpc/status.proto | 49 + .../proto/common/v1/common.proto | 80 + frontend/src/theme/theme.module.css | 7 +- frontend/src/types/ListWorkerFilterType.ts | 4 + .../src/utils/digestFunctionUtils.test.ts | 99 + frontend/src/utils/digestFunctionUtils.ts | 30 + frontend/src/utils/formatValues.ts | 80 + frontend/src/utils/grpcErrorCodes.ts | 22 + frontend/src/utils/navigation.tsx | 4 +- frontend/src/utils/storage.ts | 2 +- frontend/vitest.config.mts | 10 + go.mod | 34 +- go.sum | 293 +- internal/api/grpcweb/BUILD.bazel | 24 + .../grpcweb/buildqueuestateproxy/BUILD.bazel | 31 + .../grpcweb/buildqueuestateproxy/server.go | 168 + .../buildqueuestateproxy/server_test.go | 319 + internal/api/grpcweb/common.go | 20 + internal/api/grpcweb/common_test.go | 51 + patches/rules_antlr/antlr-4.10.diff | 77 + patches/rules_antlr/bzlmod.diff | 43 + pkg/proto/configuration/bb_portal/BUILD.bazel | 2 + .../configuration/bb_portal/bb_portal.pb.go | 226 +- .../configuration/bb_portal/bb_portal.proto | 22 + 99 files changed, 44229 insertions(+), 2902 deletions(-) create mode 100644 cmd/bb_portal/grpcweb_proxy_server.go create mode 100755 frontend/scripts/grpc-client-gen.sh create mode 100644 frontend/src/app/operations/[slug]/page.tsx create mode 100644 frontend/src/app/operations/page.tsx create mode 100644 frontend/src/app/scheduler/page.tsx create mode 100644 frontend/src/app/scheduler/workers/page.tsx create mode 100644 frontend/src/components/OperationDetails/index.tsx create mode 100644 frontend/src/components/OperationStateDisplay/index.tsx create mode 100644 frontend/src/components/OperationStatusTag/index.tsx create mode 100644 frontend/src/components/OperationsGrid/Columns.tsx create mode 100644 frontend/src/components/OperationsGrid/index.tsx create mode 100644 frontend/src/components/OperationsGrid/utils.ts create mode 100644 frontend/src/components/OperationsInvocationFilter/index.module.css create mode 100644 frontend/src/components/OperationsInvocationFilter/index.tsx create mode 100644 frontend/src/components/PlatformQueuesTable/Columns.tsx create mode 100644 frontend/src/components/PlatformQueuesTable/index.tsx create mode 100644 frontend/src/components/PlatformQueuesTable/types.ts create mode 100644 frontend/src/components/PropertyTagList/index.tsx create mode 100644 frontend/src/components/PropertyTagList/types.ts create mode 100644 frontend/src/components/SchedulerGrid/index.tsx create mode 100644 frontend/src/components/WorkersGrid/index.tsx create mode 100644 frontend/src/components/WorkersInfo/index.tsx create mode 100644 frontend/src/components/WorkersTable/Columns.tsx create mode 100644 frontend/src/components/WorkersTable/index.tsx create mode 100644 frontend/src/components/WorkersTable/types.ts create mode 100644 frontend/src/components/WorkersTablePageSelector/index.tsx create mode 100644 frontend/src/components/WorkersTableTypeSelector/index.tsx create mode 100644 frontend/src/context/GrpcClientsContext.tsx create mode 100644 frontend/src/context/GrpcClientsProvider.tsx create mode 100644 frontend/src/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution.ts create mode 100644 frontend/src/lib/grpc-client/build/bazel/semver/semver.ts create mode 100644 frontend/src/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate.ts create mode 100644 frontend/src/lib/grpc-client/google/api/annotations.ts create mode 100644 frontend/src/lib/grpc-client/google/api/client.ts create mode 100644 frontend/src/lib/grpc-client/google/api/http.ts create mode 100644 frontend/src/lib/grpc-client/google/api/launch_stage.ts create mode 100644 frontend/src/lib/grpc-client/google/longrunning/operations.ts create mode 100644 frontend/src/lib/grpc-client/google/protobuf/any.ts create mode 100644 frontend/src/lib/grpc-client/google/protobuf/descriptor.ts create mode 100644 frontend/src/lib/grpc-client/google/protobuf/duration.ts create mode 100644 frontend/src/lib/grpc-client/google/protobuf/empty.ts create mode 100644 frontend/src/lib/grpc-client/google/protobuf/struct.ts create mode 100644 frontend/src/lib/grpc-client/google/protobuf/timestamp.ts create mode 100644 frontend/src/lib/grpc-client/google/protobuf/wrappers.ts create mode 100644 frontend/src/lib/grpc-client/google/rpc/status.ts create mode 100644 frontend/src/lib/grpc-client/opentelemetry/proto/common/v1/common.ts create mode 100644 frontend/src/proto/build/bazel/remote/execution/v2/remote_execution.proto create mode 100644 frontend/src/proto/build/bazel/semver/semver.proto create mode 100644 frontend/src/proto/buildbarn/buildqueuestate/buildqueuestate.proto create mode 100644 frontend/src/proto/google/api/annotations.proto create mode 100644 frontend/src/proto/google/api/client.proto create mode 100644 frontend/src/proto/google/api/http.proto create mode 100644 frontend/src/proto/google/api/launch_stage.proto create mode 100644 frontend/src/proto/google/longrunning/operations.proto create mode 100644 frontend/src/proto/google/protobuf/any.proto create mode 100644 frontend/src/proto/google/protobuf/descriptor.proto create mode 100644 frontend/src/proto/google/protobuf/duration.proto create mode 100644 frontend/src/proto/google/protobuf/empty.proto create mode 100644 frontend/src/proto/google/protobuf/timestamp.proto create mode 100644 frontend/src/proto/google/protobuf/wrappers.proto create mode 100644 frontend/src/proto/google/rpc/status.proto create mode 100644 frontend/src/proto/opentelemetry/proto/common/v1/common.proto create mode 100644 frontend/src/types/ListWorkerFilterType.ts create mode 100644 frontend/src/utils/digestFunctionUtils.test.ts create mode 100644 frontend/src/utils/digestFunctionUtils.ts create mode 100644 frontend/src/utils/formatValues.ts create mode 100644 frontend/src/utils/grpcErrorCodes.ts create mode 100644 frontend/vitest.config.mts create mode 100644 internal/api/grpcweb/BUILD.bazel create mode 100644 internal/api/grpcweb/buildqueuestateproxy/BUILD.bazel create mode 100644 internal/api/grpcweb/buildqueuestateproxy/server.go create mode 100644 internal/api/grpcweb/buildqueuestateproxy/server_test.go create mode 100644 internal/api/grpcweb/common.go create mode 100644 internal/api/grpcweb/common_test.go create mode 100644 patches/rules_antlr/antlr-4.10.diff create mode 100644 patches/rules_antlr/bzlmod.diff diff --git a/.bazelignore b/.bazelignore index c3ff3d32..221fc147 100644 --- a/.bazelignore +++ b/.bazelignore @@ -1,2 +1,3 @@ bazel-demo third_party/bazel/_generate-via-bazel +frontend/node_modules \ No newline at end of file diff --git a/BUILD.bazel b/BUILD.bazel index cc31c720..74499e95 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -2,18 +2,24 @@ load("@com_github_bazelbuild_buildtools//buildifier:def.bzl", "buildifier") load("@gazelle//:def.bzl", "gazelle") +# gazelle:exclude frontend/src/proto # gazelle:go_grpc_compilers @rules_go//proto:go_proto,@rules_go//proto:go_grpc_v2 # gazelle:prefix github.com/buildbarn/bb-portal # gazelle:go_naming_convention_external import +# gazelle:resolve proto go build/bazel/remote/execution/v2/remote_execution.proto @bazel_remote_apis//build/bazel/remote/execution/v2:remote_execution_go_proto +# gazelle:resolve proto go google/rpc/status.proto @org_golang_google_genproto_googleapis_rpc//status # gazelle:resolve proto go pkg/proto/configuration/auth/auth.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/auth # gazelle:resolve proto go pkg/proto/configuration/global/global.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/global # gazelle:resolve proto go pkg/proto/configuration/grpc/grpc.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/grpc # gazelle:resolve proto go pkg/proto/configuration/http/http.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/http +# gazelle:resolve proto build/bazel/remote/execution/v2/remote_execution.proto @bazel_remote_apis//build/bazel/remote/execution/v2:remote_execution_proto +# gazelle:resolve proto google/rpc/status.proto @googleapis//google/rpc:status_proto # gazelle:resolve proto pkg/proto/configuration/auth/auth.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/auth:auth_proto # gazelle:resolve proto pkg/proto/configuration/global/global.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/global:global_proto # gazelle:resolve proto pkg/proto/configuration/grpc/grpc.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/grpc:grpc_proto # gazelle:resolve proto pkg/proto/configuration/http/http.proto @com_github_buildbarn_bb_storage//pkg/proto/configuration/http:http_proto # gazelle:resolve go github.com/buildbarn/bb-portal/pkg/proto/configuration/bb_portal //pkg/proto/configuration/bb_portal +# gazelle:resolve go github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2 @bazel_remote_apis//build/bazel/remote/execution/v2:remote_execution_go_proto gazelle( name = "gazelle", ) diff --git a/MODULE.bazel b/MODULE.bazel index 419277ab..952a140f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,7 +5,9 @@ module(name = "com_github_buildbarn_bb_portal") bazel_dep(name = "bazel_remote_apis", version = "0.0.0") +bazel_dep(name = "com_github_buildbarn_bb_remote_execution") bazel_dep(name = "com_github_buildbarn_bb_storage") +bazel_dep(name = "com_github_buildbarn_go_xdr") bazel_dep(name = "gazelle", version = "0.38.0") bazel_dep(name = "googleapis", version = "0.0.0-20240819-fe8ba054a") bazel_dep(name = "googletest", version = "1.15.2") @@ -21,6 +23,12 @@ git_override( remote = "https://github.com/bazelbuild/remote-apis.git", ) +git_override( + module_name = "com_github_buildbarn_bb_remote_execution", + commit = "853626adcafd25a948f90b05a251bfba9a0e236f", + remote = "https://github.com/buildbarn/bb-remote-execution.git", +) + git_override( module_name = "com_github_buildbarn_bb_storage", commit = "0941111f29e31905e4081e6262bccf0c123940ed", @@ -31,6 +39,22 @@ git_override( remote = "https://github.com/buildbarn/bb-storage.git", ) +git_override( + module_name = "com_github_buildbarn_go_xdr", + commit = "236788cf9e8948a1e8875c7dd243e2be180cdfd7", + remote = "https://github.com/buildbarn/go-xdr.git", +) + +git_override( + module_name = "rules_antlr", + commit = "89a29cca479363a5aee53e203719510bdc6be6ff", + patches = [ + "//:patches/rules_antlr/antlr-4.10.diff", + "//:patches/rules_antlr/bzlmod.diff", + ], + remote = "https://github.com/marcohu/rules_antlr.git", +) + git_override( module_name = "gazelle", commit = "4d0129d7adae33e8e648d3624aff8fa8f93f375b", @@ -65,7 +89,9 @@ use_repo( "com_github_gorilla_mux", "com_github_hashicorp_go_multierror", "com_github_hedwigz_entviz", + "com_github_improbable_eng_grpc_web", "com_github_jackc_pgx_v5", + "com_github_jmespath_go_jmespath", "com_github_machinebox_graphql", "com_github_mattn_go_sqlite3", "com_github_pkg_errors", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 9e2a0d8d..6993b50f 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -153,6 +153,7 @@ "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", "https://bcr.bazel.build/modules/rules_java/7.4.0/MODULE.bazel": "a592852f8a3dd539e82ee6542013bf2cadfc4c6946be8941e189d224500a8934", + "https://bcr.bazel.build/modules/rules_java/7.5.0/MODULE.bazel": "b329bf9aa07a58bd1ccb37bfdcd9528acf6f12712efb38c3a8553c2cc2494806", "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", "https://bcr.bazel.build/modules/rules_java/7.6.1/source.json": "8f3f3076554e1558e8e468b2232991c510ecbcbed9e6f8c06ac31c93bcf38362", "https://bcr.bazel.build/modules/rules_jsonnet/0.6.0/MODULE.bazel": "66300179fdccc4abbb472f1a99ac03fd745fd67515a14c05abbf77fc09416de4", @@ -717,111 +718,6 @@ ] } }, - "@@aspect_rules_js~//npm:extensions.bzl%pnpm": { - "general": { - "bzlTransitiveDigest": "tR44xNwfPzmhvpq88VxVxAdjRwDNUDZR1NkNM8gUXkk=", - "usagesDigest": "4l7bmRQkO3X4QRe/n4qLKHBozj6dLXGRKt+QHkMt8R0=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "pnpm__links": { - "bzlFile": "@@aspect_rules_js~//npm/private:npm_import.bzl", - "ruleClassName": "npm_import_links", - "attributes": { - "package": "pnpm", - "version": "8.6.7", - "dev": false, - "root_package": "", - "link_packages": {}, - "deps": {}, - "transitive_closure": {}, - "lifecycle_build_target": false, - "lifecycle_hooks_env": [], - "lifecycle_hooks_execution_requirements": [ - "no-sandbox" - ], - "lifecycle_hooks_use_default_shell_env": false, - "bins": {}, - "package_visibility": [ - "//visibility:public" - ], - "replace_package": "" - } - }, - "pnpm": { - "bzlFile": "@@aspect_rules_js~//npm/private:npm_import.bzl", - "ruleClassName": "npm_import_rule", - "attributes": { - "package": "pnpm", - "version": "8.6.7", - "root_package": "", - "link_workspace": "", - "link_packages": {}, - "integrity": "sha512-vRIWpD/L4phf9Bk2o/O2TDR8fFoJnpYrp2TKqTIZF/qZ2/rgL3qKXzHofHgbXsinwMoSEigz28sqk3pQ+yMEQQ==", - "url": "", - "commit": "", - "patch_args": [ - "-p0" - ], - "patches": [], - "custom_postinstall": "", - "npm_auth": "", - "npm_auth_basic": "", - "npm_auth_username": "", - "npm_auth_password": "", - "lifecycle_hooks": [], - "extra_build_content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\")\njs_binary(name = \"pnpm\", data = glob([\"package/**\"]), entry_point = \"package/dist/pnpm.cjs\", visibility = [\"//visibility:public\"])", - "generate_bzl_library_targets": false, - "extract_full_archive": true, - "system_tar": "auto" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "aspect_bazel_lib~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "aspect_bazel_lib~", - "bazel_tools", - "bazel_tools" - ], - [ - "aspect_rules_js~", - "aspect_bazel_lib", - "aspect_bazel_lib~" - ], - [ - "aspect_rules_js~", - "bazel_features", - "bazel_features~" - ], - [ - "aspect_rules_js~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "aspect_rules_js~", - "bazel_tools", - "bazel_tools" - ], - [ - "bazel_features~", - "bazel_features_globals", - "bazel_features~~version_extension~bazel_features_globals" - ], - [ - "bazel_features~", - "bazel_features_version", - "bazel_features~~version_extension~bazel_features_version" - ] - ] - } - }, "@@container_structure_test~//:repositories.bzl%extension": { "general": { "bzlTransitiveDigest": "/vl5vOyGN/nxHtUF3SxoDZnTDgDklt4HUpLQD5LE8+k=", @@ -891,174 +787,6 @@ "recordedRepoMappingEntries": [] } }, - "@@googleapis~//:extensions.bzl%switched_rules": { - "general": { - "bzlTransitiveDigest": "vG6fuTzXD8MMvHWZEQud0MMH7eoC4GXY0va7VrFFh04=", - "usagesDigest": "HewAuLxIPR70YFOYz3nd8W9zYG7Vpgq7AqhZSPvh8nU=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "com_google_googleapis_imports": { - "bzlFile": "@@googleapis~//:repository_rules.bzl", - "ruleClassName": "switched_rules", - "attributes": { - "rules": { - "proto_library_with_info": [ - "", - "" - ], - "moved_proto_library": [ - "", - "" - ], - "java_proto_library": [ - "", - "" - ], - "java_grpc_library": [ - "", - "" - ], - "java_gapic_library": [ - "", - "" - ], - "java_gapic_test": [ - "", - "" - ], - "java_gapic_assembly_gradle_pkg": [ - "", - "" - ], - "py_proto_library": [ - "", - "" - ], - "py_grpc_library": [ - "", - "" - ], - "py_gapic_library": [ - "", - "" - ], - "py_test": [ - "", - "" - ], - "py_gapic_assembly_pkg": [ - "", - "" - ], - "py_import": [ - "", - "" - ], - "go_proto_library": [ - "", - "" - ], - "go_grpc_library": [ - "", - "" - ], - "go_library": [ - "", - "" - ], - "go_test": [ - "", - "" - ], - "go_gapic_library": [ - "", - "" - ], - "go_gapic_assembly_pkg": [ - "", - "" - ], - "cc_proto_library": [ - "", - "" - ], - "cc_grpc_library": [ - "", - "" - ], - "cc_gapic_library": [ - "", - "" - ], - "php_proto_library": [ - "", - "php_proto_library" - ], - "php_grpc_library": [ - "", - "php_grpc_library" - ], - "php_gapic_library": [ - "", - "php_gapic_library" - ], - "php_gapic_assembly_pkg": [ - "", - "php_gapic_assembly_pkg" - ], - "nodejs_gapic_library": [ - "", - "typescript_gapic_library" - ], - "nodejs_gapic_assembly_pkg": [ - "", - "typescript_gapic_assembly_pkg" - ], - "ruby_proto_library": [ - "", - "" - ], - "ruby_grpc_library": [ - "", - "" - ], - "ruby_ads_gapic_library": [ - "", - "" - ], - "ruby_cloud_gapic_library": [ - "", - "" - ], - "ruby_gapic_assembly_pkg": [ - "", - "" - ], - "csharp_proto_library": [ - "", - "" - ], - "csharp_grpc_library": [ - "", - "" - ], - "csharp_gapic_library": [ - "", - "" - ], - "csharp_gapic_assembly_pkg": [ - "", - "" - ] - } - } - } - }, - "recordedRepoMappingEntries": [] - } - }, "@@platforms//host:extension.bzl%host_platform": { "general": { "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", @@ -1631,7 +1359,7 @@ "@@rules_oci~//oci:extensions.bzl%oci": { "general": { "bzlTransitiveDigest": "uR4Z+y828uDdulNg1z4TcTN60yXGiBjTczXUV7abKZI=", - "usagesDigest": "joS4pXRJcgV5hfxZkbV5BrHf37K+dLnMXp6ZPFZVW4E=", + "usagesDigest": "hAatWPNXKOM0kUzdNxb+P+cWAWaGkyrNDv1itQQaEE4=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -1651,19 +1379,6 @@ "platform": "windows_amd64" } }, - "jq": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_host_alias_repo", - "attributes": {} - }, - "oci_crane_darwin_amd64": { - "bzlFile": "@@rules_oci~//oci:repositories.bzl", - "ruleClassName": "crane_repositories", - "attributes": { - "platform": "darwin_amd64", - "crane_version": "v0.18.0" - } - }, "jq_darwin_amd64": { "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", "ruleClassName": "jq_platform_repo", @@ -1672,23 +1387,6 @@ "version": "1.7" } }, - "distroless_base": { - "bzlFile": "@@rules_oci~//oci/private:pull.bzl", - "ruleClassName": "oci_alias", - "attributes": { - "target_name": "distroless_base", - "scheme": "https", - "registry": "gcr.io", - "repository": "distroless/base", - "identifier": "sha256:6ae5fe659f28c6afe9cc2903aebc78a5c6ad3aaa3d9d0369760ac6aaea2529c8", - "platforms": { - "@@platforms//cpu:x86_64": "@distroless_base_linux_amd64", - "@@platforms//cpu:arm64": "@distroless_base_linux_arm64_v8" - }, - "bzlmod_repository": "distroless_base", - "reproducible": true - } - }, "copy_to_directory_freebsd_amd64": { "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", "ruleClassName": "copy_to_directory_platform_repo", @@ -1696,26 +1394,6 @@ "platform": "freebsd_amd64" } }, - "distroless_base_linux_arm64_v8": { - "bzlFile": "@@rules_oci~//oci/private:pull.bzl", - "ruleClassName": "oci_pull", - "attributes": { - "scheme": "https", - "registry": "gcr.io", - "repository": "distroless/base", - "identifier": "sha256:6ae5fe659f28c6afe9cc2903aebc78a5c6ad3aaa3d9d0369760ac6aaea2529c8", - "platform": "linux/arm64/v8", - "target_name": "distroless_base_linux_arm64_v8", - "bazel_tags": [] - } - }, - "copy_to_directory_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "linux_amd64" - } - }, "oci_crane_linux_arm64": { "bzlFile": "@@rules_oci~//oci:repositories.bzl", "ruleClassName": "crane_repositories", @@ -1740,22 +1418,6 @@ "version": "0.0.26" } }, - "coreutils_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_platform_repo", - "attributes": { - "platform": "linux_amd64", - "version": "0.0.26" - } - }, - "yq_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "linux_amd64", - "version": "4.25.2" - } - }, "copy_to_directory_linux_arm64": { "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", "ruleClassName": "copy_to_directory_platform_repo", @@ -1763,21 +1425,6 @@ "platform": "linux_arm64" } }, - "oci_crane_linux_armv6": { - "bzlFile": "@@rules_oci~//oci:repositories.bzl", - "ruleClassName": "crane_repositories", - "attributes": { - "platform": "linux_armv6", - "crane_version": "v0.18.0" - } - }, - "copy_to_directory_darwin_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "darwin_arm64" - } - }, "oci_crane_linux_amd64": { "bzlFile": "@@rules_oci~//oci:repositories.bzl", "ruleClassName": "crane_repositories", @@ -1802,13 +1449,6 @@ "version": "0.0.26" } }, - "coreutils_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_toolchains_repo", - "attributes": { - "user_repository_name": "coreutils" - } - }, "yq_linux_s390x": { "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", "ruleClassName": "yq_platform_repo", @@ -1867,14 +1507,6 @@ "crane_version": "v0.18.0" } }, - "jq_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_platform_repo", - "attributes": { - "platform": "linux_amd64", - "version": "1.7" - } - }, "distroless_static": { "bzlFile": "@@rules_oci~//oci/private:pull.bzl", "ruleClassName": "oci_alias", @@ -1892,7 +1524,7 @@ "reproducible": true } }, - "distroless_static_linux_arm64_v8": { + "distroless_static_linux_amd64": { "bzlFile": "@@rules_oci~//oci/private:pull.bzl", "ruleClassName": "oci_pull", "attributes": { @@ -1900,61 +1532,210 @@ "registry": "gcr.io", "repository": "distroless/static", "identifier": "sha256:7e5c6a2a4ae854242874d36171b31d26e0539c98fc6080f942f16b03e82851ab", - "platform": "linux/arm64/v8", - "target_name": "distroless_static_linux_arm64_v8", + "platform": "linux/amd64", + "target_name": "distroless_static_linux_amd64", "bazel_tags": [] } }, - "distroless_static_linux_amd64": { + "oci_crane_windows_armv6": { + "bzlFile": "@@rules_oci~//oci:repositories.bzl", + "ruleClassName": "crane_repositories", + "attributes": { + "platform": "windows_armv6", + "crane_version": "v0.18.0" + } + }, + "oci_crane_toolchains": { + "bzlFile": "@@rules_oci~//oci/private:toolchains_repo.bzl", + "ruleClassName": "toolchains_repo", + "attributes": { + "toolchain_type": "@rules_oci//oci:crane_toolchain_type", + "toolchain": "@oci_crane_{platform}//:crane_toolchain" + } + }, + "copy_to_directory_darwin_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", + "attributes": { + "platform": "darwin_amd64" + } + }, + "yq_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_toolchains_repo", + "attributes": { + "user_repository_name": "yq" + } + }, + "oci_crane_windows_amd64": { + "bzlFile": "@@rules_oci~//oci:repositories.bzl", + "ruleClassName": "crane_repositories", + "attributes": { + "platform": "windows_amd64", + "crane_version": "v0.18.0" + } + }, + "oci_crane_linux_s390x": { + "bzlFile": "@@rules_oci~//oci:repositories.bzl", + "ruleClassName": "crane_repositories", + "attributes": { + "platform": "linux_s390x", + "crane_version": "v0.18.0" + } + }, + "jq": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_host_alias_repo", + "attributes": {} + }, + "oci_crane_darwin_amd64": { + "bzlFile": "@@rules_oci~//oci:repositories.bzl", + "ruleClassName": "crane_repositories", + "attributes": { + "platform": "darwin_amd64", + "crane_version": "v0.18.0" + } + }, + "distroless_base": { + "bzlFile": "@@rules_oci~//oci/private:pull.bzl", + "ruleClassName": "oci_alias", + "attributes": { + "target_name": "distroless_base", + "scheme": "https", + "registry": "gcr.io", + "repository": "distroless/base", + "identifier": "sha256:6ae5fe659f28c6afe9cc2903aebc78a5c6ad3aaa3d9d0369760ac6aaea2529c8", + "platforms": { + "@@platforms//cpu:x86_64": "@distroless_base_linux_amd64", + "@@platforms//cpu:arm64": "@distroless_base_linux_arm64_v8" + }, + "bzlmod_repository": "distroless_base", + "reproducible": true + } + }, + "distroless_base_linux_arm64_v8": { "bzlFile": "@@rules_oci~//oci/private:pull.bzl", "ruleClassName": "oci_pull", "attributes": { "scheme": "https", "registry": "gcr.io", - "repository": "distroless/static", - "identifier": "sha256:7e5c6a2a4ae854242874d36171b31d26e0539c98fc6080f942f16b03e82851ab", - "platform": "linux/amd64", - "target_name": "distroless_static_linux_amd64", + "repository": "distroless/base", + "identifier": "sha256:6ae5fe659f28c6afe9cc2903aebc78a5c6ad3aaa3d9d0369760ac6aaea2529c8", + "platform": "linux/arm64/v8", + "target_name": "distroless_base_linux_arm64_v8", "bazel_tags": [] } }, - "yq_windows_amd64": { + "copy_to_directory_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", + "attributes": { + "platform": "linux_amd64" + } + }, + "coreutils_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_platform_repo", + "attributes": { + "platform": "linux_amd64", + "version": "0.0.26" + } + }, + "yq_linux_amd64": { "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", "ruleClassName": "yq_platform_repo", "attributes": { - "platform": "windows_amd64", + "platform": "linux_amd64", "version": "4.25.2" } }, - "oci_crane_windows_armv6": { + "oci_crane_linux_armv6": { "bzlFile": "@@rules_oci~//oci:repositories.bzl", "ruleClassName": "crane_repositories", "attributes": { - "platform": "windows_armv6", + "platform": "linux_armv6", "crane_version": "v0.18.0" } }, - "oci_crane_toolchains": { - "bzlFile": "@@rules_oci~//oci/private:toolchains_repo.bzl", - "ruleClassName": "toolchains_repo", + "copy_to_directory_darwin_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", "attributes": { - "toolchain_type": "@rules_oci//oci:crane_toolchain_type", - "toolchain": "@oci_crane_{platform}//:crane_toolchain" + "platform": "darwin_arm64" } }, - "jq_windows_amd64": { + "coreutils_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_toolchains_repo", + "attributes": { + "user_repository_name": "coreutils" + } + }, + "busybox_linux_arm64_v8": { + "bzlFile": "@@rules_oci~//oci/private:pull.bzl", + "ruleClassName": "oci_pull", + "attributes": { + "scheme": "https", + "registry": "index.docker.io", + "repository": "library/busybox", + "identifier": "sha256:97e3873d1f61ba651b632e4755fc52e1d90c9f6e4f01d9b720f37af5efed17e5", + "platform": "linux/arm64/v8", + "target_name": "busybox_linux_arm64_v8", + "bazel_tags": [] + } + }, + "busybox": { + "bzlFile": "@@rules_oci~//oci/private:pull.bzl", + "ruleClassName": "oci_alias", + "attributes": { + "target_name": "busybox", + "scheme": "https", + "registry": "index.docker.io", + "repository": "library/busybox", + "identifier": "sha256:97e3873d1f61ba651b632e4755fc52e1d90c9f6e4f01d9b720f37af5efed17e5", + "platforms": { + "@@platforms//cpu:x86_64": "@busybox_linux_amd64", + "@@platforms//cpu:arm64": "@busybox_linux_arm64_v8" + }, + "bzlmod_repository": "busybox", + "reproducible": true + } + }, + "jq_linux_amd64": { "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", "ruleClassName": "jq_platform_repo", "attributes": { - "platform": "windows_amd64", + "platform": "linux_amd64", "version": "1.7" } }, - "copy_to_directory_darwin_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", + "distroless_static_linux_arm64_v8": { + "bzlFile": "@@rules_oci~//oci/private:pull.bzl", + "ruleClassName": "oci_pull", "attributes": { - "platform": "darwin_amd64" + "scheme": "https", + "registry": "gcr.io", + "repository": "distroless/static", + "identifier": "sha256:7e5c6a2a4ae854242874d36171b31d26e0539c98fc6080f942f16b03e82851ab", + "platform": "linux/arm64/v8", + "target_name": "distroless_static_linux_arm64_v8", + "bazel_tags": [] + } + }, + "yq_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", + "attributes": { + "platform": "windows_amd64", + "version": "4.25.2" + } + }, + "jq_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_platform_repo", + "attributes": { + "platform": "windows_amd64", + "version": "1.7" } }, "yq_linux_ppc64le": { @@ -1987,27 +1768,17 @@ "version": "4.25.2" } }, - "yq_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_toolchains_repo", - "attributes": { - "user_repository_name": "yq" - } - }, - "oci_crane_windows_amd64": { - "bzlFile": "@@rules_oci~//oci:repositories.bzl", - "ruleClassName": "crane_repositories", - "attributes": { - "platform": "windows_amd64", - "crane_version": "v0.18.0" - } - }, - "oci_crane_linux_s390x": { - "bzlFile": "@@rules_oci~//oci:repositories.bzl", - "ruleClassName": "crane_repositories", + "busybox_linux_amd64": { + "bzlFile": "@@rules_oci~//oci/private:pull.bzl", + "ruleClassName": "oci_pull", "attributes": { - "platform": "linux_s390x", - "crane_version": "v0.18.0" + "scheme": "https", + "registry": "index.docker.io", + "repository": "library/busybox", + "identifier": "sha256:97e3873d1f61ba651b632e4755fc52e1d90c9f6e4f01d9b720f37af5efed17e5", + "platform": "linux/amd64", + "target_name": "busybox_linux_amd64", + "bazel_tags": [] } }, "coreutils_windows_amd64": { diff --git a/README.md b/README.md index 9f4903a8..01fde271 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,10 @@ You can then upload the `build_events_01.json` output file to see the results in Once you have BEP files produced by Bazel, you can upload them via the application homepage. +### BB-scheduler + +BB-portal can show the same information as the web interface from BB-scheduler. To do this, you need to configure the `buildQueueStateProxy` in the portal configuration file. The interface can be found under the `Scheduler` tab in the menu. + ## Using GraphiQL To Explore the GraphQL API The GraphiQL explorer is available via http://localhost:8081/graphiql. diff --git a/cmd/bb_portal/BUILD.bazel b/cmd/bb_portal/BUILD.bazel index 1a3c7a4e..3ed9a205 100644 --- a/cmd/bb_portal/BUILD.bazel +++ b/cmd/bb_portal/BUILD.bazel @@ -1,10 +1,12 @@ load("@com_github_buildbarn_bb_storage//tools:container.bzl", "container_push_official", "multiarch_go_image") load("@rules_go//go:def.bzl", "go_binary", "go_library") -load("@rules_oci//oci:defs.bzl", "oci_image", "oci_image_index") go_library( name = "bb_portal_lib", - srcs = ["main.go"], + srcs = [ + "grpcweb_proxy_server.go", + "main.go", + ], importpath = "github.com/buildbarn/bb-portal/cmd/bb_portal", visibility = ["//visibility:private"], deps = [ @@ -12,11 +14,14 @@ go_library( "//ent/gen/ent/migrate", "//internal/api", "//internal/api/grpc/bes", + "//internal/api/grpcweb/buildqueuestateproxy", "//internal/graphql", "//pkg/processing", "//pkg/proto/configuration/bb_portal", "@com_github_99designs_gqlgen//graphql/handler", "@com_github_99designs_gqlgen//graphql/playground", + "@com_github_buildbarn_bb_remote_execution//pkg/proto/buildqueuestate", + "@com_github_buildbarn_bb_storage//pkg/auth", "@com_github_buildbarn_bb_storage//pkg/global", "@com_github_buildbarn_bb_storage//pkg/grpc", "@com_github_buildbarn_bb_storage//pkg/http", @@ -24,6 +29,7 @@ go_library( "@com_github_buildbarn_bb_storage//pkg/util", "@com_github_fsnotify_fsnotify//:fsnotify", "@com_github_gorilla_mux//:mux", + "@com_github_improbable_eng_grpc_web//go/grpcweb", "@com_github_jackc_pgx_v5//stdlib", "@com_github_mattn_go_sqlite3//:go-sqlite3", "@io_entgo_contrib//entgql", diff --git a/cmd/bb_portal/grpcweb_proxy_server.go b/cmd/bb_portal/grpcweb_proxy_server.go new file mode 100644 index 00000000..ff022264 --- /dev/null +++ b/cmd/bb_portal/grpcweb_proxy_server.go @@ -0,0 +1,83 @@ +package main + +import ( + "log" + "slices" + + "github.com/buildbarn/bb-portal/internal/api/grpcweb/buildqueuestateproxy" + "github.com/buildbarn/bb-portal/pkg/proto/configuration/bb_portal" + "github.com/buildbarn/bb-remote-execution/pkg/proto/buildqueuestate" + "github.com/buildbarn/bb-storage/pkg/auth" + bb_grpc "github.com/buildbarn/bb-storage/pkg/grpc" + bb_http "github.com/buildbarn/bb-storage/pkg/http" + "github.com/buildbarn/bb-storage/pkg/program" + "github.com/improbable-eng/grpc-web/go/grpcweb" + go_grpc "google.golang.org/grpc" +) + +func registerAndStartServer( + configuration *bb_portal.GrpcWebProxyConfiguration, + siblingsGroup program.Group, + grpcClientFactory bb_grpc.ClientFactory, + metricsName string, + registerServer func(*go_grpc.Server, go_grpc.ClientConnInterface), +) { + grpcClient, err := grpcClientFactory.NewClientFromConfiguration(configuration.Client) + if err != nil { + log.Fatalf("Could not connect to gRPC server: %v", err) + } + + options := []grpcweb.Option{ + grpcweb.WithOriginFunc(func(origin string) bool { return slices.Contains(configuration.AllowedOrigins, origin) }), + } + + grpcServer := go_grpc.NewServer() + registerServer(grpcServer, grpcClient) + grpcWebServer := grpcweb.WrapServer(grpcServer, options...) + bb_http.NewServersFromConfigurationAndServe( + configuration.HttpServers, + bb_http.NewMetricsHandler(grpcWebServer, metricsName), + siblingsGroup, + ) +} + +// StartGrpcWebProxyServer initializes and starts multiple gRPC web proxy servers based on the provided configuration. +// It registers and starts servers for BuildQueueStateProxy, ActionCacheProxy, ContentAddressableStorageProxy, and InitialSizeClassCacheProxy. +// +// Parameters: +// - configuration: A pointer to the ApplicationConfiguration which contains the settings for each proxy server. +// - instanceNameAuthorizer: A auth.Authorizer that checks that only requests with an approved instance name are forwarded. +// - siblingsGroup: A program.Group that manages the lifecycle of the servers. +// - grpcClientFactory: A factory for creating gRPC clients. +// +// Each proxy server is registered and started with its respective configuration and implementation. +func StartGrpcWebProxyServer( + configuration *bb_portal.ApplicationConfiguration, + siblingsGroup program.Group, + grpcClientFactory bb_grpc.ClientFactory, +) { + if configuration.InstanceNameAuthorizer == nil { + log.Printf("Did not start gRPC-web proxy because InstanceNameAuthorizer is not configured") + return + } + + instanceNameAuthorizer, err := auth.DefaultAuthorizerFactory.NewAuthorizerFromConfiguration(configuration.InstanceNameAuthorizer) + if err != nil { + log.Fatalf("Failed to create InstanceNameAuthorizer: %v", err) + } + + if configuration.BuildQueueStateProxy != nil { + registerAndStartServer( + configuration.BuildQueueStateProxy, + siblingsGroup, + grpcClientFactory, + "BuildQueueStateProxy", + func(grpcServer *go_grpc.Server, grpcClient go_grpc.ClientConnInterface) { + c := buildqueuestate.NewBuildQueueStateClient(grpcClient) + buildqueuestate.RegisterBuildQueueStateServer(grpcServer, buildqueuestateproxy.NewBuildQueueStateServerImpl(c, instanceNameAuthorizer)) + }, + ) + } else { + log.Printf("Did not start BuildQueueState proxy because BuildQueueStateProxy is not configured") + } +} diff --git a/cmd/bb_portal/main.go b/cmd/bb_portal/main.go index 04781f4a..b1a1ff2f 100644 --- a/cmd/bb_portal/main.go +++ b/cmd/bb_portal/main.go @@ -71,7 +71,7 @@ func main() { return util.StatusWrapf(err, "Failed to read configuration from %s", os.Args[1]) } - lifecycleState, _, err := global.ApplyConfiguration(configuration.Global) + lifecycleState, grpcClientFactory, err := global.ApplyConfiguration(configuration.Global) if err != nil { return util.StatusWrap(err, "Failed to apply global configuration options") } @@ -135,6 +135,8 @@ func main() { return util.StatusWrap(err, "gRPC server failure") } + StartGrpcWebProxyServer(&configuration, siblingsGroup, grpcClientFactory) + lifecycleState.MarkReadyAndWait(siblingsGroup) return nil }) diff --git a/config/portal.jsonnet b/config/portal.jsonnet index 0d1629a8..825cb45a 100644 --- a/config/portal.jsonnet +++ b/config/portal.jsonnet @@ -1,4 +1,10 @@ // For documentation, see pkg/proto/configuration/bb_portal/bb_portal.proto. + +// This example config is made to be used with the docker-compose setup in +// [bb-deployments](https://github.com/buildbarn/bb-deployments), i.e. it +// assumes that the following services are running: +// - A Buildbarn scheduler, accessible at localhost:8984 + { httpServers: [{ listenAddresses: [':8081'], @@ -9,4 +15,33 @@ authenticationPolicy: { allow: {} }, maximumReceivedMessageSizeBytes: 10*1024*1024 }], + + instanceNameAuthorizer: { + jmespathExpression: ||| + contains(authenticationMetadata.private.instances, instanceName) + || instanceName == '' + |||, + }, + + buildQueueStateProxy: { + client: { + address: 'localhost:8984', + }, + allowedOrigins: ['http://localhost:8081'], + httpServers: [{ + listenAddresses: [':9433'], + authenticationPolicy: { + allow: { + public: { + user: 'FooBar', + }, + private: { + groups: ['admin'], + instances: ['fuse', 'testingQueue'], + email: 'foo@example.com', + }, + }, + }, + }], + }, } diff --git a/frontend/.env b/frontend/.env index c4d9a858..9b348406 100644 --- a/frontend/.env +++ b/frontend/.env @@ -1,5 +1,6 @@ NEXT_PUBLIC_BES_BACKEND_URL=http://localhost:8081 NEXT_PUBLIC_BES_GRPC_BACKEND_URL=grpc://localhost:8082 +NEXT_PUBLIC_BB_BUILDQUEUESTATE_GRPC_BACKEND_URL=http://localhost:9433 NEXT_PUBLIC_BROWSER_URL=https://browser.example.com NEXT_PUBLIC_COMPANY_NAME="Example Co" NEXT_PUBLIC_COMPANY_SLACK_CHANNEL_NAME=ExampleCoBuild diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1cd9e1e6..1b09983d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,34 +8,54 @@ "name": "frontend", "version": "0.1.0", "dependencies": { + "@ant-design/colors": "^7.0.2", + "@ant-design/cssinjs": "^1.20.0", + "@ant-design/icons": "^5.3.7", "@apollo/client": "^3.10.2", "@apollo/experimental-nextjs-app-support": "^0.10.0", + "@tanstack/react-query": "^5.66.0", + "@tanstack/react-query-devtools": "^5.66.0", "ansi_up": "^6.0.2", - "antd": "^5.17.0", + "antd": "^5.21.3", "dayjs": "^1.11.11", "framer-motion": "^11.1.9", "graphql": "^16.8.1", "linkify-html": "^4.1.3", "lodash": "^4.17.21", + "long": "^5.2.4", "next": "14.2.3", - "react": "^18", - "react-dom": "^18", + "next-runtime-env": "^3.2.2", + "nice-grpc-web": "^3.3.5", + "protobufjs": "^7.4.0", + "rc-menu": "^9.13.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "recharts": "^2.12.7", "uuid": "^9.0.1", "zod": "^3.23.8" }, "devDependencies": { + "@biomejs/biome": "1.9.4", "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/client-preset": "^4.2.5", + "@graphql-typed-document-node/core": "^3.2.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.2.0", "@types/lodash": "^4.17.4", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", + "@types/node": "^20.12.8", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/uuid": "^9.0.8", + "@vitejs/plugin-react": "^4.3.4", "env-cmd": "^10.1.0", - "eslint": "^8", + "eslint": "^8.57.0", "eslint-config-next": "14.2.3", - "typescript": "^5" + "grpc-tools": "^1.12.4", + "jsdom": "^26.0.0", + "ts-proto": "^2.6.1", + "typescript": "^5.4.5", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.0.5" } }, "node_modules/@ampproject/remapping": { @@ -52,17 +72,19 @@ } }, "node_modules/@ant-design/colors": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.2.tgz", - "integrity": "sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.0.tgz", + "integrity": "sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==", + "license": "MIT", "dependencies": { - "@ctrl/tinycolor": "^3.6.1" + "@ant-design/fast-color": "^2.0.6" } }, "node_modules/@ant-design/cssinjs": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.20.0.tgz", - "integrity": "sha512-uG3iWzJxgNkADdZmc6W0Ci3iQAUOvLMcM8SnnmWq3r6JeocACft4ChnY/YWvI2Y+rG/68QBla/O+udke1yH3vg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.22.1.tgz", + "integrity": "sha512-SLuXM4wiEE1blOx94iXrkOgseMZHzdr4ngdFu3VVDq6AOWh7rlwqTkMAtJho3EsBF6x/eUGOtK53VZXGQG7+sQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", @@ -70,21 +92,49 @@ "classnames": "^2.3.1", "csstype": "^3.1.3", "rc-util": "^5.35.0", - "stylis": "^4.0.13" + "stylis": "^4.3.4" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, "node_modules/@ant-design/icons": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.3.7.tgz", - "integrity": "sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.5.2.tgz", + "integrity": "sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==", + "license": "MIT", "dependencies": { "@ant-design/colors": "^7.0.0", "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.11.2", + "@babel/runtime": "^7.24.8", "classnames": "^2.2.6", "rc-util": "^5.31.1" }, @@ -379,13 +429,29 @@ "node": ">=14" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", + "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -393,30 +459,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -444,15 +512,17 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.5", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -471,14 +541,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -546,18 +617,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.24.5", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", @@ -571,28 +630,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -614,10 +674,11 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -676,137 +737,58 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.26.7" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1203,6 +1185,38 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", @@ -1250,7 +1264,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.5", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1260,33 +1276,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1304,325 +1319,1516 @@ } }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.21.3" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=14.21.3" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=14.21.3" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.21.3" } }, - "node_modules/@graphql-codegen/add": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.2.tgz", - "integrity": "sha512-ouBkSvMFUhda5VoKumo/ZvsZM9P5ZTyDsI8LW18VxSNWOjrTeLXBWHG8Gfaai0HwhflPtCYVABbriEcOmrRShQ==", + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" } }, - "node_modules/@graphql-codegen/cli": { - "version": "5.0.2", + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", + "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@graphql-codegen/add": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.2.tgz", + "integrity": "sha512-ouBkSvMFUhda5VoKumo/ZvsZM9P5ZTyDsI8LW18VxSNWOjrTeLXBWHG8Gfaai0HwhflPtCYVABbriEcOmrRShQ==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/cli": { + "version": "5.0.2", "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.2.tgz", "integrity": "sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==", "dev": true, "dependencies": { - "@babel/generator": "^7.18.13", - "@babel/template": "^7.18.10", - "@babel/types": "^7.18.13", - "@graphql-codegen/client-preset": "^4.2.2", - "@graphql-codegen/core": "^4.0.2", - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/apollo-engine-loader": "^8.0.0", - "@graphql-tools/code-file-loader": "^8.0.0", - "@graphql-tools/git-loader": "^8.0.0", - "@graphql-tools/github-loader": "^8.0.0", - "@graphql-tools/graphql-file-loader": "^8.0.0", - "@graphql-tools/json-file-loader": "^8.0.0", - "@graphql-tools/load": "^8.0.0", - "@graphql-tools/prisma-loader": "^8.0.0", - "@graphql-tools/url-loader": "^8.0.0", - "@graphql-tools/utils": "^10.0.0", - "@whatwg-node/fetch": "^0.8.0", - "chalk": "^4.1.0", - "cosmiconfig": "^8.1.3", - "debounce": "^1.2.0", - "detect-indent": "^6.0.0", - "graphql-config": "^5.0.2", - "inquirer": "^8.0.0", - "is-glob": "^4.0.1", - "jiti": "^1.17.1", - "json-to-pretty-yaml": "^1.2.2", - "listr2": "^4.0.5", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.5", - "shell-quote": "^1.7.3", - "string-env-interpolation": "^1.0.1", - "ts-log": "^2.2.3", + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^4.2.2", + "@graphql-codegen/core": "^4.0.2", + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/apollo-engine-loader": "^8.0.0", + "@graphql-tools/code-file-loader": "^8.0.0", + "@graphql-tools/git-loader": "^8.0.0", + "@graphql-tools/github-loader": "^8.0.0", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.0.0", + "@graphql-tools/prisma-loader": "^8.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "@whatwg-node/fetch": "^0.8.0", + "chalk": "^4.1.0", + "cosmiconfig": "^8.1.3", + "debounce": "^1.2.0", + "detect-indent": "^6.0.0", + "graphql-config": "^5.0.2", + "inquirer": "^8.0.0", + "is-glob": "^4.0.1", + "jiti": "^1.17.1", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^4.0.5", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/client-preset": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.2.5.tgz", + "integrity": "sha512-hAdB6HN8EDmkoBtr0bPUN/7NH6svzqbcTDMWBCRXPESXkl7y80po+IXrXUjsSrvhKG8xkNXgJNz/2mjwHzywcA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^5.0.2", + "@graphql-codegen/gql-tag-operations": "4.0.6", + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/typed-document-node": "^5.0.6", + "@graphql-codegen/typescript": "^4.0.6", + "@graphql-codegen/typescript-operations": "^4.2.0", + "@graphql-codegen/visitor-plugin-common": "^5.1.0", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", + "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz", + "integrity": "sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/visitor-plugin-common": "5.1.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.3.tgz", + "integrity": "sha512-yZ1rpULIWKBZqCDlvGIJRSyj1B2utkEdGmXZTBT/GVayP4hyRYlkd36AJV/LfEsVD8dnsKL5rLz2VTYmRNlJ5Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.0.2.tgz", + "integrity": "sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz", + "integrity": "sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/visitor-plugin-common": "5.1.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.0.6.tgz", + "integrity": "sha512-IBG4N+Blv7KAL27bseruIoLTjORFCT3r+QYyMC3g11uY3/9TPpaUyjSdF70yBe5GIQ6dAgDU+ENUC1v7EPi0rw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/schema-ast": "^4.0.2", + "@graphql-codegen/visitor-plugin-common": "5.1.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz", + "integrity": "sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-codegen/typescript": "^4.0.6", + "@graphql-codegen/visitor-plugin-common": "5.1.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz", + "integrity": "sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.1.tgz", + "integrity": "sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/utils": "^10.0.13", + "@whatwg-node/fetch": "^0.9.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", + "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", + "dev": true, + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.4.tgz", + "integrity": "sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "dataloader": "^2.2.2", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.1.tgz", + "integrity": "sha512-q4KN25EPSUztc8rA8YUU3ufh721Yk12xXDbtUA+YstczWS7a1RJlghYMFEfR1HsHSYbF7cUqkbnTKSGM3o52bQ==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.0", + "@graphql-tools/utils": "^10.0.13", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.9.tgz", + "integrity": "sha512-H+jGPLB0X23wlslw1JuB3y5j35NwZLUGhmjgaLYKkquAI/rtcs4+UwoW3hZ4SCN7h2LAKDa6HhsYYCRXyhdePA==", + "dev": true, + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.4", + "@graphql-tools/executor": "^1.2.1", + "@graphql-tools/schema": "^10.0.3", + "@graphql-tools/utils": "^10.0.13", + "dataloader": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.0.tgz", + "integrity": "sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.6.tgz", + "integrity": "sha512-+1kjfqzM5T2R+dCw7F4vdJ3CqG+fY/LYJyhNiWEFtq0ToLwYzR/KKyD8YuzTirEjSxWTVlcBh7endkx5n5F6ew==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.1.1", + "@graphql-typed-document-node/core": "3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.2.tgz", + "integrity": "sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "@types/ws": "^8.0.0", + "graphql-ws": "^5.14.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.9.tgz", + "integrity": "sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.9.0", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", + "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", + "dev": true, + "dependencies": { + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.6.tgz", + "integrity": "sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.13", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.15.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.5.tgz", + "integrity": "sha512-P97/1mhruDiA6D5WUmx3n/aeGPLWj2+4dpzDOxFGGU+z9NcI/JdygMkeFpGZNHeJfw+kHfxgPcMPnxHcyhAoVA==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.0", + "@graphql-tools/utils": "^10.0.13", + "is-glob": "4.0.3", + "micromatch": "^4.0.4", "tslib": "^2.4.0", - "yaml": "^2.3.1", - "yargs": "^17.0.0" + "unixify": "^1.0.0" }, - "bin": { - "gql-gen": "cjs/bin.js", - "graphql-code-generator": "cjs/bin.js", - "graphql-codegen": "cjs/bin.js", - "graphql-codegen-esm": "esm/bin.js" + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "@parcel/watcher": "^2.1.0", - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "@parcel/watcher": { - "optional": true - } + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-codegen/client-preset": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.2.5.tgz", - "integrity": "sha512-hAdB6HN8EDmkoBtr0bPUN/7NH6svzqbcTDMWBCRXPESXkl7y80po+IXrXUjsSrvhKG8xkNXgJNz/2mjwHzywcA==", + "node_modules/@graphql-tools/github-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.1.tgz", + "integrity": "sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7", - "@graphql-codegen/add": "^5.0.2", - "@graphql-codegen/gql-tag-operations": "4.0.6", - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/typed-document-node": "^5.0.6", - "@graphql-codegen/typescript": "^4.0.6", - "@graphql-codegen/typescript-operations": "^4.2.0", - "@graphql-codegen/visitor-plugin-common": "^5.1.0", - "@graphql-tools/documents": "^1.0.0", - "@graphql-tools/utils": "^10.0.0", - "@graphql-typed-document-node/core": "3.2.0", - "tslib": "~2.6.0" + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/executor-http": "^1.0.9", + "@graphql-tools/graphql-tag-pluck": "^8.0.0", + "@graphql-tools/utils": "^10.0.13", + "@whatwg-node/fetch": "^0.9.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-codegen/core": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", - "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/schema": "^10.0.0", - "@graphql-tools/utils": "^10.0.0", - "tslib": "~2.6.0" + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@graphql-codegen/gql-tag-operations": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz", - "integrity": "sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA==", + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", + "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/visitor-plugin-common": "5.1.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@graphql-codegen/plugin-helpers": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.3.tgz", - "integrity": "sha512-yZ1rpULIWKBZqCDlvGIJRSyj1B2utkEdGmXZTBT/GVayP4hyRYlkd36AJV/LfEsVD8dnsKL5rLz2VTYmRNlJ5Q==", + "node_modules/@graphql-tools/github-loader/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.1.tgz", + "integrity": "sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^10.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.6.0" + "@graphql-tools/import": "7.0.1", + "@graphql-tools/utils": "^10.0.13", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-codegen/schema-ast": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.0.2.tgz", - "integrity": "sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q==", + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.0.tgz", + "integrity": "sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/utils": "^10.0.0", - "tslib": "~2.6.0" + "@babel/core": "^7.22.9", + "@babel/parser": "^7.16.8", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8", + "@graphql-tools/utils": "^10.0.13", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-codegen/typed-document-node": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz", - "integrity": "sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA==", + "node_modules/@graphql-tools/import": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.1.tgz", + "integrity": "sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/visitor-plugin-common": "5.1.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "tslib": "~2.6.0" + "@graphql-tools/utils": "^10.0.13", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-codegen/typescript": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.0.6.tgz", - "integrity": "sha512-IBG4N+Blv7KAL27bseruIoLTjORFCT3r+QYyMC3g11uY3/9TPpaUyjSdF70yBe5GIQ6dAgDU+ENUC1v7EPi0rw==", + "node_modules/@graphql-tools/import/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.1.tgz", + "integrity": "sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/schema-ast": "^4.0.2", - "@graphql-codegen/visitor-plugin-common": "5.1.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" + "@graphql-tools/utils": "^10.0.13", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-codegen/typescript-operations": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz", - "integrity": "sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA==", + "node_modules/@graphql-tools/load": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.2.tgz", + "integrity": "sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/typescript": "^4.0.6", - "@graphql-codegen/visitor-plugin-common": "5.1.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" + "@graphql-tools/schema": "^10.0.3", + "@graphql-tools/utils": "^10.0.13", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz", - "integrity": "sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg==", + "node_modules/@graphql-tools/merge": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.4.tgz", + "integrity": "sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/optimize": "^2.0.0", - "@graphql-tools/relay-operation-optimizer": "^7.0.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.6.0" + "@graphql-tools/utils": "^10.0.13", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/apollo-engine-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.1.tgz", - "integrity": "sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==", + "node_modules/@graphql-tools/prisma-loader": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.4.tgz", + "integrity": "sha512-hqKPlw8bOu/GRqtYr0+dINAI13HinTVYBDqhwGAPIFmLr5s+qKskzgCiwbsckdrb5LWVFmVZc+UXn80OGiyBzg==", "dev": true, "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/url-loader": "^8.0.2", "@graphql-tools/utils": "^10.0.13", + "@types/js-yaml": "^4.0.0", "@whatwg-node/fetch": "^0.9.0", - "tslib": "^2.4.0" + "chalk": "^4.1.0", + "debug": "^4.3.1", + "dotenv": "^16.0.0", + "graphql-request": "^6.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "jose": "^5.0.0", + "js-yaml": "^4.0.0", + "lodash": "^4.17.20", + "scuid": "^1.1.0", + "tslib": "^2.4.0", + "yaml-ast-parser": "^0.0.43" }, "engines": { "node": ">=16.0.0" @@ -1631,7 +2837,7 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/events": { + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/events": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", @@ -1640,7 +2846,7 @@ "node": ">=16.0.0" } }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/fetch": { + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/fetch": { "version": "0.9.17", "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", @@ -1653,7 +2859,7 @@ "node": ">=16.0.0" } }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/node-fetch": { + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", @@ -1669,22 +2875,21 @@ "node": ">=16.0.0" } }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/urlpattern-polyfill": { + "node_modules/@graphql-tools/prisma-loader/node_modules/urlpattern-polyfill": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", "dev": true }, - "node_modules/@graphql-tools/batch-execute": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.4.tgz", - "integrity": "sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==", + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.1.tgz", + "integrity": "sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==", "dev": true, "dependencies": { + "@ardatan/relay-compiler": "12.0.0", "@graphql-tools/utils": "^10.0.13", - "dataloader": "^2.2.2", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "tslib": "^2.4.0" }, "engines": { "node": ">=16.0.0" @@ -1693,17 +2898,16 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/code-file-loader": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.1.tgz", - "integrity": "sha512-q4KN25EPSUztc8rA8YUU3ufh721Yk12xXDbtUA+YstczWS7a1RJlghYMFEfR1HsHSYbF7cUqkbnTKSGM3o52bQ==", + "node_modules/@graphql-tools/schema": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.3.tgz", + "integrity": "sha512-p28Oh9EcOna6i0yLaCFOnkcBDQECVf3SCexT6ktb86QNj9idnkhI+tCxnwZDh58Qvjd2nURdkbevvoZkvxzCog==", "dev": true, "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.0", + "@graphql-tools/merge": "^9.0.3", "@graphql-tools/utils": "^10.0.13", - "globby": "^11.0.3", "tslib": "^2.4.0", - "unixify": "^1.0.0" + "value-or-promise": "^1.0.12" }, "engines": { "node": ">=16.0.0" @@ -1712,18 +2916,25 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/delegate": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.9.tgz", - "integrity": "sha512-H+jGPLB0X23wlslw1JuB3y5j35NwZLUGhmjgaLYKkquAI/rtcs4+UwoW3hZ4SCN7h2LAKDa6HhsYYCRXyhdePA==", + "node_modules/@graphql-tools/url-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.2.tgz", + "integrity": "sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==", "dev": true, "dependencies": { - "@graphql-tools/batch-execute": "^9.0.4", - "@graphql-tools/executor": "^1.2.1", - "@graphql-tools/schema": "^10.0.3", + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^10.0.4", + "@graphql-tools/executor-graphql-ws": "^1.1.2", + "@graphql-tools/executor-http": "^1.0.9", + "@graphql-tools/executor-legacy-ws": "^1.0.6", "@graphql-tools/utils": "^10.0.13", - "dataloader": "^2.2.2", - "tslib": "^2.5.0" + "@graphql-tools/wrap": "^10.0.2", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.9.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" }, "engines": { "node": ">=16.0.0" @@ -1732,53 +2943,60 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/documents": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.0.tgz", - "integrity": "sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==", + "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", + "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tslib": "^2.4.0" + "@whatwg-node/node-fetch": "^0.5.7", + "urlpattern-polyfill": "^10.0.0" }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/executor": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.6.tgz", - "integrity": "sha512-+1kjfqzM5T2R+dCw7F4vdJ3CqG+fY/LYJyhNiWEFtq0ToLwYzR/KKyD8YuzTirEjSxWTVlcBh7endkx5n5F6ew==", + "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", + "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^10.1.1", - "@graphql-typed-document-node/core": "3.2.0", - "@repeaterjs/repeater": "^3.0.4", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "@kamilkisiela/fast-url-parser": "^1.1.4", + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "tslib": "^2.3.1" }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/executor-graphql-ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.2.tgz", - "integrity": "sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg==", + "node_modules/@graphql-tools/url-loader/node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, + "node_modules/@graphql-tools/utils": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.0.tgz", + "integrity": "sha512-HYV7dO6pNA2nGKawygaBpk8y+vXOUjjzzO43W/Kb7EPRmXUEQKjHxPYRvQbiF72u1N3XxwGK5jnnFk9WVhUwYw==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "@types/ws": "^8.0.0", - "graphql-ws": "^5.14.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "ws": "^8.13.0" + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" }, "engines": { "node": ">=16.0.0" @@ -1787,17 +3005,15 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/executor-http": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.9.tgz", - "integrity": "sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q==", + "node_modules/@graphql-tools/wrap": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.5.tgz", + "integrity": "sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/fetch": "^0.9.0", - "extract-files": "^11.0.0", - "meros": "^1.2.1", + "@graphql-tools/delegate": "^10.0.4", + "@graphql-tools/schema": "^10.0.3", + "@graphql-tools/utils": "^10.1.1", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, @@ -1808,1007 +3024,1078 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "dev": true, - "engines": { - "node": ">=16.0.0" + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.10.0" } }, - "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", - "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">=16.0.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@graphql-tools/executor-http/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/@graphql-tools/executor-legacy-ws": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.6.tgz", - "integrity": "sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", "dev": true, + "license": "ISC", "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "@types/ws": "^8.0.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "ws": "^8.15.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@graphql-tools/git-loader": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.5.tgz", - "integrity": "sha512-P97/1mhruDiA6D5WUmx3n/aeGPLWj2+4dpzDOxFGGU+z9NcI/JdygMkeFpGZNHeJfw+kHfxgPcMPnxHcyhAoVA==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.0", - "@graphql-tools/utils": "^10.0.13", - "is-glob": "4.0.3", - "micromatch": "^4.0.4", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=12" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@graphql-tools/github-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.1.tgz", - "integrity": "sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/executor-http": "^1.0.9", - "@graphql-tools/graphql-tag-pluck": "^8.0.0", - "@graphql-tools/utils": "^10.0.13", - "@whatwg-node/fetch": "^0.9.0", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">=6.0.0" } }, - "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { - "node": ">=16.0.0" + "node": ">=6.0.0" } }, - "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, "engines": { - "node": ">=16.0.0" + "node": ">=6.0.0" } }, - "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", - "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@graphql-tools/github-loader/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "node_modules/@kamilkisiela/fast-url-parser": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz", + "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==", "dev": true }, - "node_modules/@graphql-tools/graphql-file-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.1.tgz", - "integrity": "sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==", + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@graphql-tools/import": "7.0.1", - "@graphql-tools/utils": "^10.0.13", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.0.tgz", - "integrity": "sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw==", + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.22.9", - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0" + "debug": "4" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 6.0.0" } }, - "node_modules/@graphql-tools/import": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.1.tgz", - "integrity": "sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==", + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "resolve-from": "5.0.0", - "tslib": "^2.4.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 6" } }, - "node_modules/@graphql-tools/import/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@graphql-tools/json-file-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.1.tgz", - "integrity": "sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==", + "node_modules/@next/env": { + "version": "14.2.3", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.3", "dev": true, + "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.3", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 10" } }, - "node_modules/@graphql-tools/load": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.2.tgz", - "integrity": "sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==", - "dev": true, - "dependencies": { - "@graphql-tools/schema": "^10.0.3", - "@graphql-tools/utils": "^10.0.13", - "p-limit": "3.1.0", - "tslib": "^2.4.0" - }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", + "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", + "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", + "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 10" } }, - "node_modules/@graphql-tools/merge": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.4.tgz", - "integrity": "sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0" - }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", + "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 10" } }, - "node_modules/@graphql-tools/optimize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", - "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", + "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 10" } }, - "node_modules/@graphql-tools/prisma-loader": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.4.tgz", - "integrity": "sha512-hqKPlw8bOu/GRqtYr0+dINAI13HinTVYBDqhwGAPIFmLr5s+qKskzgCiwbsckdrb5LWVFmVZc+UXn80OGiyBzg==", - "dev": true, - "dependencies": { - "@graphql-tools/url-loader": "^8.0.2", - "@graphql-tools/utils": "^10.0.13", - "@types/js-yaml": "^4.0.0", - "@whatwg-node/fetch": "^0.9.0", - "chalk": "^4.1.0", - "debug": "^4.3.1", - "dotenv": "^16.0.0", - "graphql-request": "^6.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "jose": "^5.0.0", - "js-yaml": "^4.0.0", - "lodash": "^4.17.20", - "scuid": "^1.1.0", - "tslib": "^2.4.0", - "yaml-ast-parser": "^0.0.43" - }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", + "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 10" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "dev": true, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", + "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=16.0.0" + "node": ">= 10" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", - "dev": true, - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", + "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=16.0.0" + "node": ">= 10" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", - "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, + "license": "MIT", "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=16.0.0" + "node": ">= 8" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } }, - "node_modules/@graphql-tools/relay-operation-optimizer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.1.tgz", - "integrity": "sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, + "license": "MIT", "dependencies": { - "@ardatan/relay-compiler": "12.0.0", - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">= 8" } }, - "node_modules/@graphql-tools/schema": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.3.tgz", - "integrity": "sha512-p28Oh9EcOna6i0yLaCFOnkcBDQECVf3SCexT6ktb86QNj9idnkhI+tCxnwZDh58Qvjd2nURdkbevvoZkvxzCog==", + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", + "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", "dev": true, "dependencies": { - "@graphql-tools/merge": "^9.0.3", - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" } }, - "node_modules/@graphql-tools/url-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.2.tgz", - "integrity": "sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==", + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", "dev": true, "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/delegate": "^10.0.4", - "@graphql-tools/executor-graphql-ws": "^1.1.2", - "@graphql-tools/executor-http": "^1.0.9", - "@graphql-tools/executor-legacy-ws": "^1.0.6", - "@graphql-tools/utils": "^10.0.13", - "@graphql-tools/wrap": "^10.0.2", - "@types/ws": "^8.0.0", - "@whatwg-node/fetch": "^0.9.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.11", - "ws": "^8.12.0" + "tslib": "^2.0.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">=8.0.0" } }, - "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "node_modules/@peculiar/webcrypto": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.6.tgz", + "integrity": "sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg==", "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.7.9" + }, "engines": { - "node": ">=16.0.0" + "node": ">=10.12.0" } }, - "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "dev": true, - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, + "license": "MIT", + "optional": true, "engines": { - "node": ">=16.0.0" + "node": ">=14" } }, - "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", - "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", - "dev": true, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@graphql-tools/url-loader/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" }, - "node_modules/@graphql-tools/utils": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.0.tgz", - "integrity": "sha512-HYV7dO6pNA2nGKawygaBpk8y+vXOUjjzzO43W/Kb7EPRmXUEQKjHxPYRvQbiF72u1N3XxwGK5jnnFk9WVhUwYw==", - "dev": true, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-inspect": "1.0.0", - "dset": "^3.1.2", - "tslib": "^2.4.0" + "@babel/runtime": "^7.24.4" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">=14.x" } }, - "node_modules/@graphql-tools/wrap": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.5.tgz", - "integrity": "sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==", - "dev": true, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", "dependencies": { - "@graphql-tools/delegate": "^10.0.4", - "@graphql-tools/schema": "^10.0.3", - "@graphql-tools/utils": "^10.1.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "dev": true, - "license": "Apache-2.0", + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/runtime": "^7.18.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=8.x" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, "engines": { - "node": ">=12.22" + "node": ">=8.x" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" }, "engines": { - "node": ">=12" + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, "engines": { - "node": ">=12" + "node": ">=8.x" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" }, "engines": { - "node": ">=12" + "node": ">=8.x" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, + "node_modules/@rc-component/trigger": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz", + "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } - }, - "node_modules/@kamilkisiela/fast-url-parser": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz", - "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==", + }, + "node_modules/@repeaterjs/repeater": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.5.tgz", + "integrity": "sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==", "dev": true }, - "node_modules/@next/env": { - "version": "14.2.3", - "license": "MIT" + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.4.tgz", + "integrity": "sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.2.3", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.4.tgz", + "integrity": "sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "glob": "10.3.10" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.3", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.4.tgz", + "integrity": "sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", - "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.4.tgz", + "integrity": "sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", - "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.4.tgz", + "integrity": "sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.4.tgz", + "integrity": "sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==", + "cpu": [ + "x64" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", - "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.4.tgz", + "integrity": "sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==", "cpu": [ - "arm64" + "arm" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", - "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.4.tgz", + "integrity": "sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==", "cpu": [ - "x64" + "arm" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", - "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.4.tgz", + "integrity": "sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==", "cpu": [ - "x64" + "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", - "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.4.tgz", + "integrity": "sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } + "linux" + ] }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", - "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.4.tgz", + "integrity": "sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==", "cpu": [ - "ia32" + "loong64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.4.tgz", + "integrity": "sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==", + "cpu": [ + "ppc64" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", - "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.4.tgz", + "integrity": "sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==", "cpu": [ - "x64" + "riscv64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.4.tgz", + "integrity": "sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==", + "cpu": [ + "s390x" ], - "engines": { - "node": ">= 10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.4.tgz", + "integrity": "sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.4.tgz", + "integrity": "sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.4.tgz", + "integrity": "sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", - "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.4.tgz", + "integrity": "sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.4.tgz", + "integrity": "sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@peculiar/webcrypto": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.6.tgz", - "integrity": "sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg==", + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.2", "dev": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.7.9" - }, - "engines": { - "node": ">=10.12.0" + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, + "node_modules/@tanstack/query-core": { + "version": "5.66.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.66.0.tgz", + "integrity": "sha512-J+JeBtthiKxrpzUu7rfIPDzhscXF2p5zE/hVdrqkACBP8Yu0M96mwJ5m/8cPPYQE9aRNvXztXHlNwIh4FEeMZw==", "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@rc-component/async-validator": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.2.tgz", - "integrity": "sha512-ukdSere8wCNa5MpymNOYvOuHDODHlwBeaYEm0TtG91M7i72T7/cOVZhmDg9QcNe5+VP1YHJQEvquqA1bN5pTsg==", - "dependencies": { - "@babel/runtime": "^7.24.4" - }, - "engines": { - "node": ">=14.x" + "node_modules/@tanstack/query-devtools": { + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.65.0.tgz", + "integrity": "sha512-g5y7zc07U9D3esMdqUfTEVu9kMHoIaVBsD0+M3LPdAdD710RpTcLiNvJY1JkYXqkq9+NV+CQoemVNpQPBXVsJg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@rc-component/color-picker": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.3.tgz", - "integrity": "sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==", + "node_modules/@tanstack/react-query": { + "version": "5.66.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.66.0.tgz", + "integrity": "sha512-z3sYixFQJe8hndFnXgWu7C79ctL+pI0KAelYyW+khaNJ1m22lWrhJU2QrsTcRKMuVPtoZvfBYrTStIdKo+x0Xw==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.6", - "@ctrl/tinycolor": "^3.6.1", - "classnames": "^2.2.6", - "rc-util": "^5.38.1" + "@tanstack/query-core": "5.66.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": "^18 || ^19" } }, - "node_modules/@rc-component/context": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", - "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "node_modules/@tanstack/react-query-devtools": { + "version": "5.66.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.66.0.tgz", + "integrity": "sha512-uB57wA2YZaQ2fPcFW0E9O1zAGDGSbRKRx84uMk/86VyU9jWVxvJ3Uzp+zNm+nZJYsuekCIo2opTdgNuvM3cKgA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.10.1", - "rc-util": "^5.27.0" + "@tanstack/query-devtools": "5.65.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "@tanstack/react-query": "^5.66.0", + "react": "^18 || ^19" } }, - "node_modules/@rc-component/mini-decimal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">=8.x" + "node": ">=18" } }, - "node_modules/@rc-component/mutate-observer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", - "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "node_modules/@testing-library/react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.2.0.tgz", + "integrity": "sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">=8.x" + "node": ">=18" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@rc-component/portal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", - "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@rc-component/tour": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.14.2.tgz", - "integrity": "sha512-A75DZ8LVvahBIvxooj3Gvf2sxe+CGOkmzPNX7ek0i0AJHyKZ1HXe5ieIGo3m0FMdZfVOlbCJ952Duq8VKAHk6g==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.0", - "@rc-component/portal": "^1.0.0-9", - "@rc-component/trigger": "^2.0.0", - "classnames": "^2.3.2", - "rc-util": "^5.24.4" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "@babel/types": "^7.0.0" } }, - "node_modules/@rc-component/trigger": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.1.1.tgz", - "integrity": "sha512-UjHkedkgtEcgQu87w1VuWug1idoDJV7VUt0swxHXRcmei2uu1AuUzGBPEUlmOmXGJ+YtTgZfVLi7kuAUKoZTMA==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "@rc-component/portal": "^1.1.0", - "classnames": "^2.3.2", - "rc-motion": "^2.0.0", - "rc-resize-observer": "^1.3.1", - "rc-util": "^5.38.0" - }, - "engines": { - "node": ">=8.x" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@repeaterjs/repeater": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.5.tgz", - "integrity": "sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==", - "dev": true - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.2", + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, - "license": "MIT" - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/d3-array": { @@ -2874,6 +4161,13 @@ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, + "node_modules/@types/estree": { + "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, + "license": "MIT" + }, "node_modules/@types/js-yaml": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", @@ -2893,7 +4187,6 @@ }, "node_modules/@types/node": { "version": "20.12.8", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -2994,89 +4287,222 @@ "node_modules/@typescript-eslint/typescript-estree": { "version": "7.2.0", "dev": true, - "license": "BSD-2-Clause", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", + "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.0.5", + "@vitest/utils": "3.0.5", + "chai": "^5.1.2", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", + "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", + "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "@vitest/spy": "3.0.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { - "typescript": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/@vitest/pretty-format": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", + "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "tinyrainbow": "^2.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", + "node_modules/@vitest/runner": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", + "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "@vitest/utils": "3.0.5", + "pathe": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", + "node_modules/@vitest/snapshot": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", + "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@vitest/pretty-format": "3.0.5", + "magic-string": "^0.30.17", + "pathe": "^2.0.2" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", + "node_modules/@vitest/spy": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", + "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "tinyspy": "^3.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", + "node_modules/@vitest/utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", + "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.5", + "loupe": "^3.1.2", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, "node_modules/@whatwg-node/events": { "version": "0.0.3", @@ -3154,6 +4580,19 @@ "node": ">=8" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/abort-controller-x": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/abort-controller-x/-/abort-controller-x-0.4.3.tgz", + "integrity": "sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==", + "license": "MIT" + }, "node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -3174,13 +4613,11 @@ } }, "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { "node": ">= 14" } @@ -3272,58 +4709,60 @@ } }, "node_modules/antd": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.17.0.tgz", - "integrity": "sha512-jrzMIcaTJIy12/GJ2PfgchgZGuAlDodlaOKd05/TxEtFilRHnv8oaf0qfqNGG3slvvuy4J/57xn21jM4cLl7Hw==", + "version": "5.23.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.23.1.tgz", + "integrity": "sha512-rg5xd5LotHw0IRyo/nsiUN/EEV3e+xU4V4UmIb/62hMN9+3APyz1Ohjf17a+fN13jC8sNY1hP1K252SU2Th0xA==", + "license": "MIT", "dependencies": { - "@ant-design/colors": "^7.0.2", - "@ant-design/cssinjs": "^1.19.1", - "@ant-design/icons": "^5.3.6", + "@ant-design/colors": "^7.2.0", + "@ant-design/cssinjs": "^1.22.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.5.2", "@ant-design/react-slick": "~1.1.2", - "@babel/runtime": "^7.24.5", - "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~1.5.3", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/tour": "~1.14.2", - "@rc-component/trigger": "^2.1.1", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.2.6", "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", - "dayjs": "^1.11.10", - "qrcode.react": "^3.1.0", - "rc-cascader": "~3.25.0", - "rc-checkbox": "~3.2.0", - "rc-collapse": "~3.7.3", - "rc-dialog": "~9.4.0", - "rc-drawer": "~7.1.0", - "rc-dropdown": "~4.2.0", - "rc-field-form": "~2.0.0", - "rc-image": "~7.6.0", - "rc-input": "~1.4.5", - "rc-input-number": "~9.0.0", - "rc-mentions": "~2.11.1", - "rc-menu": "~9.13.0", - "rc-motion": "^2.9.0", - "rc-notification": "~5.4.0", - "rc-pagination": "~4.0.4", - "rc-picker": "~4.5.0", + "dayjs": "^1.11.11", + "rc-cascader": "~3.33.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.2.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.0", + "rc-image": "~7.11.0", + "rc-input": "~1.7.2", + "rc-input-number": "~9.4.0", + "rc-mentions": "~2.19.1", + "rc-menu": "~9.16.0", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.2", + "rc-pagination": "~5.0.0", + "rc-picker": "~4.9.2", "rc-progress": "~4.0.0", - "rc-rate": "~2.12.0", - "rc-resize-observer": "^1.4.0", - "rc-segmented": "~2.3.0", - "rc-select": "~14.13.1", - "rc-slider": "~10.6.2", + "rc-rate": "~2.13.0", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.5", + "rc-slider": "~11.1.8", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", - "rc-table": "~7.45.5", - "rc-tabs": "~15.0.0 ", - "rc-textarea": "~1.6.3", - "rc-tooltip": "~6.2.0", - "rc-tree": "~5.8.5", - "rc-tree-select": "~5.20.0", - "rc-upload": "~4.5.2", - "rc-util": "^5.39.1", + "rc-table": "~7.50.2", + "rc-tabs": "~15.5.0", + "rc-textarea": "~1.9.0", + "rc-tooltip": "~6.3.2", + "rc-tree": "~5.13.0", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.8.1", + "rc-util": "^5.44.3", "scroll-into-view-if-needed": "^3.1.0", - "throttle-debounce": "^5.0.0" + "throttle-debounce": "^5.0.2" }, "funding": { "type": "opencollective", @@ -3334,6 +4773,28 @@ "react-dom": ">=16.9.0" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/argparse": { "version": "2.0.1", "dev": true, @@ -3381,11 +4842,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-tree-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" - }, "node_modules/array-union": { "version": "2.1.0", "dev": true, @@ -3530,6 +4986,16 @@ "node": ">=12.0.0" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "dev": true, @@ -3544,6 +5010,13 @@ "node": ">=8" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/auto-bind": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", @@ -3688,9 +5161,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3706,11 +5179,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3761,6 +5235,16 @@ "node": ">=10.16.0" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.7", "dev": true, @@ -3807,7 +5291,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001615", + "version": "1.0.30001697", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz", + "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==", "funding": [ { "type": "opencollective", @@ -3835,6 +5321,36 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -3894,6 +5410,26 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -4054,12 +5590,35 @@ "dev": true, "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -4089,6 +5648,13 @@ "dev": true, "license": "MIT" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", @@ -4188,6 +5754,20 @@ "node": ">= 8" } }, + "node_modules/cssstyle": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/csstype": { "version": "3.1.3", "license": "MIT" @@ -4318,6 +5898,57 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "dev": true, @@ -4384,11 +6015,13 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4408,12 +6041,29 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT" + }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", "license": "MIT" }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -4463,6 +6113,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", @@ -4489,6 +6156,16 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "dev": true, @@ -4511,6 +6188,13 @@ "node": ">=0.10.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -4536,11 +6220,34 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, - "engines": { - "node": ">=12" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dprint-node": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3" + } + }, + "node_modules/dprint-node/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" }, - "funding": { - "url": "https://dotenvx.com" + "engines": { + "node": ">=0.10" } }, "node_modules/dset": { @@ -4558,10 +6265,11 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.757", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz", - "integrity": "sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==", - "dev": true + "version": "1.5.93", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.93.tgz", + "integrity": "sha512-M+29jTcfNNoR9NV7la4SwUqzWAxEwnc7ThA5e1m6LRSotmpfpCpLcIfgtSCVL+MllNLgAyM/5ru86iMRemPzDQ==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -4580,6 +6288,19 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-cmd": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", @@ -4708,6 +6429,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.0.0", "dev": true, @@ -4756,11 +6484,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4873,11 +6643,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-import-resolver-typescript": { "version": "3.6.1", "dev": true, @@ -4926,11 +6691,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "dev": true, @@ -4969,11 +6729,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.8.0", "dev": true, @@ -5149,6 +6904,16 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "dev": true, @@ -5163,6 +6928,16 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -5411,6 +7186,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/framer-motion": { "version": "11.1.9", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.9.tgz", @@ -5435,11 +7225,52 @@ } } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "dev": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -5473,6 +7304,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5630,6 +7505,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, "node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -5753,6 +7635,20 @@ "graphql": ">=0.11 <=16" } }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -5816,6 +7712,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "dev": true, @@ -5845,6 +7748,19 @@ "react-is": "^16.7.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -5859,12 +7775,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -6311,6 +8228,13 @@ "node": ">=8" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.1.4", "dev": true, @@ -6509,7 +8433,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "dev": true, "peerDependencies": { "ws": "*" } @@ -6561,6 +8484,12 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-base64": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", + "license": "BSD-3-Clause" + }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" @@ -6576,16 +8505,95 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -6878,6 +8886,12 @@ "node": ">=8" } }, + "node_modules/long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", + "license": "Apache-2.0" + }, "node_modules/loose-envify": { "version": "1.4.0", "license": "MIT", @@ -6888,6 +8902,13 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -6907,11 +8928,46 @@ } }, "node_modules/lru-cache": { - "version": "10.2.2", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", + "license": "ISC" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": "14 || >=16.14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/map-cache": { @@ -6962,6 +9018,29 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -6995,20 +9074,62 @@ "version": "1.2.8", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/minipass": { - "version": "7.0.4", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, @@ -7019,7 +9140,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -7087,6 +9210,41 @@ } } }, + "node_modules/next-runtime-env": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-3.2.2.tgz", + "integrity": "sha512-S5S6NxIf3XeaVc9fLBN2L5Jzu+6dLYCXeOaPQa1RzKRYlG2BBayxXOj6A4VsciocyNkJMazW1VAibtbb1/ZjAw==", + "license": "MIT", + "dependencies": { + "next": "^14", + "react": "^18" + }, + "peerDependencies": { + "next": "^14", + "react": "^18" + } + }, + "node_modules/nice-grpc-common": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz", + "integrity": "sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==", + "license": "MIT", + "dependencies": { + "ts-error": "^1.0.6" + } + }, + "node_modules/nice-grpc-web": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/nice-grpc-web/-/nice-grpc-web-3.3.5.tgz", + "integrity": "sha512-+G+WcHUHCXZC/GcZ8OiuT7BSlvIBsujaojcemGIHClq8Dh3z31BzsC1E8bUv++WzQAHq1/8PnBySvcmF1tb90Q==", + "license": "MIT", + "dependencies": { + "abort-controller-x": "^0.4.0", + "isomorphic-ws": "^5.0.0", + "js-base64": "^3.7.2", + "nice-grpc-common": "^2.0.2" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -7124,10 +9282,27 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/normalize-path": { "version": "2.1.1", @@ -7141,12 +9316,33 @@ "node": ">=0.10.0" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "license": "MIT", @@ -7460,6 +9656,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -7553,8 +9762,27 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { - "version": "1.0.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { @@ -7610,6 +9838,41 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -7628,6 +9891,30 @@ "react-is": "^16.13.1" } }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "dev": true, @@ -7654,14 +9941,6 @@ "node": ">=6.0.0" } }, - "node_modules/qrcode.react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", - "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "dev": true, @@ -7682,16 +9961,16 @@ "license": "MIT" }, "node_modules/rc-cascader": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.25.0.tgz", - "integrity": "sha512-mBY6/CykOvzAYnIye0rpt5JkMAXJaX8zZawOwSndbKuFakYE+leqBQWIZoN9HIgAptPpTi2Aty3RvbaBmk8SKQ==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.33.0.tgz", + "integrity": "sha512-JvZrMbKBXIbEDmpIORxqvedY/bck6hGbs3hxdWT8eS9wSQ1P7//lGxbyKjOSyQiVBbgzNWriSe6HoMcZO/+0rQ==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "array-tree-filter": "^2.1.0", + "@babel/runtime": "^7.25.7", "classnames": "^2.3.1", - "rc-select": "~14.13.0", - "rc-tree": "~5.8.1", - "rc-util": "^5.37.0" + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -7699,9 +9978,10 @@ } }, "node_modules/rc-checkbox": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.2.0.tgz", - "integrity": "sha512-8inzw4y9dAhZmv/Ydl59Qdy5tdp9CKg4oPVcRigi+ga/yKPZS5m5SyyQPtYSgbcqHRYOdUhiPSeKfktc76du1A==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.3.2", @@ -7713,9 +9993,10 @@ } }, "node_modules/rc-collapse": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.3.tgz", - "integrity": "sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -7728,9 +10009,10 @@ } }, "node_modules/rc-dialog": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.4.0.tgz", - "integrity": "sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-8", @@ -7744,9 +10026,10 @@ } }, "node_modules/rc-drawer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.1.0.tgz", - "integrity": "sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", + "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@rc-component/portal": "^1.1.1", @@ -7760,14 +10043,15 @@ } }, "node_modules/rc-dropdown": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", - "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.6", - "rc-util": "^5.17.0" + "rc-util": "^5.44.1" }, "peerDependencies": { "react": ">=16.11.0", @@ -7775,12 +10059,13 @@ } }, "node_modules/rc-field-form": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.0.0.tgz", - "integrity": "sha512-Xwp8SoSbWQOsz3s7IwEkDj/fF73Wa+vVPtP+gnaq6wVvPX8aPhx1vrHpFcgmiIOKdKIdezGLFsTyU3kNXn+IEA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", + "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", - "@rc-component/async-validator": "^5.0.1", + "@rc-component/async-validator": "^5.0.3", "rc-util": "^5.32.2" }, "engines": { @@ -7792,14 +10077,15 @@ } }, "node_modules/rc-image": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.6.0.tgz", - "integrity": "sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.11.0.tgz", + "integrity": "sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", "classnames": "^2.2.6", - "rc-dialog": "~9.4.0", + "rc-dialog": "~9.6.0", "rc-motion": "^2.6.2", "rc-util": "^5.34.1" }, @@ -7809,9 +10095,10 @@ } }, "node_modules/rc-input": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.4.5.tgz", - "integrity": "sha512-AjzykhwnwYTRSwwgCu70CGKBIAv6bP2nqnFptnNTprph/TF1BAs0Qxl91mie/BR6n827WIJB6ZjaRf9iiMwAfw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.7.2.tgz", + "integrity": "sha512-g3nYONnl4edWj2FfVoxsU3Ec4XTE+Hb39Kfh2MFxMZjp/0gGyPUgy/v7ZhS27ZxUFNkuIDYXm9PJsLyJbtg86A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -7823,15 +10110,16 @@ } }, "node_modules/rc-input-number": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.0.0.tgz", - "integrity": "sha512-RfcDBDdWFFetouWFXBA+WPEC8LzBXyngr9b+yTLVIygfFu7HiLRGn/s/v9wwno94X7KFvnb28FNynMGj9XJlDQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.4.0.tgz", + "integrity": "sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/mini-decimal": "^1.0.1", "classnames": "^2.2.5", - "rc-input": "~1.4.0", - "rc-util": "^5.28.0" + "rc-input": "~1.7.1", + "rc-util": "^5.40.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -7839,16 +10127,17 @@ } }, "node_modules/rc-mentions": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.11.1.tgz", - "integrity": "sha512-upb4AK1SRFql7qGnbLEvJqLMugVVIyjmwBJW9L0eLoN9po4JmJZaBzmKA4089fNtsU8k6l/tdZiVafyooeKnLw==", + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.19.1.tgz", + "integrity": "sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.22.5", "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.6", - "rc-input": "~1.4.0", - "rc-menu": "~9.13.0", - "rc-textarea": "~1.6.1", + "rc-input": "~1.7.1", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.9.0", "rc-util": "^5.34.1" }, "peerDependencies": { @@ -7857,9 +10146,10 @@ } }, "node_modules/rc-menu": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.13.0.tgz", - "integrity": "sha512-1l8ooCB3HcYJKCltC/s7OxRKRjgymdl9htrCeGZcXNaMct0RxZRK6OPV3lPhVksIvAGMgzPd54ClpZ5J4b8cZA==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.0.tgz", + "integrity": "sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/trigger": "^2.0.0", @@ -7874,13 +10164,14 @@ } }, "node_modules/rc-motion": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", - "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", - "rc-util": "^5.21.0" + "rc-util": "^5.44.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -7888,9 +10179,10 @@ } }, "node_modules/rc-notification": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.4.0.tgz", - "integrity": "sha512-li19y9RoYJciF3WRFvD+DvWS70jdL8Fr+Gfb/OshK+iY6iTkwzoigmSIp76/kWh5tF5i/i9im12X3nsF85GYdA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.2.tgz", + "integrity": "sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -7921,9 +10213,10 @@ } }, "node_modules/rc-pagination": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.0.4.tgz", - "integrity": "sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.0.0.tgz", + "integrity": "sha512-QjrPvbAQwps93iluvFM62AEYglGYhWW2q/nliQqmvkTi4PXP4HHoh00iC1Sa5LLVmtWQHmG73fBi2x6H6vFHRg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.3.2", @@ -7935,16 +10228,17 @@ } }, "node_modules/rc-picker": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.5.0.tgz", - "integrity": "sha512-suqz9bzuhBQlf7u+bZd1bJLPzhXpk12w6AjQ9BTPTiFwexVZgUKViG1KNLyfFvW6tCUZZK0HmCCX7JAyM+JnCg==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.9.2.tgz", + "integrity": "sha512-SLW4PRudODOomipKI0dvykxW4P8LOqtMr17MOaLU6NQJhkh9SZeh44a/8BMxwv5T6e3kiIeYc9k5jFg2Mv35Pg==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.10.1", + "@babel/runtime": "^7.24.7", "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.1", "rc-overflow": "^1.3.2", "rc-resize-observer": "^1.4.0", - "rc-util": "^5.38.1" + "rc-util": "^5.43.0" }, "engines": { "node": ">=8.x" @@ -7987,9 +10281,10 @@ } }, "node_modules/rc-rate": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", - "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", + "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -8004,13 +10299,14 @@ } }, "node_modules/rc-resize-observer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", - "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.7", "classnames": "^2.2.1", - "rc-util": "^5.38.0", + "rc-util": "^5.44.1", "resize-observer-polyfill": "^1.5.1" }, "peerDependencies": { @@ -8019,9 +10315,10 @@ } }, "node_modules/rc-segmented": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", - "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz", + "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -8034,9 +10331,10 @@ } }, "node_modules/rc-select": { - "version": "14.13.2", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.13.2.tgz", - "integrity": "sha512-Xwt5ZcS5PKGR6bJL/dBRH6AFtC8FgVu2a+2T8NuyldhppKZlmZREK3nc5gONf+VlN+IbCxbr6vivgkbdPZJYng==", + "version": "14.16.5", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.5.tgz", + "integrity": "sha512-cRls713egTcitJ7WUXhHEf22h3U1OMC8nbw9+HN4Fniew8Xo3avgEDvIeGRwhbiyPNbQR23AwP+tt6KWUcB4IA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/trigger": "^2.1.1", @@ -8055,9 +10353,10 @@ } }, "node_modules/rc-slider": { - "version": "10.6.2", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.6.2.tgz", - "integrity": "sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==", + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz", + "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -8103,16 +10402,17 @@ } }, "node_modules/rc-table": { - "version": "7.45.5", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.45.5.tgz", - "integrity": "sha512-R5sOfToOk7CalSkebZpqM8lkKWOJR7uXPGEhjjTSoj5egyHBwMxaACoPj2oI+6qLSll9yZrG5K+8HTN57b2Ahg==", + "version": "7.50.2", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.50.2.tgz", + "integrity": "sha512-+nJbzxzstBriLb5sr9U7Vjs7+4dO8cWlouQbMwBVYghk2vr508bBdkHJeP/z9HVjAIKmAgMQKxmtbgDd3gc5wA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/context": "^1.4.0", "classnames": "^2.2.5", "rc-resize-observer": "^1.1.0", - "rc-util": "^5.37.0", - "rc-virtual-list": "^3.11.1" + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" }, "engines": { "node": ">=8.x" @@ -8123,14 +10423,15 @@ } }, "node_modules/rc-tabs": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.0.0.tgz", - "integrity": "sha512-7m541VcEiJSpHZmosMZNMIhemxtIN+f0WDhZNyXQ1/cZ40aaWsknlbj0FH6HryLoKEQvBnCI89hgQuT7MBSOBA==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.5.0.tgz", + "integrity": "sha512-NrDcTaUJLh9UuDdMBkjKTn97U9iXG44s9D03V5NHkhEDWO5/nC6PwC3RhkCWFMKB9hh+ryqgZ+TIr1b9Jd/hnQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", "rc-dropdown": "~4.2.0", - "rc-menu": "~9.13.0", + "rc-menu": "~9.16.0", "rc-motion": "^2.6.2", "rc-resize-observer": "^1.0.0", "rc-util": "^5.34.1" @@ -8144,13 +10445,14 @@ } }, "node_modules/rc-textarea": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.6.3.tgz", - "integrity": "sha512-8k7+8Y2GJ/cQLiClFMg8kUXOOdvcFQrnGeSchOvI2ZMIVvX5a3zQpLxoODL0HTrvU63fPkRmMuqaEcOF9dQemA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.9.0.tgz", + "integrity": "sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", - "rc-input": "~1.4.0", + "rc-input": "~1.7.1", "rc-resize-observer": "^1.0.0", "rc-util": "^5.27.0" }, @@ -8160,9 +10462,10 @@ } }, "node_modules/rc-tooltip": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", - "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.3.2.tgz", + "integrity": "sha512-oA4HZIiZJbUQ5ojigM0y4XtWxaH/aQlJSzknjICRWNpqyemy1sL3X3iEQV2eSPBWEq+bqU3+aSs81z+28j9luA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/trigger": "^2.0.0", @@ -8174,9 +10477,10 @@ } }, "node_modules/rc-tree": { - "version": "5.8.7", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.7.tgz", - "integrity": "sha512-cpsIQZ4nNYwpj6cqPRt52e/69URuNdgQF9wZ10InmEf8W3+i0A41OVmZWwHuX9gegQSqj+DPmaDkZFKQZ+ZV1w==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.0.tgz", + "integrity": "sha512-2+lFvoVRnvHQ1trlpXMOWtF8BUgF+3TiipG72uOfhpL5CUdXCk931kvDdUkTL/IZVtNEDQKwEEmJbAYJSA5NnA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -8193,15 +10497,16 @@ } }, "node_modules/rc-tree-select": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.20.0.tgz", - "integrity": "sha512-zFtkHx5/6PnXSi3oSbBSFbIPiJJQdpSU3qz/joLe75URgvxmTHi989O8MtMgpwyZwrCMOJpGi6L1uy+13uzZPw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.10.1", + "@babel/runtime": "^7.25.7", "classnames": "2.x", - "rc-select": "~14.13.0", - "rc-tree": "~5.8.1", - "rc-util": "^5.16.1" + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" }, "peerDependencies": { "react": "*", @@ -8209,9 +10514,10 @@ } }, "node_modules/rc-upload": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.5.2.tgz", - "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.8.1.tgz", + "integrity": "sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", @@ -8223,9 +10529,10 @@ } }, "node_modules/rc-util": { - "version": "5.39.3", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.39.3.tgz", - "integrity": "sha512-j9wOELkLQ8gC/NkUg3qg9mHZcJf+5mYYv40JrDHqnaf8VSycji4pCf7kJ5fdTXQPDIF0vr5zpb/T2HdrMs9rWA==", + "version": "5.44.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.3.tgz", + "integrity": "sha512-q6KCcOFk3rv/zD3MckhJteZxb0VjAIFuf622B7ElK4vfrZdAzs16XR5p3VTdy3+U5jfJU5ACz4QnhLSuAGe5dA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -8241,9 +10548,10 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/rc-virtual-list": { - "version": "3.11.5", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.5.tgz", - "integrity": "sha512-iZRW99m5jAxtwKNPLwUrPryurcnKpXBdTyhuBp6ythf7kg/otKO5cCiIvL55GQwU0QGSlouQS0tnkciRMJUwRQ==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.17.0.tgz", + "integrity": "sha512-h0jPHWt8/Ots9eiGVSGQTxwrSuQ3kxqL/ERKubv8zzIMICGQaDDWm/JoUa31MdQUC7PKDMiy5KDLkNfHcWo+iQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", @@ -8283,6 +10591,16 @@ "version": "16.13.1", "license": "MIT" }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-smooth": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz", @@ -8577,6 +10895,52 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.34.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.4.tgz", + "integrity": "sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.4", + "@rollup/rollup-android-arm64": "4.34.4", + "@rollup/rollup-darwin-arm64": "4.34.4", + "@rollup/rollup-darwin-x64": "4.34.4", + "@rollup/rollup-freebsd-arm64": "4.34.4", + "@rollup/rollup-freebsd-x64": "4.34.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.4", + "@rollup/rollup-linux-arm-musleabihf": "4.34.4", + "@rollup/rollup-linux-arm64-gnu": "4.34.4", + "@rollup/rollup-linux-arm64-musl": "4.34.4", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.4", + "@rollup/rollup-linux-riscv64-gnu": "4.34.4", + "@rollup/rollup-linux-s390x-gnu": "4.34.4", + "@rollup/rollup-linux-x64-gnu": "4.34.4", + "@rollup/rollup-linux-x64-musl": "4.34.4", + "@rollup/rollup-win32-arm64-msvc": "4.34.4", + "@rollup/rollup-win32-ia32-msvc": "4.34.4", + "@rollup/rollup-win32-x64-msvc": "4.34.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -8676,6 +11040,19 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.2", "license": "MIT", @@ -8803,6 +11180,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.1.0", "dev": true, @@ -8853,7 +11237,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -8868,6 +11254,20 @@ "tslib": "^2.0.3" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, "node_modules/streamsearch": { "version": "1.1.0", "engines": { @@ -9089,9 +11489,10 @@ } }, "node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.5.tgz", + "integrity": "sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==", + "license": "MIT" }, "node_modules/superjson": { "version": "2.2.1", @@ -9143,6 +11544,13 @@ "node": ">=0.10" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -9151,15 +11559,44 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "dev": true, "license": "MIT" }, "node_modules/throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", "engines": { "node": ">=12.22" } @@ -9176,6 +11613,50 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/title-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", @@ -9185,6 +11666,26 @@ "tslib": "^2.0.3" } }, + "node_modules/tldts": { + "version": "6.1.76", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.76.tgz", + "integrity": "sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.76" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.76", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.76.tgz", + "integrity": "sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==", + "dev": true, + "license": "MIT" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9197,15 +11698,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9224,6 +11716,19 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, + "node_modules/tough-cookie": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz", + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -9241,6 +11746,12 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-error": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ts-error/-/ts-error-1.0.6.tgz", + "integrity": "sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==", + "license": "MIT" + }, "node_modules/ts-invariant": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", @@ -9258,6 +11769,63 @@ "integrity": "sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==", "dev": true }, + "node_modules/ts-poet": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.9.0.tgz", + "integrity": "sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dprint-node": "^1.0.8" + } + }, + "node_modules/ts-proto": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-2.6.1.tgz", + "integrity": "sha512-4LTT99MkwkF1+fIA0b2mZu/58Qlpq3Q1g53TwEMZZgR1w/uX00PoVT4Z8aKJxMw0LeKQD4s9NrJYsF27Clckrg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "case-anything": "^2.1.13", + "ts-poet": "^6.7.0", + "ts-proto-descriptors": "2.0.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-2.0.0.tgz", + "integrity": "sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bufbuild/protobuf": "^2.0.0" + } + }, + "node_modules/tsconfck": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "dev": true, @@ -9424,7 +11992,6 @@ }, "node_modules/undici-types": { "version": "5.26.5", - "dev": true, "license": "MIT" }, "node_modules/unixify": { @@ -9440,9 +12007,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", - "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -9458,9 +12025,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -9550,6 +12118,233 @@ "d3-timer": "^3.0.1" } }, + "node_modules/vite": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", + "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.5.1", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@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.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", + "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.2", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitest": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", + "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.0.5", + "@vitest/mocker": "3.0.5", + "@vitest/pretty-format": "^3.0.5", + "@vitest/runner": "3.0.5", + "@vitest/snapshot": "3.0.5", + "@vitest/spy": "3.0.5", + "@vitest/utils": "3.0.5", + "chai": "^5.1.2", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.5", + "@vitest/ui": "3.0.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -9587,6 +12382,42 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -9692,6 +12523,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "dev": true, @@ -9791,7 +12664,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -9809,6 +12681,23 @@ } } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5f2ef8aa..1aa97577 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,7 +7,8 @@ "build": "next build --experimental-build-mode=compile", "start": "next start", "lint": "next lint", - "generate": "graphql-codegen --config ./src/graphql/codegen.ts", + "test": "vitest", + "generate": "graphql-codegen --config ./src/graphql/codegen.ts && ./scripts/grpc-client-gen.sh", "predev": "npm run generate", "build:test": "NODE_ENV=test next build" }, @@ -17,6 +18,8 @@ "@ant-design/icons": "^5.3.7", "@apollo/client": "^3.10.2", "@apollo/experimental-nextjs-app-support": "^0.10.0", + "@tanstack/react-query": "^5.66.0", + "@tanstack/react-query-devtools": "^5.66.0", "ansi_up": "^6.0.2", "antd": "^5.21.3", "dayjs": "^1.11.11", @@ -24,8 +27,11 @@ "graphql": "^16.8.1", "linkify-html": "^4.1.3", "lodash": "^4.17.21", + "long": "^5.2.4", "next": "14.2.3", "next-runtime-env": "^3.2.2", + "nice-grpc-web": "^3.3.5", + "protobufjs": "^7.4.0", "rc-menu": "^9.13.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -37,15 +43,23 @@ "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/client-preset": "^4.2.5", "@graphql-typed-document-node/core": "^3.2.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.2.0", "@types/lodash": "^4.17.4", "@types/node": "^20.12.8", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@types/uuid": "^9.0.8", + "@vitejs/plugin-react": "^4.3.4", "env-cmd": "^10.1.0", "eslint": "^8.57.0", "eslint-config-next": "14.2.3", - "typescript": "^5.4.5" + "grpc-tools": "^1.12.4", + "jsdom": "^26.0.0", + "ts-proto": "^2.6.1", + "typescript": "^5.4.5", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.0.5" }, "pnpm": { "onlyBuiltDependencies": [] diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 609bb733..480e6082 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,25 +10,31 @@ importers: dependencies: '@ant-design/colors': specifier: ^7.0.2 - version: 7.0.2 + version: 7.2.0 '@ant-design/cssinjs': specifier: ^1.20.0 - version: 1.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@ant-design/icons': specifier: ^5.3.7 - version: 5.3.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@apollo/client': specifier: ^3.10.2 version: 3.10.2(@types/react@18.3.1)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@apollo/experimental-nextjs-app-support': specifier: ^0.10.0 - version: 0.10.0(@apollo/client@3.10.2(@types/react@18.3.1)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 0.10.0(@apollo/client@3.10.2(@types/react@18.3.1)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': + specifier: ^5.66.0 + version: 5.66.0(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.66.0 + version: 5.66.0(@tanstack/react-query@5.66.0(react@18.3.1))(react@18.3.1) ansi_up: specifier: ^6.0.2 version: 6.0.2 antd: specifier: ^5.21.3 - version: 5.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) dayjs: specifier: ^1.11.11 version: 1.11.11 @@ -44,21 +50,27 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.21 + long: + specifier: ^5.2.4 + version: 5.2.4 next: specifier: 14.2.3 - version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-runtime-env: specifier: ^3.2.2 - version: 3.2.2(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.2.2(next@14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + nice-grpc-web: + specifier: ^3.3.5 + version: 3.3.5(ws@8.18.0) + protobufjs: + specifier: ^7.4.0 + version: 7.4.0 rc-menu: specifier: ^9.13.0 - version: 9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 - react-countup: - specifier: ^6.5.3 - version: 6.5.3(react@18.3.1) react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) @@ -81,6 +93,12 @@ importers: '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.8.1) + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.0 + '@testing-library/react': + specifier: ^16.2.0 + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/lodash': specifier: ^4.17.4 version: 4.17.4 @@ -96,6 +114,9 @@ importers: '@types/uuid': specifier: ^9.0.8 version: 9.0.8 + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2)) env-cmd: specifier: ^10.1.0 version: 10.1.0 @@ -105,9 +126,24 @@ importers: eslint-config-next: specifier: 14.2.3 version: 14.2.3(eslint@8.57.0)(typescript@5.4.5) + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + jsdom: + specifier: ^26.0.0 + version: 26.0.0 + ts-proto: + specifier: ^2.6.1 + version: 2.6.1 typescript: specifier: ^5.4.5 version: 5.4.5 + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.4.5)(vite@6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2)) + vitest: + specifier: ^3.0.5 + version: 3.0.5(@types/node@20.12.8)(jiti@1.21.0)(jsdom@26.0.0)(yaml@2.4.2) packages: @@ -115,26 +151,17 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@ant-design/colors@7.0.2': - resolution: {integrity: sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==} + '@ant-design/colors@7.2.0': + resolution: {integrity: sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==} - '@ant-design/colors@7.1.0': - resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} - - '@ant-design/cssinjs-utils@1.1.0': - resolution: {integrity: sha512-E9nOWObXx7Dy7hdyuYlOFaer/LtPO7oyZVxZphh0CYEslr5EmhJPM3WI0Q2RBHRtYg6dSNqeSK73kvZjPN3IMQ==} + '@ant-design/cssinjs-utils@1.1.3': + resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@ant-design/cssinjs@1.20.0': - resolution: {integrity: sha512-uG3iWzJxgNkADdZmc6W0Ci3iQAUOvLMcM8SnnmWq3r6JeocACft4ChnY/YWvI2Y+rG/68QBla/O+udke1yH3vg==} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - '@ant-design/cssinjs@1.21.1': - resolution: {integrity: sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==} + '@ant-design/cssinjs@1.22.1': + resolution: {integrity: sha512-SLuXM4wiEE1blOx94iXrkOgseMZHzdr4ngdFu3VVDq6AOWh7rlwqTkMAtJho3EsBF6x/eUGOtK53VZXGQG7+sQ==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' @@ -146,15 +173,8 @@ packages: '@ant-design/icons-svg@4.4.2': resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} - '@ant-design/icons@5.3.7': - resolution: {integrity: sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==} - engines: {node: '>=8'} - peerDependencies: - react: '>=16.0.0' - react-dom: '>=16.0.0' - - '@ant-design/icons@5.5.1': - resolution: {integrity: sha512-0UrM02MA2iDIgvLatWrj6YTCYe0F/cwXvVE0E2SqGrL7PZireQwgEKTKBisWpZyal5eXZLvuM98kju6YtYne8w==} + '@ant-design/icons@5.5.2': + resolution: {integrity: sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==} engines: {node: '>=8'} peerDependencies: react: '>=16.0.0' @@ -206,28 +226,31 @@ packages: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} engines: {node: '>=14'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@asamuzakjp/css-color@2.8.3': + resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/core@7.26.7': + resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.22.5': resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.24.5': @@ -244,20 +267,16 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.24.5': resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -266,8 +285,8 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} '@babel/helper-replace-supers@7.24.1': @@ -288,28 +307,24 @@ packages: resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + '@babel/helpers@7.26.7': + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/parser@7.26.7': + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} engines: {node: '>=6.0.0'} hasBin: true @@ -451,6 +466,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.23.4': resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} @@ -475,29 +502,52 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.25.7': - resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/traverse@7.26.7': + resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/types@7.26.7': + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} - engines: {node: '>=6.9.0'} + '@bufbuild/protobuf@2.2.3': + resolution: {integrity: sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==} - '@ctrl/tinycolor@3.6.1': - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} + '@csstools/color-helpers@5.0.1': + resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.1': + resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-color-parser@3.0.7': + resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} '@emotion/hash@0.8.0': resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} @@ -505,6 +555,156 @@ packages: '@emotion/unitless@0.7.5': resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -761,8 +961,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -770,6 +970,10 @@ packages: '@kamilkisiela/fast-url-parser@1.1.4': resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==} + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + '@next/env@14.2.3': resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} @@ -857,6 +1061,36 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rc-component/async-validator@5.0.4': resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} engines: {node: '>=14.x'} @@ -905,15 +1139,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/trigger@2.1.1': - resolution: {integrity: sha512-UjHkedkgtEcgQu87w1VuWug1idoDJV7VUt0swxHXRcmei2uu1AuUzGBPEUlmOmXGJ+YtTgZfVLi7kuAUKoZTMA==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - '@rc-component/trigger@2.2.3': - resolution: {integrity: sha512-X1oFIpKoXAMXNDYCviOmTfuNuYxE4h5laBsyCqVAVMjNHxoF3/uiyA7XdegK1XbCvBbCZ6P6byWrEoDRpKL8+A==} + '@rc-component/trigger@2.2.6': + resolution: {integrity: sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -922,6 +1149,101 @@ packages: '@repeaterjs/repeater@3.0.5': resolution: {integrity: sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==} + '@rollup/rollup-android-arm-eabi@4.34.4': + resolution: {integrity: sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.4': + resolution: {integrity: sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.4': + resolution: {integrity: sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.4': + resolution: {integrity: sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.4': + resolution: {integrity: sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.4': + resolution: {integrity: sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + resolution: {integrity: sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + resolution: {integrity: sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.4': + resolution: {integrity: sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.4': + resolution: {integrity: sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + resolution: {integrity: sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + resolution: {integrity: sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + resolution: {integrity: sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.4': + resolution: {integrity: sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.4': + resolution: {integrity: sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.4': + resolution: {integrity: sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.4': + resolution: {integrity: sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.4': + resolution: {integrity: sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.4': + resolution: {integrity: sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==} + cpu: [x64] + os: [win32] + '@rushstack/eslint-patch@1.10.2': resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} @@ -931,6 +1253,57 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@tanstack/query-core@5.66.0': + resolution: {integrity: sha512-J+JeBtthiKxrpzUu7rfIPDzhscXF2p5zE/hVdrqkACBP8Yu0M96mwJ5m/8cPPYQE9aRNvXztXHlNwIh4FEeMZw==} + + '@tanstack/query-devtools@5.65.0': + resolution: {integrity: sha512-g5y7zc07U9D3esMdqUfTEVu9kMHoIaVBsD0+M3LPdAdD710RpTcLiNvJY1JkYXqkq9+NV+CQoemVNpQPBXVsJg==} + + '@tanstack/react-query-devtools@5.66.0': + resolution: {integrity: sha512-uB57wA2YZaQ2fPcFW0E9O1zAGDGSbRKRx84uMk/86VyU9jWVxvJ3Uzp+zNm+nZJYsuekCIo2opTdgNuvM3cKgA==} + peerDependencies: + '@tanstack/react-query': ^5.66.0 + react: ^18 || ^19 + + '@tanstack/react-query@5.66.0': + resolution: {integrity: sha512-z3sYixFQJe8hndFnXgWu7C79ctL+pI0KAelYyW+khaNJ1m22lWrhJU2QrsTcRKMuVPtoZvfBYrTStIdKo+x0Xw==} + peerDependencies: + react: ^18 || ^19 + + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/react@16.2.0': + resolution: {integrity: sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -958,6 +1331,9 @@ packages: '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} @@ -1019,6 +1395,41 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + '@vitest/expect@3.0.5': + resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} + + '@vitest/mocker@3.0.5': + resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.0.5': + resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} + + '@vitest/runner@3.0.5': + resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} + + '@vitest/snapshot@3.0.5': + resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} + + '@vitest/spy@3.0.5': + resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} + + '@vitest/utils@3.0.5': + resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} + '@whatwg-node/events@0.0.3': resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} @@ -1060,6 +1471,12 @@ packages: resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} engines: {node: '>=8'} + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abort-controller-x@0.4.3: + resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1070,8 +1487,12 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} aggregate-error@3.1.0: @@ -1093,14 +1514,14 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -1108,12 +1529,20 @@ packages: ansi_up@6.0.2: resolution: {integrity: sha512-3G3vKvl1ilEp7J1u6BmULpMA0xVoW/f4Ekqhl8RTrJrhEBkonKn5k3bUc5Xt+qDayA6iDX0jyUh3AbZjB/l0tw==} - antd@5.21.3: - resolution: {integrity: sha512-Yby3gU6jfuvhNFRPsrHB4Yc/G3LHLNHHy0kShwNmmZf1QTCiW5TmqP3DT5m/NHbJsTgEwJpwo3AaOWo+KQyEjw==} + antd@5.23.1: + resolution: {integrity: sha512-rg5xd5LotHw0IRyo/nsiUN/EEV3e+xU4V4UmIb/62hMN9+3APyz1Ohjf17a+fN13jC8sNY1hP1K252SU2Th0xA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1128,9 +1557,6 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} - array-tree-filter@2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1168,6 +1594,10 @@ packages: resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} engines: {node: '>=12.0.0'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -1175,6 +1605,9 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} @@ -1217,8 +1650,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1232,6 +1665,10 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -1247,15 +1684,19 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001668: - resolution: {integrity: sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==} + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + case-anything@2.1.13: + resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} + engines: {node: '>=12.13'} + + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1270,6 +1711,14 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -1311,22 +1760,24 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1341,6 +1792,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} @@ -1363,9 +1817,6 @@ packages: typescript: optional: true - countup.js@2.8.0: - resolution: {integrity: sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==} - cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} @@ -1377,6 +1828,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cssstyle@4.2.1: + resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} + engines: {node: '>=18'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1427,6 +1882,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -1456,8 +1915,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1472,6 +1931,13 @@ packages: decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1486,6 +1952,13 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} @@ -1498,6 +1971,15 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1510,6 +1992,9 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} @@ -1520,15 +2005,18 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - dset@3.1.4: - resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + dprint-node@1.0.8: + resolution: {integrity: sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==} + + dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.757: - resolution: {integrity: sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==} + electron-to-chromium@1.5.93: + resolution: {integrity: sha512-M+29jTcfNNoR9NV7la4SwUqzWAxEwnc7ThA5e1m6LRSotmpfpCpLcIfgtSCVL+MllNLgAyM/5ru86iMRemPzDQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1540,6 +2028,10 @@ packages: resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} engines: {node: '>=10.13.0'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + env-cmd@10.1.0: resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==} engines: {node: '>=8.0.0'} @@ -1564,6 +2056,9 @@ packages: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -1579,8 +2074,13 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -1689,6 +2189,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1696,6 +2199,10 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -1776,6 +2283,10 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + framer-motion@11.1.9: resolution: {integrity: sha512-flECDIPV4QDNcOrDafVFiIazp8X01HFpzc01eDKJsdNH/wrATcYydJSH9JbPWMS8UD5lZlw+J1sK8LG2kICgqw==} peerDependencies: @@ -1790,9 +2301,18 @@ packages: react-dom: optional: true + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1803,6 +2323,11 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1855,6 +2380,9 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -1895,13 +2423,13 @@ packages: resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1921,6 +2449,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1931,18 +2462,30 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2075,6 +2618,9 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2158,6 +2704,9 @@ packages: jose@5.2.4: resolution: {integrity: sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==} + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2165,9 +2714,18 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsdom@26.0.0: + resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -2261,26 +2819,38 @@ packages: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} + long@5.2.4: + resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + lower-case-first@2.0.2: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} @@ -2303,6 +2873,14 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2325,12 +2903,26 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2338,8 +2930,8 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2370,6 +2962,12 @@ packages: sass: optional: true + nice-grpc-common@2.0.2: + resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} + + nice-grpc-web@3.3.5: + resolution: {integrity: sha512-+G+WcHUHCXZC/GcZ8OiuT7BSlvIBsujaojcemGIHClq8Dh3z31BzsC1E8bUv++WzQAHq1/8PnBySvcmF1tb90Q==} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -2385,16 +2983,28 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2491,6 +3101,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -2528,8 +3141,15 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2543,16 +3163,28 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -2570,20 +3202,20 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - rc-cascader@3.28.1: - resolution: {integrity: sha512-9+8oHIMWVLHxuaapDiqFNmD9KSyKN/P4bo9x/MBuDbyTqP8f2/POmmZxdXWBO3yq/uE3pKyQCXYNUxrNfHRv2A==} + rc-cascader@3.33.0: + resolution: {integrity: sha512-JvZrMbKBXIbEDmpIORxqvedY/bck6hGbs3hxdWT8eS9wSQ1P7//lGxbyKjOSyQiVBbgzNWriSe6HoMcZO/+0rQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-checkbox@3.3.0: - resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} + rc-checkbox@3.5.0: + resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-collapse@3.8.0: - resolution: {integrity: sha512-YVBkssrKPBG09TGfcWWGj8zJBYD9G3XuTy89t5iUmSXrIXEAnO1M+qjUxRW6b4Qi0+wNWG6MHJF/+US+nmIlzA==} + rc-collapse@3.9.0: + resolution: {integrity: sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -2600,14 +3232,14 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-dropdown@4.2.0: - resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} + rc-dropdown@4.2.1: + resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==} peerDependencies: react: '>=16.11.0' react-dom: '>=16.11.0' - rc-field-form@2.4.0: - resolution: {integrity: sha512-XZ/lF9iqf9HXApIHQHqzJK5v2w4mkUMsVqAzOyWVzoiwwXEavY6Tpuw7HavgzIoD+huVff4JghSGcgEfX6eycg==} + rc-field-form@2.7.0: + resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -2619,44 +3251,32 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-input-number@9.2.0: - resolution: {integrity: sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==} + rc-input-number@9.4.0: + resolution: {integrity: sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-input@1.6.3: - resolution: {integrity: sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==} + rc-input@1.7.2: + resolution: {integrity: sha512-g3nYONnl4edWj2FfVoxsU3Ec4XTE+Hb39Kfh2MFxMZjp/0gGyPUgy/v7ZhS27ZxUFNkuIDYXm9PJsLyJbtg86A==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - rc-mentions@2.16.1: - resolution: {integrity: sha512-GnhSTGP9Mtv6pqFFGQze44LlrtWOjHNrUUAcsdo9DnNAhN4pwVPEWy4z+2jpjkiGlJ3VoXdvMHcNDQdfI9fEaw==} + rc-mentions@2.19.1: + resolution: {integrity: sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-menu@9.13.0: - resolution: {integrity: sha512-1l8ooCB3HcYJKCltC/s7OxRKRjgymdl9htrCeGZcXNaMct0RxZRK6OPV3lPhVksIvAGMgzPd54ClpZ5J4b8cZA==} + rc-menu@9.16.0: + resolution: {integrity: sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-menu@9.15.1: - resolution: {integrity: sha512-UKporqU6LPfHnpPmtP6hdEK4iO5Q+b7BRv/uRpxdIyDGplZy9jwUjsnpev5bs3PQKB0H0n34WAPDfjAfn3kAPA==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-motion@2.9.0: - resolution: {integrity: sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-motion@2.9.3: - resolution: {integrity: sha512-rkW47ABVkic7WEB0EKJqzySpvDqwl60/tdkY7hWP7dYnh5pm0SzJpo54oW3TDUGXV5wfxXFmMkxrzRRbotQ0+w==} + rc-motion@2.9.5: + resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -2674,14 +3294,14 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-pagination@4.3.0: - resolution: {integrity: sha512-UubEWA0ShnroQ1tDa291Fzw6kj0iOeF26IsUObxYTpimgj4/qPCWVFl18RLZE+0Up1IZg0IK4pMn6nB3mjvB7g==} + rc-pagination@5.0.0: + resolution: {integrity: sha512-QjrPvbAQwps93iluvFM62AEYglGYhWW2q/nliQqmvkTi4PXP4HHoh00iC1Sa5LLVmtWQHmG73fBi2x6H6vFHRg==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-picker@4.6.15: - resolution: {integrity: sha512-OWZ1yrMie+KN2uEUfYCfS4b2Vu6RC1FWwNI0s+qypsc3wRt7g+peuZKVIzXCTaJwyyZruo80+akPg2+GmyiJjw==} + rc-picker@4.9.2: + resolution: {integrity: sha512-SLW4PRudODOomipKI0dvykxW4P8LOqtMr17MOaLU6NQJhkh9SZeh44a/8BMxwv5T6e3kiIeYc9k5jFg2Mv35Pg==} engines: {node: '>=8.x'} peerDependencies: date-fns: '>= 2.x' @@ -2713,27 +3333,27 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-resize-observer@1.4.0: - resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} + rc-resize-observer@1.4.3: + resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-segmented@2.5.0: - resolution: {integrity: sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==} + rc-segmented@2.7.0: + resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' - rc-select@14.15.2: - resolution: {integrity: sha512-oNoXlaFmpqXYcQDzcPVLrEqS2J9c+/+oJuGrlXeVVX/gVgrbHa5YcyiRUXRydFjyuA7GP3elRuLF7Y3Tfwltlw==} + rc-select@14.16.5: + resolution: {integrity: sha512-cRls713egTcitJ7WUXhHEf22h3U1OMC8nbw9+HN4Fniew8Xo3avgEDvIeGRwhbiyPNbQR23AwP+tt6KWUcB4IA==} engines: {node: '>=8.x'} peerDependencies: react: '*' react-dom: '*' - rc-slider@11.1.7: - resolution: {integrity: sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==} + rc-slider@11.1.8: + resolution: {integrity: sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -2752,40 +3372,40 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-table@7.47.5: - resolution: {integrity: sha512-fzq+V9j/atbPIcvs3emuclaEoXulwQpIiJA6/7ey52j8+9cJ4P8DGmp4YzfUVDrb3qhgedcVeD6eRgUrokwVEQ==} + rc-table@7.50.2: + resolution: {integrity: sha512-+nJbzxzstBriLb5sr9U7Vjs7+4dO8cWlouQbMwBVYghk2vr508bBdkHJeP/z9HVjAIKmAgMQKxmtbgDd3gc5wA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tabs@15.3.0: - resolution: {integrity: sha512-lzE18r+zppT/jZWOAWS6ntdkDUKHOLJzqMi5UAij1LeKwOaQaupupAoI9Srn73GRzVpmGznkECMRrzkRusC40A==} + rc-tabs@15.5.0: + resolution: {integrity: sha512-NrDcTaUJLh9UuDdMBkjKTn97U9iXG44s9D03V5NHkhEDWO5/nC6PwC3RhkCWFMKB9hh+ryqgZ+TIr1b9Jd/hnQ==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-textarea@1.8.2: - resolution: {integrity: sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==} + rc-textarea@1.9.0: + resolution: {integrity: sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tooltip@6.2.1: - resolution: {integrity: sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==} + rc-tooltip@6.3.2: + resolution: {integrity: sha512-oA4HZIiZJbUQ5ojigM0y4XtWxaH/aQlJSzknjICRWNpqyemy1sL3X3iEQV2eSPBWEq+bqU3+aSs81z+28j9luA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-tree-select@5.23.0: - resolution: {integrity: sha512-aQGi2tFSRw1WbXv0UVXPzHm09E0cSvUVZMLxQtMv3rnZZpNmdRXWrnd9QkLNlVH31F+X5rgghmdSFF3yZW0N9A==} + rc-tree-select@5.27.0: + resolution: {integrity: sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==} peerDependencies: react: '*' react-dom: '*' - rc-tree@5.9.0: - resolution: {integrity: sha512-CPrgOvm9d/9E+izTONKSngNzQdIEjMox2PBufWjS1wf7vxtvmCWzK1SlpHbRY6IaBfJIeZ+88RkcIevf729cRg==} + rc-tree@5.13.0: + resolution: {integrity: sha512-2+lFvoVRnvHQ1trlpXMOWtF8BUgF+3TiipG72uOfhpL5CUdXCk931kvDdUkTL/IZVtNEDQKwEEmJbAYJSA5NnA==} engines: {node: '>=10.x'} peerDependencies: react: '*' @@ -2797,37 +3417,19 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-util@5.39.3: - resolution: {integrity: sha512-j9wOELkLQ8gC/NkUg3qg9mHZcJf+5mYYv40JrDHqnaf8VSycji4pCf7kJ5fdTXQPDIF0vr5zpb/T2HdrMs9rWA==} + rc-util@5.44.3: + resolution: {integrity: sha512-q6KCcOFk3rv/zD3MckhJteZxb0VjAIFuf622B7ElK4vfrZdAzs16XR5p3VTdy3+U5jfJU5ACz4QnhLSuAGe5dA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-util@5.43.0: - resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - rc-virtual-list@3.11.5: - resolution: {integrity: sha512-iZRW99m5jAxtwKNPLwUrPryurcnKpXBdTyhuBp6ythf7kg/otKO5cCiIvL55GQwU0QGSlouQS0tnkciRMJUwRQ==} + rc-virtual-list@3.17.0: + resolution: {integrity: sha512-h0jPHWt8/Ots9eiGVSGQTxwrSuQ3kxqL/ERKubv8zzIMICGQaDDWm/JoUa31MdQUC7PKDMiy5KDLkNfHcWo+iQ==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - rc-virtual-list@3.14.8: - resolution: {integrity: sha512-8D0KfzpRYi6YZvlOWIxiOm9BGt4Wf2hQyEaM6RXlDDiY2NhLheuYI+RA+7ZaZj1lq+XQqy3KHlaeeXQfzI5fGg==} - engines: {node: '>=8.x'} - peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' - - react-countup@6.5.3: - resolution: {integrity: sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==} - peerDependencies: - react: '>= 16.3.0' - react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -2836,9 +3438,16 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react-smooth@4.0.1: resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} peerDependencies: @@ -2952,6 +3561,14 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@4.34.4: + resolution: {integrity: sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -2976,6 +3593,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -2989,8 +3610,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -3026,6 +3647,9 @@ packages: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3051,13 +3675,19 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} sponge-case@1.0.1: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -3123,20 +3753,13 @@ packages: babel-plugin-macros: optional: true - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - - stylis@4.3.4: - resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} + stylis@4.3.5: + resolution: {integrity: sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==} superjson@2.2.1: resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} engines: {node: '>=16'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3152,10 +3775,17 @@ packages: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3169,17 +3799,38 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + title-case@3.0.3: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + tldts-core@6.1.76: + resolution: {integrity: sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==} + + tldts@6.1.76: + resolution: {integrity: sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==} + hasBin: true + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3187,15 +3838,26 @@ packages: toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + tough-cookie@5.1.0: + resolution: {integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' + ts-error@1.0.6: + resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + ts-invariant@0.10.3: resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} engines: {node: '>=8'} @@ -3203,6 +3865,26 @@ packages: ts-log@2.2.5: resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} + ts-poet@6.9.0: + resolution: {integrity: sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ==} + + ts-proto-descriptors@2.0.0: + resolution: {integrity: sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==} + + ts-proto@2.6.1: + resolution: {integrity: sha512-4LTT99MkwkF1+fIA0b2mZu/58Qlpq3Q1g53TwEMZZgR1w/uX00PoVT4Z8aKJxMw0LeKQD4s9NrJYsF27Clckrg==} + hasBin: true + + tsconfck@3.1.5: + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -3259,8 +3941,8 @@ packages: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} - update-browserslist-db@1.0.15: - resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3294,6 +3976,91 @@ packages: victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + vite-node@3.0.5: + resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@6.1.0: + resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@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.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.0.5: + resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.5 + '@vitest/ui': 3.0.5 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -3307,6 +4074,22 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.1.0: + resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -3333,6 +4116,14 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3364,6 +4155,13 @@ packages: utf-8-validate: optional: true + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -3421,75 +4219,49 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@ant-design/colors@7.0.2': - dependencies: - '@ctrl/tinycolor': 3.6.1 - - '@ant-design/colors@7.1.0': - dependencies: - '@ctrl/tinycolor': 3.6.1 - - '@ant-design/cssinjs-utils@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/colors@7.2.0': dependencies: - '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@babel/runtime': 7.25.7 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@ant-design/fast-color': 2.0.6 - '@ant-design/cssinjs@1.20.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/cssinjs-utils@1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 - '@emotion/hash': 0.8.0 - '@emotion/unitless': 0.7.5 - classnames: 2.5.1 - csstype: 3.1.3 - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs': 1.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - stylis: 4.3.2 - '@ant-design/cssinjs@1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/cssinjs@1.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 csstype: 3.1.3 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - stylis: 4.3.4 + stylis: 4.3.5 '@ant-design/fast-color@2.0.6': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons@5.3.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@ant-design/icons@5.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@ant-design/colors': 7.0.2 + '@ant-design/colors': 7.2.0 '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@ant-design/icons@5.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@ant-design/colors': 7.1.0 - '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.25.7 - classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@ant-design/react-slick@1.1.2(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 json2mq: 0.2.0 react: 18.3.1 @@ -3527,22 +4299,22 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@apollo/experimental-nextjs-app-support@0.10.0(@apollo/client@3.10.2(@types/react@18.3.1)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@apollo/experimental-nextjs-app-support@0.10.0(@apollo/client@3.10.2(@types/react@18.3.1)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(next@14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@apollo/client': 3.10.2(@types/react@18.3.1)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@apollo/client-react-streaming': 0.10.0(@apollo/client@3.10.2(@types/react@18.3.1)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) - next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 '@ardatan/relay-compiler@12.0.0(graphql@16.8.1)': dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/runtime': 7.24.5 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - babel-preset-fbjs: 3.4.0(@babel/core@7.24.5) + '@babel/core': 7.26.7 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.7 + '@babel/runtime': 7.26.0 + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + babel-preset-fbjs: 3.4.0(@babel/core@7.26.7) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5 @@ -3564,61 +4336,71 @@ snapshots: transitivePeerDependencies: - encoding - '@babel/code-frame@7.24.2': + '@asamuzakjp/css-color@2.8.3': + dependencies: + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + lru-cache: 10.4.3 + + '@babel/code-frame@7.26.2': dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.0 + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/compat-data@7.24.4': {} + '@babel/compat-data@7.26.5': {} - '@babel/core@7.24.5': + '@babel/core@7.26.7': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.5': + '@babel/generator@7.26.5': dependencies: - '@babel/types': 7.24.5 + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.26.7 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.26.5': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': + '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.26.7 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.7) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.24.5 semver: 6.3.1 @@ -3627,281 +4409,371 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.24.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 '@babel/helper-member-expression-to-functions@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.26.7 - '@babel/helper-module-imports@7.24.3': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.7 + transitivePeerDependencies: + - supports-color '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.26.7 - '@babel/helper-plugin-utils@7.24.5': {} + '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': + '@babel/helper-replace-supers@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.26.7 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-simple-access@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.26.7 '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.26.7 '@babel/helper-split-export-declaration@7.24.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.26.7 - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.24.5': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.25.9': {} - '@babel/helpers@7.24.5': + '@babel/helpers@7.26.7': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 - '@babel/highlight@7.24.5': + '@babel/parser@7.26.7': dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 + '@babel/types': 7.26.7 - '@babel/parser@7.24.5': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.7)': dependencies: - '@babel/types': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.7) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.5)': + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/compat-data': 7.26.5 + '@babel/core': 7.26.7 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.26.7) - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.5)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.7)': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': + '@babel/plugin-syntax-flow@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': + '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-classes@7.24.5(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.26.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.7) '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.25.9 - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.26.7) - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/core': 7.26.7 + '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-literals@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-simple-access': 7.24.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.7) - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.26.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.26.7) + '@babel/types': 7.26.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.26.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/runtime@7.24.5': + '@babel/plugin-transform-spread@7.24.1(@babel/core@7.26.7)': dependencies: - regenerator-runtime: 0.14.1 + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/runtime@7.25.7': + '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.0': + '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 - '@babel/traverse@7.24.5': + '@babel/traverse@7.26.7': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.5': + '@babel/types@7.26.7': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bufbuild/protobuf@2.2.3': {} - '@ctrl/tinycolor@3.6.1': {} + '@csstools/color-helpers@5.0.1': {} + + '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/color-helpers': 5.0.1 + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-tokenizer@3.0.3': {} '@emotion/hash@0.8.0': {} '@emotion/unitless@0.7.5': {} + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 @@ -3912,7 +4784,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -3933,9 +4805,9 @@ snapshots: '@graphql-codegen/cli@5.0.2(@types/node@20.12.8)(graphql@16.8.1)(typescript@5.4.5)': dependencies: - '@babel/generator': 7.24.5 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/generator': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.7 '@graphql-codegen/client-preset': 4.2.5(graphql@16.8.1) '@graphql-codegen/core': 4.0.2(graphql@16.8.1) '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) @@ -3981,8 +4853,8 @@ snapshots: '@graphql-codegen/client-preset@4.2.5(graphql@16.8.1)': dependencies: - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.25.9 '@graphql-codegen/add': 5.0.2(graphql@16.8.1) '@graphql-codegen/gql-tag-operations': 4.0.6(graphql@16.8.1) '@graphql-codegen/plugin-helpers': 5.0.3(graphql@16.8.1) @@ -4219,11 +5091,11 @@ snapshots: '@graphql-tools/graphql-tag-pluck@8.3.0(graphql@16.8.1)': dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.26.7 + '@babel/parser': 7.26.7 + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.26.7) + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 '@graphql-tools/utils': 10.2.0(graphql@16.8.1) graphql: 16.8.1 tslib: 2.6.2 @@ -4271,12 +5143,12 @@ snapshots: '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.9.17 chalk: 4.1.2 - debug: 4.3.4 + debug: 4.4.0 dotenv: 16.4.5 graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.6 jose: 5.2.4 js-yaml: 4.1.0 lodash: 4.17.21 @@ -4334,7 +5206,7 @@ snapshots: dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) cross-inspect: 1.0.0 - dset: 3.1.4 + dset: 3.1.3 graphql: 16.8.1 tslib: 2.6.2 @@ -4354,7 +5226,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4375,22 +5247,37 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@kamilkisiela/fast-url-parser@1.1.4': {} + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + '@next/env@14.2.3': {} '@next/eslint-plugin-next@14.2.3': @@ -4457,96 +5344,224 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@rc-component/async-validator@5.0.4': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/color-picker@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@ant-design/fast-color': 2.0.6 - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.7 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@rc-component/mini-decimal@1.1.0': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@rc-component/tour@1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/trigger@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@rc-component/trigger@2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rc-component/trigger@2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@repeaterjs/repeater@3.0.5': {} + + '@rollup/rollup-android-arm-eabi@4.34.4': + optional: true + + '@rollup/rollup-android-arm64@4.34.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.4': + optional: true + + '@rollup/rollup-darwin-x64@4.34.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.4': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.4': + optional: true + + '@rushstack/eslint-patch@1.10.2': {} + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.5': dependencies: - '@babel/runtime': 7.25.7 - '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@swc/counter': 0.1.3 + tslib: 2.6.2 + + '@tanstack/query-core@5.66.0': {} + + '@tanstack/query-devtools@5.65.0': {} + + '@tanstack/react-query-devtools@5.66.0(@tanstack/react-query@5.66.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/query-devtools': 5.65.0 + '@tanstack/react-query': 5.66.0(react@18.3.1) + react: 18.3.1 + + '@tanstack/react-query@5.66.0(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.66.0 + react: 18.3.1 + + '@testing-library/dom@10.4.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 - '@repeaterjs/repeater@3.0.5': {} + '@types/aria-query@5.0.4': {} - '@rushstack/eslint-patch@1.10.2': {} + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.7 - '@swc/counter@0.1.3': {} + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.7 + '@babel/types': 7.26.7 - '@swc/helpers@0.5.5': + '@types/babel__traverse@7.20.6': dependencies: - '@swc/counter': 0.1.3 - tslib: 2.6.2 + '@babel/types': 7.26.7 '@types/d3-array@3.2.1': {} @@ -4572,6 +5587,8 @@ snapshots: '@types/d3-timer@3.0.2': {} + '@types/estree@1.0.6': {} + '@types/js-yaml@4.0.9': {} '@types/json5@0.0.29': {} @@ -4605,7 +5622,7 @@ snapshots: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4 + debug: 4.4.0 eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 @@ -4623,11 +5640,11 @@ snapshots: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.6.0 + semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 @@ -4641,6 +5658,57 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@vitejs/plugin-react@4.3.4(vite@6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2))': + dependencies: + '@babel/core': 7.26.7 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.7) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.0.5': + dependencies: + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 + chai: 5.1.2 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2))': + dependencies: + '@vitest/spy': 3.0.5 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2) + + '@vitest/pretty-format@3.0.5': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.0.5': + dependencies: + '@vitest/utils': 3.0.5 + pathe: 2.0.2 + + '@vitest/snapshot@3.0.5': + dependencies: + '@vitest/pretty-format': 3.0.5 + magic-string: 0.30.17 + pathe: 2.0.2 + + '@vitest/spy@3.0.5': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@3.0.5': + dependencies: + '@vitest/pretty-format': 3.0.5 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + '@whatwg-node/events@0.0.3': {} '@whatwg-node/events@0.1.1': {} @@ -4694,18 +5762,24 @@ snapshots: dependencies: tslib: 2.6.2 + abbrev@1.1.1: {} + + abort-controller-x@0.4.3: {} + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 acorn@8.11.3: {} - agent-base@7.1.1: + agent-base@6.0.2: dependencies: - debug: 4.3.4 + debug: 4.4.0 transitivePeerDependencies: - supports-color + agent-base@7.1.3: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -4726,67 +5800,65 @@ snapshots: ansi-regex@6.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} ansi_up@6.0.2: {} - antd@5.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + antd@5.23.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/cssinjs-utils': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@ant-design/icons': 5.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/colors': 7.2.0 + '@ant-design/cssinjs': 1.22.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@ant-design/fast-color': 2.0.6 + '@ant-design/icons': 5.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@ant-design/react-slick': 1.1.2(react@18.3.1) - '@babel/runtime': 7.25.7 - '@ctrl/tinycolor': 3.6.1 + '@babel/runtime': 7.26.0 '@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@rc-component/tour': 1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.11 - rc-cascader: 3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-checkbox: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-collapse: 3.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-cascader: 3.33.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-checkbox: 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-collapse: 3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-drawer: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-field-form: 2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-field-form: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-image: 7.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-input-number: 9.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-mentions: 2.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input-number: 9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-mentions: 2.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-notification: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-pagination: 4.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-picker: 4.6.15(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-pagination: 5.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-picker: 4.9.2(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-progress: 4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-rate: 2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-segmented: 2.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-slider: 11.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-segmented: 2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.16.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-slider: 11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-steps: 6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-switch: 4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-table: 7.47.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tabs: 15.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tooltip: 6.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree-select: 5.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-table: 7.50.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tabs: 15.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tooltip: 6.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree-select: 5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-upload: 4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 @@ -4796,6 +5868,13 @@ snapshots: - luxon - moment + aproba@2.0.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + argparse@2.0.1: {} aria-query@5.3.0: @@ -4816,8 +5895,6 @@ snapshots: get-intrinsic: 1.2.4 is-string: 1.0.7 - array-tree-filter@2.1.0: {} - array-union@2.1.0: {} array.prototype.findlast@1.2.5: @@ -4886,10 +5963,14 @@ snapshots: pvutils: 1.1.3 tslib: 2.6.2 + assertion-error@2.0.1: {} + ast-types-flow@0.0.8: {} astral-regex@2.0.0: {} + asynckit@0.4.0: {} + auto-bind@4.0.0: {} available-typed-arrays@1.0.7: @@ -4904,36 +5985,38 @@ snapshots: babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} - babel-preset-fbjs@3.4.0(@babel/core@7.24.5): - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) + babel-preset-fbjs@3.4.0(@babel/core@7.26.7): + dependencies: + '@babel/core': 7.26.7 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.7) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.7) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.26.7) + '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.26.7) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.26.7) + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.26.7) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.26.7) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.26.7) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.26.7) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + transitivePeerDependencies: + - supports-color balanced-match@1.0.2: {} @@ -4958,12 +6041,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.0: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001668 - electron-to-chromium: 1.4.757 - node-releases: 2.0.14 - update-browserslist-db: 1.0.15(browserslist@4.23.0) + caniuse-lite: 1.0.30001697 + electron-to-chromium: 1.5.93 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) bser@2.1.1: dependencies: @@ -4978,6 +6061,8 @@ snapshots: dependencies: streamsearch: 1.1.0 + cac@6.7.14: {} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -4995,7 +6080,7 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001668: {} + caniuse-lite@1.0.30001697: {} capital-case@1.0.4: dependencies: @@ -5003,11 +6088,15 @@ snapshots: tslib: 2.6.2 upper-case-first: 2.0.2 - chalk@2.4.2: + case-anything@2.1.13: {} + + chai@5.1.2: dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 chalk@4.1.2: dependencies: @@ -5044,6 +6133,10 @@ snapshots: chardet@0.7.0: {} + check-error@2.1.1: {} + + chownr@2.0.0: {} + classnames@2.5.1: {} clean-stack@2.2.0: {} @@ -5079,20 +6172,20 @@ snapshots: clsx@2.1.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} + color-support@1.1.3: {} + colorette@2.0.20: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + commander@4.1.1: {} common-tags@1.8.2: {} @@ -5101,6 +6194,8 @@ snapshots: concat-map@0.0.1: {} + console-control-strings@1.1.0: {} + constant-case@3.0.4: dependencies: no-case: 3.0.4 @@ -5126,8 +6221,6 @@ snapshots: optionalDependencies: typescript: 5.4.5 - countup.js@2.8.0: {} - cross-fetch@3.1.8: dependencies: node-fetch: 2.7.0 @@ -5144,6 +6237,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cssstyle@4.2.1: + dependencies: + '@asamuzakjp/css-color': 2.8.3 + rrweb-cssom: 0.8.0 + csstype@3.1.3: {} d3-array@3.2.4: @@ -5186,6 +6284,11 @@ snapshots: damerau-levenshtein@1.0.8: {} + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.1.0 + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -5214,14 +6317,18 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4: + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 decamelize@1.2.0: {} decimal.js-light@2.5.1: {} + decimal.js@10.5.0: {} + + deep-eql@5.0.2: {} + deep-is@0.1.4: {} defaults@1.0.4: @@ -5240,12 +6347,20 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + delayed-stream@1.0.0: {} + + delegates@1.0.0: {} + dependency-graph@0.11.0: {} dequal@2.0.3: {} detect-indent@6.1.0: {} + detect-libc@1.0.3: {} + + detect-libc@2.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -5258,9 +6373,11 @@ snapshots: dependencies: esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} + dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 csstype: 3.1.3 dot-case@3.0.4: @@ -5270,11 +6387,15 @@ snapshots: dotenv@16.4.5: {} - dset@3.1.4: {} + dprint-node@1.0.8: + dependencies: + detect-libc: 1.0.3 + + dset@3.1.3: {} eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.757: {} + electron-to-chromium@1.5.93: {} emoji-regex@8.0.0: {} @@ -5285,6 +6406,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + entities@4.5.0: {} + env-cmd@10.1.0: dependencies: commander: 4.1.1 @@ -5366,6 +6489,8 @@ snapshots: iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 + es-module-lexer@1.6.0: {} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -5386,7 +6511,35 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - escalade@3.1.2: {} + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -5400,7 +6553,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -5420,11 +6573,11 @@ snapshots: eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0): dependencies: - debug: 4.3.4 + debug: 4.4.0 enhanced-resolve: 5.16.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -5435,7 +6588,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -5446,7 +6599,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -5456,7 +6609,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -5475,7 +6628,7 @@ snapshots: eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 aria-query: 5.3.0 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 @@ -5539,7 +6692,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -5585,10 +6738,16 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + esutils@2.0.3: {} eventemitter3@4.0.7: {} + expect-type@1.1.0: {} + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -5684,6 +6843,12 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + framer-motion@11.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.6.2 @@ -5691,8 +6856,15 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs.realpath@1.0.0: {} + fsevents@2.3.3: + optional: true + function-bind@1.1.2: {} function.prototype.name@1.1.6: @@ -5704,6 +6876,18 @@ snapshots: functions-have-names@1.2.3: {} + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -5771,6 +6955,8 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globrex@0.1.2: {} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -5819,9 +7005,14 @@ snapshots: graphql@16.8.1: {} - has-bigints@1.0.2: {} + grpc-tools@1.12.4: + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + transitivePeerDependencies: + - encoding + - supports-color - has-flag@3.0.0: {} + has-bigints@1.0.2: {} has-flag@4.0.0: {} @@ -5837,6 +7028,8 @@ snapshots: dependencies: has-symbols: 1.0.3 + has-unicode@2.0.1: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -5850,17 +7043,28 @@ snapshots: dependencies: react-is: 16.13.1 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 - debug: 4.3.4 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.4: + https-proxy-agent@5.0.1: dependencies: - agent-base: 7.1.1 - debug: 4.3.4 + agent-base: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5868,6 +7072,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.1: {} @@ -5995,6 +7203,8 @@ snapshots: is-path-inside@3.0.3: {} + is-potential-custom-element-name@1.0.1: {} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -6073,13 +7283,43 @@ snapshots: jose@5.2.4: {} + js-base64@3.7.7: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} + jsdom@26.0.0: + dependencies: + cssstyle: 4.2.1 + data-urls: 5.0.0 + decimal.js: 10.5.0 + form-data: 4.0.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.16 + parse5: 7.2.1 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.1.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -6171,10 +7411,14 @@ snapshots: slice-ansi: 4.0.0 wrap-ansi: 6.2.0 + long@5.2.4: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + loupe@3.1.3: {} + lower-case-first@2.0.2: dependencies: tslib: 2.6.2 @@ -6183,15 +7427,21 @@ snapshots: dependencies: tslib: 2.6.2 - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: + lz-string@1.5.0: {} + + magic-string@0.30.17: dependencies: - yallist: 4.0.0 + '@jridgewell/sourcemap-codec': 1.5.0 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 map-cache@0.2.2: {} @@ -6206,6 +7456,12 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mimic-fn@2.1.0: {} minimatch@3.1.2: @@ -6226,34 +7482,45 @@ snapshots: minimist@1.2.8: {} + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + minipass@7.0.4: {} - ms@2.1.2: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} ms@2.1.3: {} mute-stream@0.0.8: {} - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} - next-runtime-env@3.2.2(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-runtime-env@3.2.2(next@14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: - next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.3(@babel/core@7.26.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.3 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001668 + caniuse-lite: 1.0.30001697 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.7)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.3 '@next/swc-darwin-x64': 14.2.3 @@ -6268,6 +7535,19 @@ snapshots: - '@babel/core' - babel-plugin-macros + nice-grpc-common@2.0.2: + dependencies: + ts-error: 1.0.6 + + nice-grpc-web@3.3.5(ws@8.18.0): + dependencies: + abort-controller-x: 0.4.3 + isomorphic-ws: 5.0.0(ws@8.18.0) + js-base64: 3.7.7 + nice-grpc-common: 2.0.2 + transitivePeerDependencies: + - ws + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -6279,14 +7559,27 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.14: {} + node-releases@2.0.19: {} + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + nullthrows@1.1.1: {} + nwsapi@2.2.16: {} + object-assign@4.1.1: {} object-inspect@1.13.1: {} @@ -6408,11 +7701,15 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse5@7.2.1: + dependencies: + entities: 4.5.0 + pascal-case@3.1.2: dependencies: no-case: 3.0.4 @@ -6439,12 +7736,16 @@ snapshots: path-scurry@1.10.2: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.0.4 path-type@4.0.0: {} - picocolors@1.0.0: {} + pathe@2.0.2: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -6452,12 +7753,24 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + promise@7.3.1: dependencies: asap: 2.0.6 @@ -6468,6 +7781,21 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.12.8 + long: 5.2.4 + punycode@1.4.1: {} punycode@2.3.1: {} @@ -6480,184 +7808,164 @@ snapshots: queue-microtask@1.2.3: {} - rc-cascader@3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-cascader@3.33.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 - array-tree-filter: 2.1.0 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.16.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-checkbox@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-checkbox@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-collapse@3.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-collapse@3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-dialog@9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-dropdown@4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-dropdown@4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-field-form@2.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-field-form@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/async-validator': 5.0.4 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-image@7.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-input-number@9.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-input-number@9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-input@1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.25.7 - classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-mentions@2.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-input@1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-textarea: 1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-menu@9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-mentions@2.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.5 - '@rc-component/trigger': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-textarea: 1.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-menu@9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-menu@9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-motion@2.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.24.5 - classnames: 2.5.1 - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-motion@2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-motion@2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-notification@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-overflow@1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-pagination@4.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-pagination@5.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-picker@4.6.15(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-picker@4.9.2(dayjs@1.11.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -6665,180 +7973,159 @@ snapshots: rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-rate@2.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-resize-observer@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-resize-observer@1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 - rc-segmented@2.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-segmented@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-select@14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-select@14.16.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc-overflow: 1.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.11.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-slider@11.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-slider@11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-table@7.47.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-table@7.50.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.14.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tabs@15.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tabs@15.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-dropdown: 4.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-menu: 9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-menu: 9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-textarea@1.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-textarea@1.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-input: 1.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-input: 1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tooltip@6.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tooltip@6.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 - '@rc-component/trigger': 2.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@babel/runtime': 7.26.0 + '@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree-select@5.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tree-select@5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-select: 14.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-tree: 5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-select: 14.16.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-tree: 5.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - rc-tree@5.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-tree@5.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-motion: 2.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-virtual-list: 3.11.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-virtual-list: 3.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rc-upload@4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-util@5.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.24.5 + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 - rc-util@5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-util@5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 - rc-virtual-list@3.11.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.25.7 - classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - rc-virtual-list@3.14.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rc-virtual-list@3.17.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rc-util: 5.44.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-countup@6.5.3(react@18.3.1): - dependencies: - countup.js: 2.8.0 - react: 18.3.1 - react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -6847,8 +8134,12 @@ snapshots: react-is@16.13.1: {} + react-is@17.0.2: {} + react-is@18.3.1: {} + react-refresh@0.14.2: {} + react-smooth@4.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: fast-equals: 5.0.1 @@ -6859,7 +8150,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -6919,7 +8210,7 @@ snapshots: relay-runtime@12.0.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.26.0 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: @@ -6970,6 +8261,33 @@ snapshots: dependencies: glob: 7.2.3 + rollup@4.34.4: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.4 + '@rollup/rollup-android-arm64': 4.34.4 + '@rollup/rollup-darwin-arm64': 4.34.4 + '@rollup/rollup-darwin-x64': 4.34.4 + '@rollup/rollup-freebsd-arm64': 4.34.4 + '@rollup/rollup-freebsd-x64': 4.34.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.4 + '@rollup/rollup-linux-arm-musleabihf': 4.34.4 + '@rollup/rollup-linux-arm64-gnu': 4.34.4 + '@rollup/rollup-linux-arm64-musl': 4.34.4 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.4 + '@rollup/rollup-linux-riscv64-gnu': 4.34.4 + '@rollup/rollup-linux-s390x-gnu': 4.34.4 + '@rollup/rollup-linux-x64-gnu': 4.34.4 + '@rollup/rollup-linux-x64-musl': 4.34.4 + '@rollup/rollup-win32-arm64-msvc': 4.34.4 + '@rollup/rollup-win32-ia32-msvc': 4.34.4 + '@rollup/rollup-win32-x64-msvc': 4.34.4 + fsevents: 2.3.3 + + rrweb-cssom@0.8.0: {} + run-async@2.4.1: {} run-parallel@1.2.0: @@ -6997,6 +8315,10 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -7009,9 +8331,7 @@ snapshots: semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.3: {} sentence-case@3.0.4: dependencies: @@ -7054,6 +8374,8 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.1 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -7079,12 +8401,16 @@ snapshots: dot-case: 3.0.4 tslib: 2.6.2 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} sponge-case@1.0.1: dependencies: tslib: 2.6.2 + stackback@0.0.2: {} + + std-env@3.8.0: {} + streamsearch@1.1.0: {} string-convert@0.2.1: {} @@ -7153,25 +8479,19 @@ snapshots: strip-json-comments@3.1.1: {} - styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.26.7)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 optionalDependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.26.7 - stylis@4.3.2: {} - - stylis@4.3.4: {} + stylis@4.3.5: {} superjson@2.2.1: dependencies: copy-anything: 3.0.5 - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -7184,8 +8504,19 @@ snapshots: symbol-observable@4.0.0: {} + symbol-tree@3.2.4: {} + tapable@2.2.1: {} + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + text-table@0.2.0: {} throttle-debounce@5.0.2: {} @@ -7194,34 +8525,77 @@ snapshots: tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinypool@1.0.2: {} + + tinyrainbow@2.0.0: {} + + tinyspy@3.0.2: {} + title-case@3.0.3: dependencies: tslib: 2.6.2 + tldts-core@6.1.76: {} + + tldts@6.1.76: + dependencies: + tldts-core: 6.1.76 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toggle-selection@1.0.6: {} + tough-cookie@5.1.0: + dependencies: + tldts: 6.1.76 + tr46@0.0.3: {} + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: typescript: 5.4.5 + ts-error@1.0.6: {} + ts-invariant@0.10.3: dependencies: tslib: 2.6.2 ts-log@2.2.5: {} + ts-poet@6.9.0: + dependencies: + dprint-node: 1.0.8 + + ts-proto-descriptors@2.0.0: + dependencies: + '@bufbuild/protobuf': 2.2.3 + + ts-proto@2.6.1: + dependencies: + '@bufbuild/protobuf': 2.2.3 + case-anything: 2.1.13 + ts-poet: 6.9.0 + ts-proto-descriptors: 2.0.0 + + tsconfck@3.1.5(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -7290,11 +8664,11 @@ snapshots: dependencies: normalize-path: 2.1.1 - update-browserslist-db@1.0.15(browserslist@4.23.0): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 upper-case-first@2.0.2: dependencies: @@ -7335,6 +8709,92 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 + vite-node@3.0.5(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.2 + vite: 6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-tsconfig-paths@5.1.4(typescript@5.4.5)(vite@6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.4.5) + optionalDependencies: + vite: 6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite@6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.34.4 + optionalDependencies: + '@types/node': 20.12.8 + fsevents: 2.3.3 + jiti: 1.21.0 + yaml: 2.4.2 + + vitest@3.0.5(@types/node@20.12.8)(jiti@1.21.0)(jsdom@26.0.0)(yaml@2.4.2): + dependencies: + '@vitest/expect': 3.0.5 + '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2)) + '@vitest/pretty-format': 3.0.5 + '@vitest/runner': 3.0.5 + '@vitest/snapshot': 3.0.5 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 2.0.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.1.0(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2) + vite-node: 3.0.5(@types/node@20.12.8)(jiti@1.21.0)(yaml@2.4.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.12.8 + jsdom: 26.0.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -7351,6 +8811,19 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.1.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -7400,6 +8873,15 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + word-wrap@1.2.5: {} wrap-ansi@6.2.0: @@ -7424,6 +8906,10 @@ snapshots: ws@8.18.0: {} + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@4.0.3: {} y18n@5.0.8: {} @@ -7460,7 +8946,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/frontend/scripts/grpc-client-gen.sh b/frontend/scripts/grpc-client-gen.sh new file mode 100755 index 00000000..1262adca --- /dev/null +++ b/frontend/scripts/grpc-client-gen.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -eu + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" +ROOT_DIR="$(realpath "$SCRIPT_DIR/../..")" +FRONTEND_DIR="${ROOT_DIR}/frontend" +PROTO_DIR="${ROOT_DIR}/frontend/src/proto/" +TS_PROTO_OPT="env=browser,outputServices=nice-grpc,outputServices=generic-definitions,useExactTypes=false,forceLong=string" + +rm -rf ${FRONTEND_DIR}/src/lib/grpc-client/* + +generate_grpc_client() { + local proto_file=$1 + ${FRONTEND_DIR}/node_modules/.bin/grpc_tools_node_protoc \ + --plugin=protoc-gen-ts_proto="${FRONTEND_DIR}/node_modules/.bin/protoc-gen-ts_proto" \ + --ts_proto_out=${FRONTEND_DIR}/src/lib/grpc-client/ \ + --ts_proto_opt=${TS_PROTO_OPT} \ + --proto_path=${PROTO_DIR}/ \ + ${proto_file} +} + +generate_grpc_client "${PROTO_DIR}/buildbarn/buildqueuestate/buildqueuestate.proto" diff --git a/frontend/src/app/operations/[slug]/page.tsx b/frontend/src/app/operations/[slug]/page.tsx new file mode 100644 index 00000000..9f40064d --- /dev/null +++ b/frontend/src/app/operations/[slug]/page.tsx @@ -0,0 +1,35 @@ +"use client"; + +import Content from "@/components/Content"; +import OperationDetails from "@/components/OperationDetails"; +import PortalCard from "@/components/PortalCard"; +import { CodeFilled } from "@ant-design/icons"; +import { Space } from "antd"; +import type React from "react"; + +interface PageParams { + params: { + slug: string; + }; +} + +const Page: React.FC = ({ params }) => { + const label = decodeURIComponent(params.slug); + + return ( + + } + titleBits={[{`Operation ${label}`}]} + > + + + + } + /> + ); +}; + +export default Page; diff --git a/frontend/src/app/operations/page.tsx b/frontend/src/app/operations/page.tsx new file mode 100644 index 00000000..663863dd --- /dev/null +++ b/frontend/src/app/operations/page.tsx @@ -0,0 +1,26 @@ +"use client"; + +import Content from "@/components/Content"; +import OperationsGrid from "@/components/OperationsGrid"; +import PortalCard from "@/components/PortalCard"; +import useScreenSize from "@/utils/screen"; +import { CodeFilled } from "@ant-design/icons"; +import type React from "react"; + +const Page: React.FC = () => { + const screenSize = useScreenSize(); + return ( + } + titleBits={[Operations]} + > + + + } + /> + ); +}; + +export default Page; diff --git a/frontend/src/app/scheduler/page.tsx b/frontend/src/app/scheduler/page.tsx new file mode 100644 index 00000000..109b5183 --- /dev/null +++ b/frontend/src/app/scheduler/page.tsx @@ -0,0 +1,24 @@ +"use client"; + +import Content from "@/components/Content"; +import PortalCard from "@/components/PortalCard"; +import SchedulerGrid from "@/components/SchedulerGrid"; +import { CalendarFilled } from "@ant-design/icons"; +import type React from "react"; + +const Page: React.FC = () => { + return ( + } + titleBits={[Scheduler]} + > + + + } + /> + ); +}; + +export default Page; diff --git a/frontend/src/app/scheduler/workers/page.tsx b/frontend/src/app/scheduler/workers/page.tsx new file mode 100644 index 00000000..d3ab3b96 --- /dev/null +++ b/frontend/src/app/scheduler/workers/page.tsx @@ -0,0 +1,81 @@ +"use client"; + +import Content from "@/components/Content"; +import PortalAlert from "@/components/PortalAlert"; +import PortalCard from "@/components/PortalCard"; +import WorkersGrid from "@/components/WorkersGrid"; +import type { + SizeClassQueueName, + WorkerState, +} from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import type { ListWorkerFilterType } from "@/types/ListWorkerFilterType"; +import { CalendarFilled } from "@ant-design/icons"; +import { useSearchParams } from "next/navigation"; +import type React from "react"; +import { useMemo } from "react"; + +const Page: React.FC = () => { + const searchParams = useSearchParams(); + + const { listWorkerFilterType, sizeClassQueueName, paginationCursor } = + useMemo(() => { + const listWorkerFilterTypeParam = searchParams.get( + "listWorkerFilterType", + ); + const sizeClassQueueNameUrlParam = searchParams.get("sizeClassQueueName"); + const paginationCursorUrlParam = searchParams.get("paginationCursor"); + + let decodedListWorkerFilterType: ListWorkerFilterType | null = null; + let decodedSizeClassQueueName: SizeClassQueueName | undefined = undefined; + let decodedPaginationCursor: WorkerState["id"] | undefined = undefined; + + try { + if (listWorkerFilterTypeParam && sizeClassQueueNameUrlParam) { + decodedListWorkerFilterType = + listWorkerFilterTypeParam as ListWorkerFilterType; + decodedSizeClassQueueName = JSON.parse( + sizeClassQueueNameUrlParam, + ) as SizeClassQueueName; + if (paginationCursorUrlParam) { + decodedPaginationCursor = JSON.parse( + paginationCursorUrlParam, + ) as WorkerState["id"]; + } + } + } catch (error) { + console.error("Failed to decode URL parameters:", error); + } + + return { + listWorkerFilterType: decodedListWorkerFilterType, + sizeClassQueueName: decodedSizeClassQueueName, + paginationCursor: decodedPaginationCursor, + }; + }, [searchParams]); + + return ( + } + titleBits={[Workers]} + > + {!sizeClassQueueName || !listWorkerFilterType ? ( + + ) : ( + + )} +
+ } + /> + ); +}; + +export default Page; diff --git a/frontend/src/components/AppBar/index.module.css b/frontend/src/components/AppBar/index.module.css index 4c7ddced..fc4bdbe1 100644 --- a/frontend/src/components/AppBar/index.module.css +++ b/frontend/src/components/AppBar/index.module.css @@ -26,7 +26,7 @@ } .menu { - width: 400px; + width: 580px; background-color: inherit !important; } @@ -68,6 +68,6 @@ .normalWeight { font-weight: normal; - font-size-adjust: calc(.5); + font-size-adjust: calc(0.5); padding-left: 10px; -} \ No newline at end of file +} diff --git a/frontend/src/components/AppBar/index.tsx b/frontend/src/components/AppBar/index.tsx index ff960726..3899d3e8 100644 --- a/frontend/src/components/AppBar/index.tsx +++ b/frontend/src/components/AppBar/index.tsx @@ -1,17 +1,18 @@ 'use client'; -import React, { createContext, useEffect, useState } from 'react'; -import { Layout, Button, Drawer, Divider, Input } from 'antd'; -import { MenuOutlined } from '@ant-design/icons'; -import { ItemType } from 'antd/lib/menu/hooks/useItems'; -import styles from '@/components/AppBar/index.module.css'; import AppBarButtons from '@/components/AppBar/AppBarButtons'; import AppBarMenu from '@/components/AppBar/AppBarMenu'; import AppBarTitle from '@/components/AppBar/AppBarTitle'; +import styles from '@/components/AppBar/index.module.css'; +import { SIDER_BAR_MINIMUM_SCREEN_WIDTH } from '@/components/Content'; import FooterBar from '@/components/FooterBar'; import { getItem } from '@/components/Utilities/navigation'; import useScreenSize from '@/utils/screen'; -import { SIDER_BAR_MINIMUM_SCREEN_WIDTH } from '@/components/Content'; +import { MenuOutlined } from '@ant-design/icons'; +import { Button, Divider, Drawer, Input, Layout } from 'antd'; +import type { ItemType } from 'antd/lib/menu/hooks/useItems'; +import type React from 'react'; +import { createContext, useEffect, useState } from 'react'; export const SetExtraAppBarMenuItemsContext = createContext< React.Dispatch> | undefined @@ -20,9 +21,15 @@ export const SetExtraAppBarMenuItemsContext = createContext< const APP_BAR_MENU_ITEMS: ItemType[] = [ getItem({ depth: 0, href: '/builds', title: 'Builds' }), getItem({ depth: 0, href: '/bazel-invocations', title: 'Invocations' }), - getItem({ depth: 0, href: '/trends', title: "Trends" }), - getItem({ depth: 0, href: '/tests', title: "Tests" }), - getItem({ depth: 0, href: '/targets', title: "Targets" }), + getItem({ depth: 0, href: '/trends', title: 'Trends' }), + getItem({ depth: 0, href: '/tests', title: 'Tests' }), + getItem({ depth: 0, href: '/targets', title: 'Targets' }), + getItem({ + depth: 0, + href: '/scheduler', + title: 'Scheduler', + children: [getItem({ depth: 0, href: '/operations', title: 'Operations' })], + }), ]; type Props = { @@ -31,7 +38,11 @@ type Props = { extraMenuItems: ItemType[]; }; -const AppBar: React.FC = ({ toggleTheme, prefersDark, extraMenuItems }) => { +const AppBar: React.FC = ({ + toggleTheme, + prefersDark, + extraMenuItems, +}) => { const screenSize = useScreenSize(); const showSiderBar = screenSize.width > SIDER_BAR_MINIMUM_SCREEN_WIDTH; @@ -56,10 +67,17 @@ const AppBar: React.FC = ({ toggleTheme, prefersDark, extraMenuItems }) = {showSiderBar ? ( <>
- +
- +
) : ( diff --git a/frontend/src/components/OperationDetails/index.tsx b/frontend/src/components/OperationDetails/index.tsx new file mode 100644 index 00000000..4077345e --- /dev/null +++ b/frontend/src/components/OperationDetails/index.tsx @@ -0,0 +1,94 @@ +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import themeStyles from "@/theme/theme.module.css"; +import { CloseCircleOutlined, CodeOutlined } from "@ant-design/icons"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { Button, Space, Typography } from "antd"; +import { GrpcErrorCodes } from "../../utils/grpcErrorCodes"; +import ExecuteResponseDisplay from "../ExecutionResponseDisplay"; +import OperationStateDisplay from "../OperationStateDisplay"; + +interface Props { + label: string; +} + +const OperationDetails: React.FC = ({ label }) => { + const { buildQueueStateClient } = useGrpcClients(); + const queryClient = useQueryClient(); + + const killOperationMutation = useMutation({ + mutationFn: () => { + return buildQueueStateClient.killOperations({ + filter: { + operationName: label, + }, + status: { + code: GrpcErrorCodes.UNAVAILABLE, + message: "Operation was killed through the web interface", + }, + }); + }, + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: ["operationDetails", label], + exact: true, + }); + }, + }); + + const { data, isLoading, isError, error } = useQuery({ + queryKey: ["operationDetails", label], + queryFn: buildQueueStateClient.getOperation.bind(window, { + operationName: label, + }), + }); + + if (isError) { + return ( + + + + + There was an error fetching the operation details + +
{String(error)}
+
+
+ ); + } + + if (isLoading) + return ( + + + + Loading... + + + ); + + return ( + + {data?.operation && } + {data?.operation?.completed ? ( + + ) : ( + + )} + + ); +}; + +export default OperationDetails; diff --git a/frontend/src/components/OperationStateDisplay/index.tsx b/frontend/src/components/OperationStateDisplay/index.tsx new file mode 100644 index 00000000..45d1e4a6 --- /dev/null +++ b/frontend/src/components/OperationStateDisplay/index.tsx @@ -0,0 +1,104 @@ +import dayjs from "@/lib/dayjs"; +import type { OperationState } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import themeStyles from "@/theme/theme.module.css"; +import { protobufToObjectWithTypeField } from "@/utils/protobufToObject"; +import { ExclamationCircleFilled } from "@ant-design/icons"; +import { Descriptions, Space, Tag } from "antd"; +import Link from "next/link"; +import OperationStatusTag from "../OperationStatusTag"; +import { operationsStateToActionPageUrl } from "../OperationsGrid/utils"; +import PropertyTagList from "../PropertyTagList"; + +interface Props { + operation: OperationState; +} + +const OperationStateDisplay: React.FC = ({ operation }) => { + const invocationMetadata = operation.invocationName?.ids?.map((value) => { + return JSON.stringify(protobufToObjectWithTypeField(value, false)); + }); + + return ( + + + + { + operation.invocationName?.sizeClassQueueName?.platformQueueName + ?.instanceNamePrefix + } + + + {operation.instanceNameSuffix} + + + + + + {operation.invocationName?.sizeClassQueueName?.sizeClass} + + +
    + {invocationMetadata?.map((value) => ( +
  • + + {value} + +
  • + ))} +
+
+ + {operation.actionDigest && ( + {`${operation.actionDigest.hash}-${operation.actionDigest.sizeBytes}`} + )} + + + {operation.timeout && + `${dayjs(operation.timeout).diff(undefined, "seconds")}s`} + + + {operation.targetId} + + + {operation.priority} + + + {operation.expectedDuration && + `${dayjs.duration(Number.parseInt(operation.expectedDuration.seconds), "seconds").asMinutes()}m`} + + + {operation.queuedTimestamp && + `${dayjs().diff(operation.queuedTimestamp, "seconds")}s`} + + + + {operation.completed?.status?.message && ( + } + color="default" + className={themeStyles.tag} + > + <>Status message: {operation.completed?.status?.message} + + )} + +
+
+ ); +}; + +export default OperationStateDisplay; diff --git a/frontend/src/components/OperationStatusTag/index.tsx b/frontend/src/components/OperationStatusTag/index.tsx new file mode 100644 index 00000000..d65a3d15 --- /dev/null +++ b/frontend/src/components/OperationStatusTag/index.tsx @@ -0,0 +1,102 @@ +import type { OperationState } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import themeStyles from "@/theme/theme.module.css"; +import { + CheckCircleFilled, + ClockCircleFilled, + CloseCircleFilled, + ExclamationCircleFilled, + LoadingOutlined, +} from "@ant-design/icons"; +import { Tag } from "antd"; +import { GrpcErrorCodes } from "../../utils/grpcErrorCodes"; + +interface Props { + operation: OperationState; +} + +const OperationStatusTag: React.FC = ({ operation }) => { + if (operation.queued) { + return ( + } className={themeStyles.tag}> + + Queued at priority {operation.priority} + + + ); + } + + if (operation.executing) { + return ( + } className={themeStyles.tag}> + Executing + + ); + } + + if (operation.completed) { + if (operation.completed.status?.code) { + return ( + } + color="red" + className={themeStyles.tag} + > + + Failed with status code{" "} + {GrpcErrorCodes[operation.completed.status?.code]} + + + ); + } + + if (operation.completed.result) { + if (operation.completed.result.exitCode === 0) { + return ( + } + color="green" + className={themeStyles.tag} + > + + Completed with exit code 0 + + + ); + } + + return ( + } + color="yellow" + className={themeStyles.tag} + > + + Completed with exit code {operation.completed.result.exitCode} + + + ); + } + + return ( + } + color="red" + className={themeStyles.tag} + > + Action result missing + + ); + } + + return ( + } + color="red" + className={themeStyles.tag} + > + Unknown + + ); +}; + +export default OperationStatusTag; diff --git a/frontend/src/components/OperationsGrid/Columns.tsx b/frontend/src/components/OperationsGrid/Columns.tsx new file mode 100644 index 00000000..830f30d3 --- /dev/null +++ b/frontend/src/components/OperationsGrid/Columns.tsx @@ -0,0 +1,56 @@ +import dayjs from "@/lib/dayjs"; +import type { OperationState } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { type TableColumnsType, Typography } from "antd"; +import type { ColumnType } from "antd/lib/table"; +import Link from "next/link"; +import OperationStatusTag from "../OperationStatusTag"; +import { operationsStateToActionPageUrl } from "./utils"; + +const operationNameColumn: ColumnType = { + title: "Operation name", + dataIndex: "name", + render: (value: string) => {value}, +}; + +const timeoutColumn: ColumnType = { + title: "Timeout", + dataIndex: "timeout", + render: (value: Date | undefined) => ( + + {value ? `${dayjs(value).diff(undefined, "seconds")}s` : "∞"} + + ), +}; + +const actionDigestColumn: ColumnType = { + title: "Action digest", + key: "actionDigest", + render: (record: OperationState) => ( + {`${record.actionDigest?.hash}-${record.actionDigest?.sizeBytes}`} + ), +}; + +const targetIdColumn: ColumnType = { + title: "Target ID", + dataIndex: "targetId", +}; + +const statusColumn: ColumnType = { + title: "Status", + key: "status", + render: (record: OperationState) => , +}; + +const getColumns = (): TableColumnsType => { + return [ + timeoutColumn, + operationNameColumn, + actionDigestColumn, + targetIdColumn, + statusColumn, + ]; +}; + +export default getColumns; diff --git a/frontend/src/components/OperationsGrid/index.tsx b/frontend/src/components/OperationsGrid/index.tsx new file mode 100644 index 00000000..b03cc185 --- /dev/null +++ b/frontend/src/components/OperationsGrid/index.tsx @@ -0,0 +1,81 @@ +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import { RequestMetadata } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import themeStyles from "@/theme/theme.module.css"; +import useScreenSize from "@/utils/screen"; +import { CodeOutlined } from "@ant-design/icons"; +import { useQuery } from "@tanstack/react-query"; +import { Space, Table, Typography } from "antd"; +import { useSearchParams } from "next/navigation"; +import type React from "react"; +import OperationsInvocationFilter from "../OperationsInvocationFilter"; +import getColumns from "./Columns"; + +const PAGE_SIZE = 1000; + +const OperationsTable: React.FC = () => { + const screenSize = useScreenSize(); + const { buildQueueStateClient } = useGrpcClients(); + const searchParams = useSearchParams(); + const filterInvocationId = searchParams.get("filter_invocation_id"); + + const getSerializedFilterInvocationId = (searchParam: string | null) => { + if (searchParam) { + const parsedSearchParam = JSON.parse(decodeURIComponent(searchParam)); + return { + typeUrl: parsedSearchParam["@type"], + value: RequestMetadata.encode(parsedSearchParam).finish(), + }; + } + return undefined; + }; + + const { data, isLoading, isError } = useQuery({ + queryKey: ["operationsTable", filterInvocationId], + queryFn: buildQueueStateClient.listOperations.bind(window, { + pageSize: PAGE_SIZE, + filterInvocationId: getSerializedFilterInvocationId(filterInvocationId), + }), + }); + + let emptyText = "No active operations"; + if (isError) emptyText = "There was a problem fetching the operations"; + + return ( + <> + + themeStyles.compactTable} + rowKey={(item) => item.name} + locale={{ + emptyText: isLoading ? ( + + + + Loading... + + + ) : ( + + + + {emptyText} + + + ), + }} + /> + + ); +}; + +export default OperationsTable; diff --git a/frontend/src/components/OperationsGrid/utils.ts b/frontend/src/components/OperationsGrid/utils.ts new file mode 100644 index 00000000..3dcd0ce7 --- /dev/null +++ b/frontend/src/components/OperationsGrid/utils.ts @@ -0,0 +1,24 @@ +import type { OperationState } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { digestFunctionValueToString } from "@/utils/digestFunctionUtils"; + +export const operationsStateToActionPageUrl = ( + operation: OperationState, +): string | undefined => { + const instanceNamePrefix = + operation.invocationName?.sizeClassQueueName?.platformQueueName + ?.instanceNamePrefix; + const digestFunction = digestFunctionValueToString(operation.digestFunction); + const actionDigestHash = operation.actionDigest?.hash; + const actionDigestSizeBytes = operation.actionDigest?.sizeBytes; + + if ( + !instanceNamePrefix || + !digestFunction || + !actionDigestHash || + !actionDigestSizeBytes + ) { + return undefined; + } + + return `/browser/${instanceNamePrefix}/blobs/${digestFunction}/action/${actionDigestHash}-${actionDigestSizeBytes}`; +}; diff --git a/frontend/src/components/OperationsInvocationFilter/index.module.css b/frontend/src/components/OperationsInvocationFilter/index.module.css new file mode 100644 index 00000000..f9cb1af0 --- /dev/null +++ b/frontend/src/components/OperationsInvocationFilter/index.module.css @@ -0,0 +1,11 @@ +.alignLeft { + text-align: left; +} + +.alignCenter { + text-align: center; +} + +.alignRight { + text-align: right; +} diff --git a/frontend/src/components/OperationsInvocationFilter/index.tsx b/frontend/src/components/OperationsInvocationFilter/index.tsx new file mode 100644 index 00000000..432ec75d --- /dev/null +++ b/frontend/src/components/OperationsInvocationFilter/index.tsx @@ -0,0 +1,37 @@ +import { Button, Col, Divider, Row } from "antd"; +import { usePathname, useRouter } from "next/navigation"; +import styles from "./index.module.css"; + +interface Props { + filterInvocationId: string | null; +} + +const OperationsInvocationFilter: React.FC = ({ + filterInvocationId, +}) => { + const router = useRouter(); + const pathname = usePathname(); + + const handleFilterClear = () => router.replace(pathname); + + if (filterInvocationId) { + return ( + + +

Invocation ID:

+ + +
{decodeURIComponent(filterInvocationId)}
+ + + + + + + ); + } +}; + +export default OperationsInvocationFilter; diff --git a/frontend/src/components/PlatformQueuesTable/Columns.tsx b/frontend/src/components/PlatformQueuesTable/Columns.tsx new file mode 100644 index 00000000..2675fbb8 --- /dev/null +++ b/frontend/src/components/PlatformQueuesTable/Columns.tsx @@ -0,0 +1,123 @@ +import type { SizeClassQueueName } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { ListWorkerFilterType } from "@/types/ListWorkerFilterType"; +import { type TableColumnsType, Typography } from "antd"; +import type { ColumnType } from "antd/lib/table"; +import Link from "next/link"; +import PropertyTagList from "../PropertyTagList"; +import type { PlatformQueueTableState } from "./types"; + +const getWorkerPageUrlObject = ( + record: PlatformQueueTableState, + listWorkerFilterType: ListWorkerFilterType, +) => { + const sizeClassQueueName: SizeClassQueueName = { + platformQueueName: record.name, + sizeClass: record.sizeClassQueues[0].sizeClass, + }; + + return { + pathname: "/scheduler/workers", + query: { + listWorkerFilterType: listWorkerFilterType, + sizeClassQueueName: JSON.stringify(sizeClassQueueName), + }, + }; +}; + +const cellMergingLogic = (value: PlatformQueueTableState, index?: number) => { + if (value.isFirstSizeClass) { + return { rowSpan: value.numberOfSizeClasses }; + } + return { rowSpan: 0 }; +}; + +const instanceNamePrefixColumn: ColumnType = { + key: "instanceNamePrefix", + title: "Instance name prefix", + onCell: cellMergingLogic, + render: (_, record) => ( + {record.name?.instanceNamePrefix} + ), +}; + +const platformPropertiesColumn: ColumnType = { + key: "platformProperties", + title: "Platform properties", + onCell: cellMergingLogic, + render: (_, record) => ( + + ), +}; + +const sizeClassColumn: ColumnType = { + key: "sizeClass", + title: "Size class", + render: (_, record) => ( + {record.sizeClassQueues[0].sizeClass} + ), +}; + +const queuedOperationsColumn: ColumnType = { + key: "queuedOperations", + title: "Queued operations", + render: (_, record) => ( + + {record.sizeClassQueues[0].rootInvocation?.queuedOperationsCount} + + ), +}; + +const executingWorkersColumn: ColumnType = { + key: "executingWorkers", + title: "Executing", + render: (_, record) => { + let allWorkers = record.sizeClassQueues[0].workersCount; + if (allWorkers === 0) { + allWorkers = 100; + } + const executingWorkers = + record.sizeClassQueues[0].rootInvocation?.executingWorkersCount || 0; + const percentage = ((executingWorkers / allWorkers) * 100).toFixed(2); + return ( + + {executingWorkers} ({percentage}%) + + ); + }, +}; + +const idleWorkersColumn: ColumnType = { + key: "idleWorkers", + title: "Idle workers", + render: (_, record) => ( + + {record.sizeClassQueues[0].rootInvocation?.idleWorkersCount} + + ), +}; + +const allWorkersColumn: ColumnType = { + key: "allWorkers", + title: "All workers", + render: (_, record) => ( + + {record.sizeClassQueues[0].workersCount} + + ), +}; + +const getColumns = (): TableColumnsType => { + return [ + instanceNamePrefixColumn, + platformPropertiesColumn, + sizeClassColumn, + queuedOperationsColumn, + executingWorkersColumn, + idleWorkersColumn, + allWorkersColumn, + ]; +}; + +export default getColumns; diff --git a/frontend/src/components/PlatformQueuesTable/index.tsx b/frontend/src/components/PlatformQueuesTable/index.tsx new file mode 100644 index 00000000..cf6340e0 --- /dev/null +++ b/frontend/src/components/PlatformQueuesTable/index.tsx @@ -0,0 +1,76 @@ +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import themeStyles from "@/theme/theme.module.css"; +import { BuildOutlined } from "@ant-design/icons"; +import { useQuery } from "@tanstack/react-query"; +import { Space, Table, Typography } from "antd"; +import type React from "react"; +import getColumns from "./Columns"; +import type { PlatformQueueTableState } from "./types"; + +const PlatformQueuesTable: React.FC = () => { + const { buildQueueStateClient } = useGrpcClients(); + + const { data, isLoading } = useQuery({ + queryKey: ["listPlatformQueues"], + queryFn: async (): Promise => { + const queues = await buildQueueStateClient.listPlatformQueues({}); + // Convert PlatoformQueueState to PlatformQueueTableState, making it + // suitable for the table component. This is done by flattening the + // sizeClassQueues array into a single element array, and adding + // additional properties to track the number of size classes and if + // the current size class is the first size class in the queue. + return queues.platformQueues.flatMap((queue) => { + return queue.sizeClassQueues.map((sizeClassQueue, index) => { + return { + ...queue, + sizeClassQueues: [sizeClassQueue], + numberOfSizeClasses: queue.sizeClassQueues.length, + isFirstSizeClass: index === 0, + }; + }); + }); + }, + }); + + const emptyText = "No platform queues can be found."; + + return ( +
themeStyles.compactTable} + pagination={false} + rowKey={(item) => + `instanceNamePrefix:${item.name?.instanceNamePrefix}-sizeClass:${item.sizeClassQueues[0].sizeClass}` + } + locale={{ + emptyText: isLoading ? ( + + + + Loading... + + + ) : ( + + + + {emptyText} + + + ), + }} + /> + ); +}; + +export default PlatformQueuesTable; diff --git a/frontend/src/components/PlatformQueuesTable/types.ts b/frontend/src/components/PlatformQueuesTable/types.ts new file mode 100644 index 00000000..380978b6 --- /dev/null +++ b/frontend/src/components/PlatformQueuesTable/types.ts @@ -0,0 +1,6 @@ +import type { PlatformQueueState } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; + +export interface PlatformQueueTableState extends PlatformQueueState { + numberOfSizeClasses: number; + isFirstSizeClass: boolean; +} diff --git a/frontend/src/components/PropertyTagList/index.tsx b/frontend/src/components/PropertyTagList/index.tsx new file mode 100644 index 00000000..2ac4f12c --- /dev/null +++ b/frontend/src/components/PropertyTagList/index.tsx @@ -0,0 +1,25 @@ +import { Flex, Tag } from "antd"; +import type React from "react"; +import type { PropertyTagListEntry } from "./types"; + +interface Props { + propertyList: PropertyTagListEntry[] | undefined; +} + +const PropertyTagList: React.FC = ({ propertyList }) => { + return ( + + {propertyList?.map((entry) => ( + + {entry.name}: {entry.value} + + ))} + + ); +}; + +export default PropertyTagList; diff --git a/frontend/src/components/PropertyTagList/types.ts b/frontend/src/components/PropertyTagList/types.ts new file mode 100644 index 00000000..ec6d84fd --- /dev/null +++ b/frontend/src/components/PropertyTagList/types.ts @@ -0,0 +1,4 @@ +export interface PropertyTagListEntry { + name: string; + value: string; +} diff --git a/frontend/src/components/SchedulerGrid/index.tsx b/frontend/src/components/SchedulerGrid/index.tsx new file mode 100644 index 00000000..7e197600 --- /dev/null +++ b/frontend/src/components/SchedulerGrid/index.tsx @@ -0,0 +1,45 @@ +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import { useQuery } from "@tanstack/react-query"; +import { Row, Space, Statistic, Typography } from "antd"; +import type React from "react"; +import PlatformQueuesTable from "../PlatformQueuesTable"; +import PortalAlert from "../PortalAlert"; + +const SchedulerGrid: React.FC = () => { + const { buildQueueStateClient } = useGrpcClients(); + + const { data, isError, error } = useQuery({ + queryKey: ["listOperations"], + queryFn: buildQueueStateClient.listOperations.bind(window, {}), + }); + + return ( + + + {isError ? ( + + + There was a problem communicating with the backend server: + +
{String(error)}
+ + } + /> + ) : ( + + )} +
+ + + +
+ ); +}; + +export default SchedulerGrid; diff --git a/frontend/src/components/Utilities/time.ts b/frontend/src/components/Utilities/time.ts index fdd1ccfd..6d92417f 100644 --- a/frontend/src/components/Utilities/time.ts +++ b/frontend/src/components/Utilities/time.ts @@ -1,8 +1,13 @@ -import dayjs from 'dayjs'; +import type { Duration } from "@/lib/grpc-client/google/protobuf/duration"; +import dayjs from "dayjs"; + +export const durationToSeconds = (duration: Duration) => { + return Number.parseInt(duration.seconds) + duration.nanos / 1e9; +}; const preciseTo = (from: dayjs.Dayjs, to: dayjs.Dayjs) => { const duration = dayjs.duration(to.diff(from)); - return `${Math.floor(duration.asHours())}:${duration.format('mm:ss')}`; + return `${Math.floor(duration.asHours())}:${duration.format("mm:ss")}`; }; export const humanFriendlyAgo = (timestamp: string) => { @@ -10,8 +15,6 @@ export const humanFriendlyAgo = (timestamp: string) => { return duration.humanize(true); }; - - export function millisecondsToTime(milliseconds: number): string { const totalSeconds = Math.floor(milliseconds / 1000); const hours = Math.floor(totalSeconds / 3600); @@ -22,7 +25,7 @@ export function millisecondsToTime(milliseconds: number): string { return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}:${pad(remainingMilliseconds, 3)}`; } -function pad(num: number, size: number = 2): string { - return num.toString().padStart(size, '0'); +function pad(num: number, size = 2): string { + return num.toString().padStart(size, "0"); } export default preciseTo; diff --git a/frontend/src/components/WorkersGrid/index.tsx b/frontend/src/components/WorkersGrid/index.tsx new file mode 100644 index 00000000..4d661b20 --- /dev/null +++ b/frontend/src/components/WorkersGrid/index.tsx @@ -0,0 +1,116 @@ +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import type { + BuildQueueStateClient, + DeepPartial, + ListWorkersRequest, + SizeClassQueueName, + WorkerState, +} from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { ListWorkerFilterType } from "@/types/ListWorkerFilterType"; +import { useQuery } from "@tanstack/react-query"; +import { Row, Space, Typography } from "antd"; +import type React from "react"; +import PortalAlert from "../PortalAlert"; +import WorkersInfo from "../WorkersInfo"; +import WorkersTable from "../WorkersTable"; + +const LIST_WORKERS_PAGE_SIZE = 100; + +interface Props { + listWorkerFilterType: ListWorkerFilterType; + sizeClassQueueName: SizeClassQueueName; + paginationCursor?: WorkerState["id"]; +} + +const fetchWorkers = async ( + client: BuildQueueStateClient, + listWorkerFilterType: ListWorkerFilterType, + sizeClassQueueName: SizeClassQueueName, + paginationCursor?: WorkerState["id"], +) => { + const requestBody: DeepPartial = { + filter: {}, + pageSize: LIST_WORKERS_PAGE_SIZE, + }; + + if (paginationCursor) { + requestBody.startAfter = { workerId: paginationCursor }; + } + + switch (listWorkerFilterType) { + case ListWorkerFilterType.ALL: + requestBody.filter = { + all: sizeClassQueueName, + }; + break; + case ListWorkerFilterType.EXECUTING: + requestBody.filter = { + executing: { + sizeClassQueueName: sizeClassQueueName, + }, + }; + break; + } + + return client.listWorkers(requestBody); +}; + +const WorkersGrid: React.FC = ({ + listWorkerFilterType, + sizeClassQueueName, + paginationCursor, +}) => { + const { buildQueueStateClient } = useGrpcClients(); + + const { data, isError, isLoading, error } = useQuery({ + queryKey: [ + "listWorkers", + listWorkerFilterType, + sizeClassQueueName, + paginationCursor, + ], + queryFn: () => + fetchWorkers( + buildQueueStateClient, + listWorkerFilterType, + sizeClassQueueName, + paginationCursor, + ), + placeholderData: (previousData, _) => previousData, + }); + + if (isError) { + return ( + + + There was a problem communicating with the backend server: + +
{String(error)}
+ + } + /> + ); + } + + return ( + + + + + + + + + ); +}; + +export default WorkersGrid; diff --git a/frontend/src/components/WorkersInfo/index.tsx b/frontend/src/components/WorkersInfo/index.tsx new file mode 100644 index 00000000..7772ff90 --- /dev/null +++ b/frontend/src/components/WorkersInfo/index.tsx @@ -0,0 +1,34 @@ +import type { SizeClassQueueName } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { Descriptions, Space } from "antd"; +import type React from "react"; +import { JSX } from "react/jsx-runtime"; +import PropertyTagList from "../PropertyTagList"; +import IntrinsicAttributes = JSX.IntrinsicAttributes; + +interface Props { + sizeClassQueueName: SizeClassQueueName; +} + +const WorkersInfo: React.FC = ({ sizeClassQueueName }) => { + return ( + + + + {sizeClassQueueName.platformQueueName?.instanceNamePrefix} + + + + + + {sizeClassQueueName.sizeClass} + + + + ); +}; + +export default WorkersInfo; diff --git a/frontend/src/components/WorkersTable/Columns.tsx b/frontend/src/components/WorkersTable/Columns.tsx new file mode 100644 index 00000000..b7ce650e --- /dev/null +++ b/frontend/src/components/WorkersTable/Columns.tsx @@ -0,0 +1,82 @@ +import type { WorkerState } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { type TableColumnsType, Typography } from "antd"; +import type { ColumnType } from "antd/lib/table"; +import PropertyTagList from "../PropertyTagList"; + +const workerIdColumn: ColumnType = { + key: "workerId", + title: "Worker ID", + render: (_, record) => ( + ({ name: property, value: value }))} + /> + ), +}; + +const workerTimeoutColumn: ColumnType = { + key: "workerTimeout", + title: "Worker timeout", + render: (_, record) => ( + {record.timeout?.toISOString() || "∞"} + ), +}; + +const operationTimeoutColumn: ColumnType = { + key: "operationTimeout", + title: "Operation timeout", + onCell: (value, _) => ({ + colSpan: value.currentOperation ? 1 : 4, + align: "center", + }), + render: (_, record) => ( + + {record.currentOperation + ? record.currentOperation?.timeout?.toISOString() || "∞" + : "Idle"} + + ), +}; + +const operationNameColumn: ColumnType = { + key: "operationName", + title: "Operation name", + onCell: (value, _) => ({ colSpan: value.currentOperation ? 1 : 0 }), + render: (_, record) => ( + {record.currentOperation?.name} + ), +}; + +const actionDigestColumn: ColumnType = { + key: "actionDigest", + title: "Action digest", + onCell: (value, _) => ({ colSpan: value.currentOperation ? 1 : 0 }), + render: (_, record) => ( + + {record.currentOperation?.actionDigest?.hash} + + ), +}; + +const targetIdColumn: ColumnType = { + key: "targetId", + title: "Target ID", + onCell: (value, _) => ({ colSpan: value.currentOperation ? 1 : 0 }), + render: (_, record) => ( + {record.currentOperation?.targetId} + ), +}; + +const getColumns = (): TableColumnsType => { + return [ + workerIdColumn, + workerTimeoutColumn, + operationTimeoutColumn, + operationNameColumn, + actionDigestColumn, + targetIdColumn, + ]; +}; + +export default getColumns; diff --git a/frontend/src/components/WorkersTable/index.tsx b/frontend/src/components/WorkersTable/index.tsx new file mode 100644 index 00000000..1157cfbe --- /dev/null +++ b/frontend/src/components/WorkersTable/index.tsx @@ -0,0 +1,113 @@ +import type { + PaginationInfo, + WorkerState, +} from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import themeStyles from "@/theme/theme.module.css"; +import type { ListWorkerFilterType } from "@/types/ListWorkerFilterType"; +import { BuildOutlined } from "@ant-design/icons"; +import { Flex, Row, Space, Table, Typography } from "antd"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import type React from "react"; +import WorkersTablePageSelector from "../WorkersTablePageSelector"; +import WorkersTableTypeSelector from "../WorkersTableTypeSelector"; +import getColumns from "./Columns"; + +type Props = { + listWorkerFilterType: ListWorkerFilterType; + data: WorkerState[] | undefined; + paginationInfo: PaginationInfo | undefined; + isLoading: boolean; + pageSize: number; +}; + +const WorkersTable: React.FC = ({ + listWorkerFilterType, + data, + paginationInfo, + isLoading, + pageSize, +}) => { + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + const changeUrlQueryValue = (key: string, value: string | undefined) => { + const params = new URLSearchParams(searchParams.toString()); + if (value === undefined) { + params.delete(key); + } else { + params.set(key, value); + } + router.replace(`${pathname}?${params.toString()}`); + }; + + const handleFilterChange = (value: ListWorkerFilterType) => { + changeUrlQueryValue("listWorkerFilterType", value); + }; + + const goToNextPage = () => { + changeUrlQueryValue("paginationCursor", JSON.stringify(data?.at(-1)?.id)); + }; + + const goToFirstPage = () => { + changeUrlQueryValue("paginationCursor", undefined); + }; + + return ( + + + + + {paginationInfo && ( + + )} + + + +
themeStyles.compactTable} + pagination={false} + rowKey={(item) => Object.entries(item.id).sort().join(",")} + locale={{ + emptyText: isLoading ? ( + + + + Loading... + + + ) : ( + + + + {"No workers matching the given criteria can be found."} + + + ), + }} + /> + + + ); +}; + +export default WorkersTable; diff --git a/frontend/src/components/WorkersTable/types.ts b/frontend/src/components/WorkersTable/types.ts new file mode 100644 index 00000000..380978b6 --- /dev/null +++ b/frontend/src/components/WorkersTable/types.ts @@ -0,0 +1,6 @@ +import type { PlatformQueueState } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; + +export interface PlatformQueueTableState extends PlatformQueueState { + numberOfSizeClasses: number; + isFirstSizeClass: boolean; +} diff --git a/frontend/src/components/WorkersTablePageSelector/index.tsx b/frontend/src/components/WorkersTablePageSelector/index.tsx new file mode 100644 index 00000000..d043f81b --- /dev/null +++ b/frontend/src/components/WorkersTablePageSelector/index.tsx @@ -0,0 +1,38 @@ +import type { PaginationInfo } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { BackwardFilled, CaretRightFilled } from "@ant-design/icons"; +import { Button, Space, Typography } from "antd"; +import type React from "react"; + +interface Props { + paginationInfo: PaginationInfo; + goToFirstPage: () => void; + goToNextPage: () => void; + pageSize: number; +} + +const WorkersTablePageSelector: React.FC = ({ + paginationInfo, + goToFirstPage, + goToNextPage, + pageSize, +}) => { + return ( + + + + ); +}; + +export default CopyBbClientdActionButton; diff --git a/frontend/src/components/BrowserActionGrid/fetch.ts b/frontend/src/components/BrowserActionGrid/fetch.ts new file mode 100644 index 00000000..28b43af8 --- /dev/null +++ b/frontend/src/components/BrowserActionGrid/fetch.ts @@ -0,0 +1,429 @@ +import { + Action, + type ActionCacheClient, + Command, + type Digest, + Directory, + ExecuteResponse, + RequestMetadata, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { AuthenticationMetadata } from "@/lib/grpc-client/buildbarn/auth/auth"; +import { HistoricalExecuteResponse } from "@/lib/grpc-client/buildbarn/cas/cas"; +import type { + FileSystemAccessCacheClient, + FileSystemAccessProfile, +} from "@/lib/grpc-client/buildbarn/fsac/fsac"; +import type { + InitialSizeClassCacheClient, + PreviousExecutionStats, +} from "@/lib/grpc-client/buildbarn/iscc/iscc"; +import { + FilePoolResourceUsage, + InputRootResourceUsage, + MonetaryResourceUsage, + POSIXResourceUsage, +} from "@/lib/grpc-client/buildbarn/resourceusage/resourceusage"; +import type { ByteStreamClient } from "@/lib/grpc-client/google/bytestream/bytestream"; +import { + type BrowserPageParams, + BrowserPageType, +} from "@/types/BrowserPageType"; +import { ProtobufTypeUrls } from "@/types/protobufTypeUrls"; +import { getReducedActionDigest_SHA256 } from "@/utils/digestFunctionUtils"; +import { fetchCasObject, fetchCasObjectAndParse } from "@/utils/fetchCasObject"; +import { protobufToObject } from "@/utils/protobufToObject"; +import type { ActionConsoleOutput } from "./types"; + +export const fetchBrowserActionGrid = async ( + browserPageParams: BrowserPageParams, + actionCacheClient: ActionCacheClient, + casByteStreamClient: ByteStreamClient, + initialSizeClassCacheClient: InitialSizeClassCacheClient, + fileSystemAccessCacheClient: FileSystemAccessCacheClient, +): Promise<{ + executeResponse: ExecuteResponse | undefined; + action: Action; + actionDigest: Digest; + authenticationMetadata: AuthenticationMetadata | undefined; + requestMetadata: RequestMetadata | undefined; + posixResourceUsage: POSIXResourceUsage | undefined; + filePoolResourceUsage: FilePoolResourceUsage | undefined; + inputRootResourceUsage: InputRootResourceUsage | undefined; + monetaryResourceUsage: MonetaryResourceUsage | undefined; + casCommand: Command | undefined; + casDirectory: Directory | undefined; + consoleOutputs: ActionConsoleOutput[]; + previousExecutionStats: PreviousExecutionStats | undefined; + fileSystemAccessProfile: FileSystemAccessProfile | undefined; +}> => { + const { actionDigest, executeResponse } = await fetchExecuteResponse( + browserPageParams, + casByteStreamClient, + actionCacheClient, + ); + + const action = await fetchCasObjectAndParse( + casByteStreamClient, + browserPageParams.instanceName, + browserPageParams.digestFunction, + actionDigest, + Action, + ); + + const { + authenticationMetadata, + requestMetadata, + posixResourceUsage, + filePoolResourceUsage, + inputRootResourceUsage, + monetaryResourceUsage, + } = extractMetadataFromExecuteResponse(executeResponse); + + const [ + casCommand, + casDirectory, + previousExecutionStats, + consoleOutputs, + fileSystemAccessProfile, + ] = await Promise.all([ + // Fetch Command + action.commandDigest + ? fetchCasObjectAndParse( + casByteStreamClient, + browserPageParams.instanceName, + browserPageParams.digestFunction, + action.commandDigest, + Command, + ) + : Promise.resolve(undefined), + + // Fetch Directory + action.inputRootDigest + ? fetchCasObjectAndParse( + casByteStreamClient, + browserPageParams.instanceName, + browserPageParams.digestFunction, + action.inputRootDigest, + Directory, + ) + : Promise.resolve(undefined), + + // Fetch Previous Execution Stats + fetchPreviousExecutionStats( + action, + initialSizeClassCacheClient, + browserPageParams, + ), + + // Fetch Console Outputs + getConsoleActionOutputs( + browserPageParams, + casByteStreamClient, + executeResponse, + ), + + // Fetch File System Access Cache Profile + fetchFileSystemAccessProfile( + action, + fileSystemAccessCacheClient, + browserPageParams, + ), + ]); + + return { + executeResponse, + action, + actionDigest, + authenticationMetadata, + requestMetadata, + posixResourceUsage, + filePoolResourceUsage, + inputRootResourceUsage, + monetaryResourceUsage, + casCommand, + casDirectory, + consoleOutputs, + previousExecutionStats, + fileSystemAccessProfile, + }; +}; + +export const getActionConsoleOutput = async ( + browserPageParams: BrowserPageParams, + casByteStreamClient: ByteStreamClient, + digest: Digest | undefined, + rawBytes: Uint8Array | undefined, + name: string, +): Promise => { + if (rawBytes && rawBytes.length > 0) + return { + name, + digest, + tooLarge: false, + notFound: false, + content: new TextDecoder().decode(rawBytes), + }; + + if (digest === undefined) { + return undefined; + } + + const MAX_CONSOLE_OUTPUT_SIZE = 10000; + if (Number.parseInt(digest.sizeBytes) > MAX_CONSOLE_OUTPUT_SIZE) { + return { + name, + digest, + tooLarge: true, + notFound: false, + content: undefined, + }; + } + + try { + const content = await fetchCasObject( + casByteStreamClient, + browserPageParams.instanceName, + browserPageParams.digestFunction, + digest, + ); + return { + name, + digest, + tooLarge: false, + notFound: false, + content: new TextDecoder().decode(content), + }; + } catch (e) { + return { + name, + digest, + tooLarge: false, + notFound: true, + content: undefined, + }; + } +}; + +async function fetchPreviousExecutionStats( + action: Action, + initialSizeClassCacheClient: InitialSizeClassCacheClient, + browserPageParams: BrowserPageParams, +): Promise { + if (!action.commandDigest || !action.platform) { + return undefined; + } + + try { + return await initialSizeClassCacheClient.getPreviousExecutionStats({ + digestFunction: browserPageParams.digestFunction, + instanceName: browserPageParams.instanceName, + reducedActionDigest: getReducedActionDigest_SHA256( + action.commandDigest, + action.platform, + ), + }); + } catch (error) { + console.log("No previous execution stats found"); + } +} + +async function getConsoleActionOutputs( + browserPageParams: BrowserPageParams, + casByteStreamClient: ByteStreamClient, + executeResponse: ExecuteResponse | undefined, +): Promise { + const consoleOutputs: ActionConsoleOutput[] = []; + + const stdoutOutput = await getActionConsoleOutput( + browserPageParams, + casByteStreamClient, + executeResponse?.result?.stdoutDigest, + executeResponse?.result?.stdoutRaw, + "Standard output", + ); + if (stdoutOutput) { + consoleOutputs.push(stdoutOutput); + } + + const stderrOutput = await getActionConsoleOutput( + browserPageParams, + casByteStreamClient, + executeResponse?.result?.stderrDigest, + executeResponse?.result?.stderrRaw, + "Standard error", + ); + if (stderrOutput) { + consoleOutputs.push(stderrOutput); + } + + return consoleOutputs; +} + +function extractMetadataFromExecuteResponse( + executeResponse: ExecuteResponse | undefined, +): { + authenticationMetadata: AuthenticationMetadata | undefined; + requestMetadata: RequestMetadata | undefined; + posixResourceUsage: POSIXResourceUsage | undefined; + filePoolResourceUsage: FilePoolResourceUsage | undefined; + inputRootResourceUsage: InputRootResourceUsage | undefined; + monetaryResourceUsage: MonetaryResourceUsage | undefined; +} { + let authenticationMetadata: AuthenticationMetadata | undefined = undefined; + let requestMetadata: RequestMetadata | undefined = undefined; + let posixResourceUsage: POSIXResourceUsage | undefined = undefined; + let filePoolResourceUsage: FilePoolResourceUsage | undefined = undefined; + let inputRootResourceUsage: InputRootResourceUsage | undefined = undefined; + let monetaryResourceUsage: MonetaryResourceUsage | undefined = undefined; + + if (!executeResponse?.result?.executionMetadata?.auxiliaryMetadata) { + return { + authenticationMetadata, + requestMetadata, + posixResourceUsage, + filePoolResourceUsage, + inputRootResourceUsage, + monetaryResourceUsage, + }; + } + + for (const metadata of executeResponse.result.executionMetadata + .auxiliaryMetadata) { + switch (metadata.typeUrl) { + case ProtobufTypeUrls.AUTHENTICATION_METADATA: + authenticationMetadata = protobufToObject( + AuthenticationMetadata, + metadata.value, + false, + ); + break; + case ProtobufTypeUrls.REQUEST_METADATA: + requestMetadata = protobufToObject( + RequestMetadata, + metadata.value, + false, + ); + break; + case ProtobufTypeUrls.POSIX_RESOURCE_USAGE: + posixResourceUsage = protobufToObject( + POSIXResourceUsage, + metadata.value, + true, + ); + break; + case ProtobufTypeUrls.FILE_POOL_RESOURCE_USAGE: + filePoolResourceUsage = protobufToObject( + FilePoolResourceUsage, + metadata.value, + true, + ); + break; + case ProtobufTypeUrls.INPUT_ROOT_RESOURCE_USAGE: + inputRootResourceUsage = protobufToObject( + InputRootResourceUsage, + metadata.value, + false, + ); + break; + case ProtobufTypeUrls.MONETARY_RESOURCE_USAGE: + monetaryResourceUsage = protobufToObject( + MonetaryResourceUsage, + metadata.value, + false, + ); + break; + default: + console.error(`Unknown metadata type: ${metadata.typeUrl}`); + break; + } + } + + return { + authenticationMetadata, + requestMetadata, + posixResourceUsage, + filePoolResourceUsage, + inputRootResourceUsage, + monetaryResourceUsage, + }; +} + +async function fetchExecuteResponse( + browserPageParams: BrowserPageParams, + casByteStreamClient: ByteStreamClient, + actionCacheClient: ActionCacheClient, +): Promise<{ + actionDigest: Digest; + executeResponse: ExecuteResponse | undefined; +}> { + if ( + browserPageParams.browserPageType === + BrowserPageType.HistoricalExecuteResponse + ) { + const historicalExecuteresponse = await fetchCasObjectAndParse( + casByteStreamClient, + browserPageParams.instanceName, + browserPageParams.digestFunction, + browserPageParams.digest, + HistoricalExecuteResponse, + ); + + if (!historicalExecuteresponse.executeResponse?.result) { + throw new Error( + "HistoricalExecuteResponse does not contain ExecuteResponse", + ); + } + if (!historicalExecuteresponse.actionDigest) { + throw new Error( + "HistoricalExecuteResponse does not contain ActionDigest", + ); + } + + return { + actionDigest: historicalExecuteresponse.actionDigest, + executeResponse: historicalExecuteresponse.executeResponse, + }; + } + + try { + const actionResult = await actionCacheClient.getActionResult({ + instanceName: browserPageParams.instanceName, + digestFunction: browserPageParams.digestFunction, + actionDigest: browserPageParams.digest, + inlineStdout: true, + inlineStderr: true, + }); + return { + actionDigest: browserPageParams.digest, + executeResponse: ExecuteResponse.fromPartial({ + result: actionResult, + }), + }; + } catch (error) { + console.log("No execute response was found"); + } + + return { actionDigest: browserPageParams.digest, executeResponse: undefined }; +} + +async function fetchFileSystemAccessProfile( + action: Action, + fileSystemAccessCacheClient: FileSystemAccessCacheClient, + browserPageParams: BrowserPageParams, +): Promise { + if (!action.commandDigest || !action.platform) { + return undefined; + } + try { + return await fileSystemAccessCacheClient.getFileSystemAccessProfile({ + digestFunction: browserPageParams.digestFunction, + instanceName: browserPageParams.instanceName, + reducedActionDigest: getReducedActionDigest_SHA256( + action.commandDigest, + action.platform, + ), + }); + } catch (error) { + console.log("No file system access cache profile was found"); + } +} diff --git a/frontend/src/components/BrowserActionGrid/index.tsx b/frontend/src/components/BrowserActionGrid/index.tsx new file mode 100644 index 00000000..7aa0e070 --- /dev/null +++ b/frontend/src/components/BrowserActionGrid/index.tsx @@ -0,0 +1,479 @@ +"use client"; + +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import { FileSystemAccessProfileReference } from "@/lib/grpc-client/buildbarn/query/query"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { + PATH_HASH_BASE_HASH, + generateFileSystemReferenceQueryParams, +} from "@/utils/bloomFilter"; +import { + digestFunctionValueToString, + getReducedActionDigest_SHA256, +} from "@/utils/digestFunctionUtils"; +import { formatDuration, formatFileSizeFromString } from "@/utils/formatValues"; +import { useQuery } from "@tanstack/react-query"; +import { Descriptions, Space, Spin, Typography } from "antd"; +import Link from "next/link"; +import type React from "react"; +import BrowserCommandDescription from "../BrowserCommandDescription"; +import BrowserDirectory from "../BrowserDirectory"; +import BrowserPreviousExecutionsDisplay from "../BrowserPreviousExecutionsDisplay"; +import BrowserResultDescription from "../BrowserResultDescription"; +import ExecutionMetadataTimeline from "../ExecutionMetadataTimeline"; +import FilesTable from "../FilesTable"; +import { + filesTableEntriesFromActionResultAndCommand, + filesTableEntriesFromServerLogs, +} from "../FilesTable/utils"; +import PortalAlert from "../PortalAlert"; +import PropertyTagList from "../PropertyTagList"; +import type { PropertyTagListEntry } from "../PropertyTagList/types"; +import CopyBbClientdActionButton from "./CopyBbClientdActionButton"; +import { fetchBrowserActionGrid } from "./fetch"; + +interface Params { + browserPageParams: BrowserPageParams; + showTitle?: boolean; +} + +const BrowserActionGrid: React.FC = ({ + browserPageParams, + showTitle, +}) => { + const { + actionCacheClient, + casByteStreamClient, + initialSizeClassCacheClient, + fileSystemAccessCacheClient, + } = useGrpcClients(); + + const { data, isError, isPending, error } = useQuery({ + queryKey: ["browserActionGrid", browserPageParams], + queryFn: fetchBrowserActionGrid.bind( + window, + browserPageParams, + actionCacheClient, + casByteStreamClient, + initialSizeClassCacheClient, + fileSystemAccessCacheClient, + ), + }); + + let fileSystemAccessProfileReference: + | FileSystemAccessProfileReference + | undefined = undefined; + + if (isError) { + return ( + + + There was a problem communicating with the backend server: + +
{String(error)}
+ + } + /> + ); + } + + if (isPending) { + return ; + } + + if (data.fileSystemAccessProfile) { + if (data.action.commandDigest && data.action.platform) { + fileSystemAccessProfileReference = + FileSystemAccessProfileReference.create({ + digest: getReducedActionDigest_SHA256( + data.action.commandDigest, + data.action.platform, + ), + pathHashesBaseHash: PATH_HASH_BASE_HASH, + }); + } + } + + const workerPropertyList = (): PropertyTagListEntry[] => { + const workerData = JSON.parse( + data.executeResponse?.result?.executionMetadata?.worker || "{}", + ); + return Object.keys(workerData).map( + (key) => ({ name: key, value: workerData[key] }) as PropertyTagListEntry, + ); + }; + + return ( + + {data.action ? ( + + {showTitle && ( + + + Action + + + )} + + {data.action.timeout && ( + + {formatDuration(data.action.timeout)} + + )} + + {data.action.doNotCache ? "Yes" : "No"} + + {data.action.platform && ( + + + + )} + + {data.action.commandDigest && data.action.inputRootDigest && ( + + )} + + ) : ( + This action could not be found. + )} + + {data.casCommand ? ( + + ) : ( + + The command of this action could not be found. + + )} + + + Result + {data.executeResponse ? ( + + ) : ( + + The action result of this action could not be found. + + )} + + + {data.action.inputRootDigest && ( + + + + Input files + + + + + )} + + + Output files + + + + {data.executeResponse?.serverLogs && + Object.keys(data.executeResponse.serverLogs).length !== 0 && ( + + Server logs + + + )} + + {data.executeResponse?.result?.executionMetadata && ( + + Execution metadata + + + + + + + + + {data.executeResponse.result.executionMetadata + .virtualExecutionDuration && ( + + {formatDuration( + data.executeResponse.result.executionMetadata + .virtualExecutionDuration, + )} + + )} + + + )} + + {data.authenticationMetadata && ( + + Authentication metadata + + + +
+                {JSON.stringify(data.authenticationMetadata.public, null, 2)}
+              
+
+
+
+ )} + + {data.requestMetadata && ( + + Request metadata + + + {data.requestMetadata.toolDetails && ( + + {`${data.requestMetadata.toolDetails.toolName} ${data.requestMetadata.toolDetails.toolVersion}`} + + )} + + {data.requestMetadata.toolInvocationId} + + + {data.requestMetadata.correlatedInvocationsId} + + + {data.requestMetadata.targetId} + + + {data.requestMetadata.actionMnemonic} + + + {data.requestMetadata.actionId} + + + {data.requestMetadata.configurationId} + + + + )} + + {data.posixResourceUsage && ( + + POSIX resource usage + + + + {data.posixResourceUsage.userTime && + `${formatDuration(data.posixResourceUsage.userTime)} user`} + {data.posixResourceUsage.userTime && + data.posixResourceUsage.systemTime && + ","}{" "} + {data.posixResourceUsage.systemTime && + `${formatDuration(data.posixResourceUsage.systemTime)} system`} + + + {formatFileSizeFromString( + data.posixResourceUsage.maximumResidentSetSize, + )} + + + {`${data.posixResourceUsage.pageReclaims} reclaims, ${data.posixResourceUsage.pageFaults} faults, ${data.posixResourceUsage.swaps} swaps`} + + + {`${data.posixResourceUsage.blockInputOperations} inputs, ${data.posixResourceUsage.blockOutputOperations} outputs`} + + + {`${data.posixResourceUsage.messagesSent} sent, ${data.posixResourceUsage.messagesReceived} received`} + + + {`${data.posixResourceUsage.signalsReceived} received`} + + + {`${data.posixResourceUsage.voluntaryContextSwitches} voluntary, ${data.posixResourceUsage.involuntaryContextSwitches} involuntary`} + + + + )} + + {data.filePoolResourceUsage && ( + + + File pool resource usage + + + + + {data.filePoolResourceUsage.filesCreated} + + + {`${ + data.filePoolResourceUsage.filesCountPeak + } files, having a total size of ${formatFileSizeFromString( + data.filePoolResourceUsage.filesSizeBytesPeak, + )}`} + + + {`${ + data.filePoolResourceUsage.readsCount + } operations, having a total size of ${formatFileSizeFromString( + data.filePoolResourceUsage.readsSizeBytes, + )}`} + + + {`${ + data.filePoolResourceUsage.writesCount + } operations, having a total size of ${formatFileSizeFromString( + data.filePoolResourceUsage.writesSizeBytes, + )}`} + + + {`${data.filePoolResourceUsage.truncatesCount} operations`} + + + + )} + + {data.inputRootResourceUsage && ( + + + Input root resource usage + + + + + {`${data.inputRootResourceUsage.directoriesResolved} resolved, ${data.inputRootResourceUsage.directoriesRead} read`} + + + {`${data.inputRootResourceUsage.filesRead} read`} + + + + )} + + {data.monetaryResourceUsage && ( + + Monetary resource usage + + + {Object.entries(data.monetaryResourceUsage.expenses).map( + ([key, value]) => ( + + {`${value.currency} ${value.cost}`} + + ), + )} + + + )} + {data.previousExecutionStats && + data.action.commandDigest && + data.action.platform && ( + + )} +
+ ); +}; + +export default BrowserActionGrid; diff --git a/frontend/src/components/BrowserActionGrid/types.ts b/frontend/src/components/BrowserActionGrid/types.ts new file mode 100644 index 00000000..b52eec34 --- /dev/null +++ b/frontend/src/components/BrowserActionGrid/types.ts @@ -0,0 +1,9 @@ +import type { Digest } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; + +export type ActionConsoleOutput = { + name: string; + digest: Digest | undefined; + tooLarge: boolean; + notFound: boolean; + content: string | undefined; +}; diff --git a/frontend/src/components/BrowserCommandDescription/CopyBbClientdCommandButton.tsx b/frontend/src/components/BrowserCommandDescription/CopyBbClientdCommandButton.tsx new file mode 100644 index 00000000..82ec93d8 --- /dev/null +++ b/frontend/src/components/BrowserCommandDescription/CopyBbClientdCommandButton.tsx @@ -0,0 +1,41 @@ +import type { Digest } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { getBBClientdPath } from "@/utils/getBbClientdPath"; +import { Button, message } from "antd"; +import type React from "react"; + +interface Params { + browserPageParams: BrowserPageParams; + commandDigest: Digest; +} + +const CopyBbClientdCommandButton: React.FC = ({ + browserPageParams, + commandDigest, +}) => { + const [messageApi, contextHolder] = message.useMessage(); + + const commandBbClientdPath = getBBClientdPath( + browserPageParams.instanceName, + browserPageParams.digestFunction, + commandDigest, + "command", + ); + + return ( + <> + {contextHolder} + + + ); +}; + +export default CopyBbClientdCommandButton; diff --git a/frontend/src/components/BrowserCommandDescription/DownloadAsShellScriptButton.tsx b/frontend/src/components/BrowserCommandDescription/DownloadAsShellScriptButton.tsx new file mode 100644 index 00000000..881a1a75 --- /dev/null +++ b/frontend/src/components/BrowserCommandDescription/DownloadAsShellScriptButton.tsx @@ -0,0 +1,30 @@ +import { Digest } from '@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution'; +import { BrowserPageParams } from '@/types/BrowserPageType'; +import { generateCommandShellScriptUrl } from '@/utils/urlGenerator'; +import { Button } from 'antd'; +import React from 'react'; + +interface Params { + browserPageParams: BrowserPageParams; + commandDigest: Digest; +} + +const DownloadAsShellScriptButton: React.FC = ({ + browserPageParams, + commandDigest, +}) => { + return ( + + ); +}; + +export default DownloadAsShellScriptButton; diff --git a/frontend/src/components/BrowserCommandDescription/index.tsx b/frontend/src/components/BrowserCommandDescription/index.tsx new file mode 100644 index 00000000..614c6231 --- /dev/null +++ b/frontend/src/components/BrowserCommandDescription/index.tsx @@ -0,0 +1,94 @@ +import type { + Command, + Digest, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { digestFunctionValueToString } from "@/utils/digestFunctionUtils"; +import { Descriptions, Flex, Space, Typography } from "antd"; +import Link from "next/link"; +import type React from "react"; +import CopyBbClientdCommandButton from "./CopyBbClientdCommandButton"; +import DownloadAsShellScriptButton from "./DownloadAsShellScriptButton"; + +interface Params { + browserPageParams: BrowserPageParams; + command: Command; + commandDigest: Digest | undefined; + showTitle: boolean; +} + +const BrowserCommandDescription: React.FC = ({ + browserPageParams, + command, + commandDigest, + showTitle, +}) => { + return ( + + {showTitle && ( + + {commandDigest ? ( + + Command + + ) : ( + "Command" + )} + + )} + + + + {command.arguments.map((arg, index) => ( +
+                {index === 0 ? {arg} : arg}
+              
+ ))} +
+
+ + {command.environmentVariables.map((env) => ( +
+              {env.name}
+              {`=${env.value}`}
+            
+ ))} +
+ {command.workingDirectory !== "" && ( + + {command.workingDirectory} + + )} +
+ {commandDigest && ( + + + + + )} +
+ ); +}; + +export default BrowserCommandDescription; diff --git a/frontend/src/components/BrowserCommandGrid/index.tsx b/frontend/src/components/BrowserCommandGrid/index.tsx new file mode 100644 index 00000000..72e1ea8c --- /dev/null +++ b/frontend/src/components/BrowserCommandGrid/index.tsx @@ -0,0 +1,75 @@ +"use client"; + +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import { Command } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { fetchCasObjectAndParse } from "@/utils/fetchCasObject"; +import { useQuery } from "@tanstack/react-query"; +import { Space, Spin, Typography } from "antd"; +import type React from "react"; +import BrowserCommandDescription from "../BrowserCommandDescription"; +import FilesTable from "../FilesTable"; +import { filesTableEntriesFromOutputPath } from "../FilesTable/utils"; +import PortalAlert from "../PortalAlert"; + +interface Params { + browserPageParams: BrowserPageParams; +} + +const BrowserCommandGrid: React.FC = ({ browserPageParams }) => { + const { casByteStreamClient } = useGrpcClients(); + + const { data, isError, isPending, error } = useQuery({ + queryKey: ["browserCommandGrid", browserPageParams], + queryFn: () => + fetchCasObjectAndParse( + casByteStreamClient, + browserPageParams.instanceName, + browserPageParams.digestFunction, + browserPageParams.digest, + Command, + ), + }); + + if (isError) { + return ( + + + There was a problem communicating with the backend server: + +
{String(error)}
+ + } + /> + ); + } + + if (isPending) { + return ; + } + + return ( + + Command + + + Output files + + filesTableEntriesFromOutputPath(entry), + )} + isPending={isPending} + /> + + ); +}; + +export default BrowserCommandGrid; diff --git a/frontend/src/components/BrowserDirectory/CopyBbClientdDirectoryButton.tsx b/frontend/src/components/BrowserDirectory/CopyBbClientdDirectoryButton.tsx new file mode 100644 index 00000000..dcece520 --- /dev/null +++ b/frontend/src/components/BrowserDirectory/CopyBbClientdDirectoryButton.tsx @@ -0,0 +1,45 @@ +import type { + Digest, + DigestFunction_Value, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { getBBClientdPath } from "@/utils/getBbClientdPath"; +import { Button, message } from "antd"; +import type React from "react"; + +interface Params { + instanceName: string; + digestFunction: DigestFunction_Value; + inputRootDigest: Digest; +} + +const CopyBbClientdDirectoryButton: React.FC = ({ + instanceName, + digestFunction, + inputRootDigest, +}) => { + const [messageApi, contextHolder] = message.useMessage(); + + const inputRootBbClientdPath = getBBClientdPath( + instanceName, + digestFunction, + inputRootDigest, + "directory", + ); + + return ( + <> + {contextHolder} + + + ); +}; + +export default CopyBbClientdDirectoryButton; diff --git a/frontend/src/components/BrowserDirectory/DownloadAsTarballButton.tsx b/frontend/src/components/BrowserDirectory/DownloadAsTarballButton.tsx new file mode 100644 index 00000000..2ca02f00 --- /dev/null +++ b/frontend/src/components/BrowserDirectory/DownloadAsTarballButton.tsx @@ -0,0 +1,34 @@ +import { + Digest, + DigestFunction_Value, +} from '@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution'; +import { generateDirectoryTarballUrl } from '@/utils/urlGenerator'; +import { Button } from 'antd'; +import React from 'react'; + +interface Params { + instanceName: string; + digestFunction: DigestFunction_Value; + directoryDigest: Digest; +} + +const DownloadAsTarballButton: React.FC = ({ + instanceName, + digestFunction, + directoryDigest, +}) => { + return ( + + ); +}; + +export default DownloadAsTarballButton; diff --git a/frontend/src/components/BrowserDirectory/index.tsx b/frontend/src/components/BrowserDirectory/index.tsx new file mode 100644 index 00000000..91742e7d --- /dev/null +++ b/frontend/src/components/BrowserDirectory/index.tsx @@ -0,0 +1,372 @@ +"use client"; + +import type { UrlObject } from "node:url"; +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import { + type Digest, + type DigestFunction_Value, + Directory, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { FileSystemAccessProfile } from "@/lib/grpc-client/buildbarn/fsac/fsac"; +import type { FileSystemAccessProfileReference } from "@/lib/grpc-client/buildbarn/query/query"; +import type { ByteStreamClient } from "@/lib/grpc-client/google/bytestream/bytestream"; +import themeStyles from "@/theme/theme.module.css"; +import { + type BloomFilterReader, + PathHashes, + containsPathHashes, + generateFileSystemReferenceQueryParams, + readBloomFilter, +} from "@/utils/bloomFilter"; +import { digestFunctionValueToString } from "@/utils/digestFunctionUtils"; +import { fetchCasObjectAndParse } from "@/utils/fetchCasObject"; +import { formatFileSizeFromString } from "@/utils/formatValues"; +import { generateFileUrl } from "@/utils/urlGenerator"; +import { DownOutlined, RightOutlined } from "@ant-design/icons"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { Button, Flex, Space, Spin, Typography } from "antd"; +import Link from "next/link"; +import React, { useEffect } from "react"; +import PortalAlert from "../PortalAlert"; +import CopyBbClientdDirectoryButton from "./CopyBbClientdDirectoryButton"; +import DownloadAsTarballButton from "./DownloadAsTarballButton"; + +const FETCH_STALE_TIME = 30000; + +interface Params { + instanceName: string; + digestFunction: DigestFunction_Value; + inputRootDigest: Digest; + fileSystemAccessProfile: FileSystemAccessProfile | undefined; + fileSystemAccessProfileReference: + | FileSystemAccessProfileReference + | undefined; +} + +const BrowserDirectory: React.FC = ({ + instanceName, + digestFunction, + inputRootDigest, + fileSystemAccessProfile, + fileSystemAccessProfileReference, +}) => { + const bloomFilterReader = fileSystemAccessProfile + ? readBloomFilter(fileSystemAccessProfile) + : undefined; + + return ( + + + + {bloomFilterReader && ( + + Note:{" "} + Green and{" "} + + red + {" "} + filenames above indicate which files and directories will be + prefetched the next time a similar action executes. Though it is + representative of what is actually accessed by the action, it may + contain false positives and negatives. + + )} + + + + + + + + ); +}; + +const fetchDirectory = async ( + casByteStreamClient: ByteStreamClient, + instanceName: string, + digestFunction: DigestFunction_Value, + digest: Digest, +) => { + return fetchCasObjectAndParse( + casByteStreamClient, + instanceName, + digestFunction, + digest, + Directory, + ); +}; + +const RecursiveDirectoryNode: React.FC<{ + instanceName: string; + digestFunction: DigestFunction_Value; + directoryDigest: Digest; + directoryName: string; + isTopLevel: boolean; + bloomFilterReader?: BloomFilterReader; + pathHashes?: PathHashes; + willBePrefetched?: boolean; + fileSystemAccessProfileRef: FileSystemAccessProfileReference | undefined; +}> = ({ + instanceName, + digestFunction, + directoryDigest, + directoryName, + isTopLevel, + bloomFilterReader, + pathHashes, + willBePrefetched, + fileSystemAccessProfileRef, +}) => { + const [expanded, setExpanded] = React.useState(isTopLevel); + const queryClient = useQueryClient(); + const { casByteStreamClient } = useGrpcClients(); + + const { data, isError, isPending, error } = useQuery({ + queryKey: [ + "browserDirectory", + instanceName, + digestFunction, + directoryDigest, + ], + queryFn: fetchDirectory.bind( + null, + casByteStreamClient, + instanceName, + digestFunction, + directoryDigest, + ), + staleTime: FETCH_STALE_TIME, + }); + + // Prefetch all child directories. React-query will cache the results for us + // and reuse them for the `useQuery` above. + useEffect(() => { + if (data) { + for (const dirNode of data.directories) { + if (dirNode.digest) { + queryClient.prefetchQuery({ + queryKey: [ + "browserDirectory", + instanceName, + digestFunction, + dirNode.digest, + ], + queryFn: fetchDirectory.bind( + null, + casByteStreamClient, + instanceName, + digestFunction, + dirNode.digest, + ), + staleTime: FETCH_STALE_TIME, + }); + } + } + } + }, [casByteStreamClient, data, digestFunction, instanceName, queryClient]); + + const calcWillBePrefetched = ( + currentPathHashes: PathHashes | undefined = pathHashes, + ) => { + if (willBePrefetched === false) { + return false; + } + if (bloomFilterReader === undefined || currentPathHashes === undefined) { + return undefined; + } + return containsPathHashes(bloomFilterReader, currentPathHashes); + }; + + if (isError) { + return ( + + + There was a problem communicating with the backend server: + +
{String(error)}
+ + } + /> + ); + } + + if (isPending) { + return ; + } + + return ( + <> + {!isTopLevel && ( + + )} + + {expanded && ( +
+ {data.directories.map( + (dirNode) => + dirNode.name && + dirNode.digest && ( + + ), + )} + {data.files.map((file) => ( + + ))} + {data.symlinks.map((symlink) => ( + ${symlink.target}`} + permissions="lrwxrwxrwx" + /> + ))} +
+ )} + + ); +}; + +const ROW_HEIGHT = 20; +const BUTTON_WIDTH = 32; +const BUTTON_PADDING = 8; + +const DirectoryNode: React.FC<{ + isDirectory?: boolean; + name: string; + href?: UrlObject; + sizeBytes?: string; + permissions: string; + expanded?: boolean; + setExpanded?: (expanded: boolean) => void; + willBePrefetched?: boolean; +}> = ({ + isDirectory = false, + name, + href, + sizeBytes, + permissions, + expanded, + setExpanded, + willBePrefetched, +}) => { + const indent = isDirectory ? "0px" : `${BUTTON_WIDTH + BUTTON_PADDING}px`; + + const formattedFileName = () => { + switch (willBePrefetched) { + case true: + return {name}; + case false: + return ( + + {name} + + ); + case undefined: + return {name}; + } + }; + + return ( + + + {isDirectory && expanded !== undefined && setExpanded !== undefined && ( + + )} + {href ? ( + {formattedFileName()} + ) : ( + {formattedFileName()} + )} + + + {sizeBytes &&
{formatFileSizeFromString(sizeBytes)}
} +
{permissions}
+
+
+ ); +}; + +export default BrowserDirectory; diff --git a/frontend/src/components/BrowserDirectoryPage/index.tsx b/frontend/src/components/BrowserDirectoryPage/index.tsx new file mode 100644 index 00000000..1d2bf6e6 --- /dev/null +++ b/frontend/src/components/BrowserDirectoryPage/index.tsx @@ -0,0 +1,81 @@ +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import { FileSystemAccessProfileReference } from "@/lib/grpc-client/buildbarn/query/query"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { useQuery } from "@tanstack/react-query"; +import { Spin, Typography } from "antd"; +import { useSearchParams } from "next/navigation"; +import BrowserDirectory from "../BrowserDirectory"; +import PortalAlert from "../PortalAlert"; + +interface Params { + browserPageParams: BrowserPageParams; +} + +const BrowserDirectoryPage: React.FC = ({ browserPageParams }) => { + const { fileSystemAccessCacheClient } = useGrpcClients(); + const searchParams = useSearchParams(); + const params = searchParams.get("fileSystemAccessProfile"); + let fileSystemAccessProfileReference: + | FileSystemAccessProfileReference + | undefined = undefined; + + if (params) { + try { + fileSystemAccessProfileReference = + FileSystemAccessProfileReference.fromJSON( + JSON.parse(decodeURIComponent(params)), + ); + } catch (error) { + console.error("Could not parse query parameters"); + } + } + + const { data, isError, error, isLoading } = useQuery({ + queryKey: [ + "fileSystemAccessProfile", + browserPageParams, + fileSystemAccessProfileReference, + ], + queryFn: fileSystemAccessCacheClient.getFileSystemAccessProfile.bind( + {}, + { + instanceName: browserPageParams.instanceName, + digestFunction: browserPageParams.digestFunction, + reducedActionDigest: fileSystemAccessProfileReference?.digest, + }, + ), + enabled: fileSystemAccessProfileReference !== undefined, + }); + + if (isLoading) { + return ; + } + + if (isError) { + return ( + + + There was a problem communicating with the backend server: + +
{String(error)}
+ + } + /> + ); + } + + return ( + + ); +}; + +export default BrowserDirectoryPage; diff --git a/frontend/src/components/BrowserPreviousExecutionsDisplay/index.tsx b/frontend/src/components/BrowserPreviousExecutionsDisplay/index.tsx new file mode 100644 index 00000000..53164406 --- /dev/null +++ b/frontend/src/components/BrowserPreviousExecutionsDisplay/index.tsx @@ -0,0 +1,64 @@ +import type { Digest } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { PreviousExecutionStats } from "@/lib/grpc-client/buildbarn/iscc/iscc"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { digestFunctionValueToString } from "@/utils/digestFunctionUtils"; +import { Descriptions, Space, Typography } from "antd"; +import Link from "next/link"; +import PreviousExecutionsPlot from "../PreviousExecuteStatsPlot"; +import SizeClassOutcome from "../SizeClassOutcome"; + +interface Props { + browserParams: BrowserPageParams; + reducedActionDigest: Digest; + previousExecutionStats: PreviousExecutionStats; + showTitle: boolean; +} + +const BrowserPreviousExecutionsDisplay: React.FC = ({ + browserParams, + previousExecutionStats, + showTitle, + reducedActionDigest, +}) => ( + + {showTitle && ( + + + Previous execution stats + + + )} + + + {previousExecutionStats.lastSeenFailure && ( + + {previousExecutionStats.lastSeenFailure.toISOString()} + + )} + {Object.entries(previousExecutionStats.sizeClasses).map((value) => ( + + + + ))} + + + +); + +export default BrowserPreviousExecutionsDisplay; diff --git a/frontend/src/components/BrowserPreviousExecutionsPage/index.tsx b/frontend/src/components/BrowserPreviousExecutionsPage/index.tsx new file mode 100644 index 00000000..ea6fe192 --- /dev/null +++ b/frontend/src/components/BrowserPreviousExecutionsPage/index.tsx @@ -0,0 +1,62 @@ +import { useGrpcClients } from "@/context/GrpcClientsContext"; +import { Digest } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { useQuery } from "@tanstack/react-query"; +import { Space, Spin, Typography } from "antd"; +import BrowserPreviousExecutionsDisplay from "../BrowserPreviousExecutionsDisplay"; +import PortalAlert from "../PortalAlert"; + +interface Params { + browserPageParams: BrowserPageParams; +} + +const BrowserPreviousExecutionsPage: React.FC = ({ + browserPageParams, +}) => { + const { initialSizeClassCacheClient } = useGrpcClients(); + + const reducedActionDigest = Digest.create(browserPageParams.digest); + + const { data, isPending, isError, error } = useQuery({ + queryKey: ["browserPreviousExecutionsPage", browserPageParams], + queryFn: initialSizeClassCacheClient.getPreviousExecutionStats.bind(null, { + digestFunction: browserPageParams.digestFunction, + instanceName: browserPageParams.instanceName, + reducedActionDigest: reducedActionDigest, + }), + }); + + if (isError) { + return ( + + + There was a problem communicating with the backend server: + +
{String(error)}
+ + } + /> + ); + } + + if (isPending) { + return ; + } + + return ( + + Previous executions stats + + + ); +}; + +export default BrowserPreviousExecutionsPage; diff --git a/frontend/src/components/BrowserResultDescription/index.tsx b/frontend/src/components/BrowserResultDescription/index.tsx new file mode 100644 index 00000000..a7b5e899 --- /dev/null +++ b/frontend/src/components/BrowserResultDescription/index.tsx @@ -0,0 +1,117 @@ +import type { ExecuteResponse } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { POSIXResourceUsage } from "@/lib/grpc-client/buildbarn/resourceusage/resourceusage"; +import type { BrowserPageParams } from "@/types/BrowserPageType"; +import { formatFileSizeFromString } from "@/utils/formatValues"; +import { generateFileUrl } from "@/utils/urlGenerator"; +import { Descriptions, Space, Tag, Typography } from "antd"; +import Paragraph from "antd/es/typography/Paragraph"; +import Link from "next/link"; +import type React from "react"; +import type { ActionConsoleOutput } from "../BrowserActionGrid/types"; + +interface Params { + browserPageParams: BrowserPageParams; + executeResponse: ExecuteResponse; + posixResourceUsage: POSIXResourceUsage | undefined; + consoleOutputs: ActionConsoleOutput[]; +} + +const BrowserResultDescription: React.FC = ({ + browserPageParams, + executeResponse, + posixResourceUsage, + consoleOutputs, +}) => { + const renderResult = () => { + if (executeResponse.status !== undefined) { + return ( + + {`Code ${executeResponse.status.code}: ${executeResponse.status.message}`} + + ); + } + + if ( + posixResourceUsage?.terminationSignal !== undefined && + posixResourceUsage?.terminationSignal !== "" + ) { + return ( + + {`SIG${posixResourceUsage.terminationSignal}`} + + ); + } + + return ( + + + {executeResponse.result?.exitCode} + + {executeResponse.result?.exitCode === 0 ? "Success" : "Failure"} + + + + ); + }; + + const renderConsoleOutput = (consoleOutput: ActionConsoleOutput) => { + const logLinkHref = consoleOutput.digest + ? generateFileUrl( + browserPageParams.instanceName, + browserPageParams.digestFunction, + consoleOutput.digest, + "log.txt", + ) + : undefined; + + const label = () => { + if (logLinkHref) { + return {consoleOutput.name}; + } + return consoleOutput.name; + }; + + const content = () => { + if (consoleOutput.notFound) { + return "The log file for this action could not be found."; + } + if (consoleOutput.tooLarge) { + if (consoleOutput.digest && logLinkHref) { + return ( + + The log file for this action is to + large to display ( + {formatFileSizeFromString(consoleOutput.digest.sizeBytes)}). + + ); + } + return "The log file for this action is to large to display."; + } + return ( + +
{consoleOutput.content}
+
+ ); + }; + + return ( + + {content()} + + ); + }; + + return ( + + {renderResult()} + {consoleOutputs.map(renderConsoleOutput)} + + ); +}; + +export default BrowserResultDescription; diff --git a/frontend/src/components/ExecutionMetadataTimeline/index.tsx b/frontend/src/components/ExecutionMetadataTimeline/index.tsx new file mode 100644 index 00000000..4237a1f5 --- /dev/null +++ b/frontend/src/components/ExecutionMetadataTimeline/index.tsx @@ -0,0 +1,103 @@ +"use client"; + +import type { ExecutedActionMetadata } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { formatDurationFromDates } from "@/utils/formatValues"; +import { ClockCircleOutlined } from "@ant-design/icons"; +import { Flex, Space, Typography } from "antd"; +import type React from "react"; + +interface Params { + executionMetadata: ExecutedActionMetadata; +} + +const formatTimelineElement = ( + timestamp: Date, + previous: Date | undefined = undefined, +) => { + if (timestamp.getTime() === previous?.getTime()) { + return null; + } + + return ( + + {timestamp.toISOString()} + {previous && ( + <> + + + {" "} + (+{formatDurationFromDates(previous, timestamp, 3, 0)}) + + + )} + + ); +}; + +const ExecutionMetadataTimeline: React.FC = ({ + executionMetadata: em, +}) => { + return ( + + {em.queuedTimestamp && formatTimelineElement(em.queuedTimestamp)} + Action added to the queue. + {em.workerStartTimestamp && + formatTimelineElement(em.workerStartTimestamp, em.queuedTimestamp)} + Worker received the action. + {em.inputFetchStartTimestamp && + formatTimelineElement( + em.inputFetchStartTimestamp, + em.workerStartTimestamp, + )} + Worker started fetching action inputs. + {em.inputFetchCompletedTimestamp && + formatTimelineElement( + em.inputFetchCompletedTimestamp, + em.inputFetchStartTimestamp, + )} + Worker finished fetching action inputs. + {em.executionStartTimestamp && + formatTimelineElement( + em.executionStartTimestamp, + em.inputFetchCompletedTimestamp, + )} + + Worker started executing the action command. + + {em.executionCompletedTimestamp && + formatTimelineElement( + em.executionCompletedTimestamp, + em.executionStartTimestamp, + )} + + Worker completed executing the action command. + + {em.outputUploadStartTimestamp && + formatTimelineElement( + em.outputUploadStartTimestamp, + em.executionCompletedTimestamp, + )} + + Worker started uploading action outputs. + + {em.outputUploadCompletedTimestamp && + formatTimelineElement( + em.outputUploadCompletedTimestamp, + em.outputUploadStartTimestamp, + )} + + Worker completed uploading action outputs. + + {em.workerCompletedTimestamp && + formatTimelineElement( + em.workerCompletedTimestamp, + em.outputUploadCompletedTimestamp, + )} + + Worker completed the action, including all stages. + + + ); +}; + +export default ExecutionMetadataTimeline; diff --git a/frontend/src/components/ExecutionResponseDisplay/index.tsx b/frontend/src/components/ExecutionResponseDisplay/index.tsx new file mode 100644 index 00000000..6b48c615 --- /dev/null +++ b/frontend/src/components/ExecutionResponseDisplay/index.tsx @@ -0,0 +1,43 @@ +import { ExecuteResponse } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { protobufToObjectWithTypeField } from "@/utils/protobufToObject"; +import { CodeFilled } from "@ant-design/icons"; +import { Space } from "antd"; +import PortalCard from "../PortalCard"; + +interface Props { + executeResponse: ExecuteResponse; +} + +const ExecuteResponseDisplay: React.FC = ({ executeResponse }) => { + const auxiliaryMetadata = + executeResponse?.result?.executionMetadata?.auxiliaryMetadata.map( + (value) => { + return protobufToObjectWithTypeField(value, false); + }, + ); + + return ( + + }> +
+          {
+            // `ts-proto` currently does not support JSON string
+            // encoding of well-known type google.protobuf.Duration
+            JSON.stringify(
+              ExecuteResponse.toJSON(executeResponse),
+              (key, val) => {
+                if (key === "auxiliaryMetadata") {
+                  return auxiliaryMetadata;
+                }
+                return val;
+              },
+              1,
+            )
+          }
+        
+
+
+ ); +}; + +export default ExecuteResponseDisplay; diff --git a/frontend/src/components/FilesTable/Columns.tsx b/frontend/src/components/FilesTable/Columns.tsx new file mode 100644 index 00000000..bef13f36 --- /dev/null +++ b/frontend/src/components/FilesTable/Columns.tsx @@ -0,0 +1,39 @@ +import { type TableColumnsType, Typography } from "antd"; +import type { ColumnType } from "antd/lib/table"; +import Link from "next/link"; + +export interface FilesTableEntry { + mode: string | undefined; + size: string | undefined; + filename: string; + href: string | undefined; +} + +const modeColumn: ColumnType = { + key: "mode", + title: "Mode", + dataIndex: "mode", +}; + +const sizeColumn: ColumnType = { + key: "size", + title: "Size", + dataIndex: "size", +}; + +const filenameColumn: ColumnType = { + key: "filename", + title: "Filename", + render: (_, record) => { + if (record.href) { + return {record.filename}; + } + return {record.filename}; + }, +}; + +const getColumns = (): TableColumnsType => { + return [modeColumn, sizeColumn, filenameColumn]; +}; + +export default getColumns; diff --git a/frontend/src/components/FilesTable/index.tsx b/frontend/src/components/FilesTable/index.tsx new file mode 100644 index 00000000..1ecd2d9d --- /dev/null +++ b/frontend/src/components/FilesTable/index.tsx @@ -0,0 +1,50 @@ +import themeStyles from "@/theme/theme.module.css"; +import { BuildOutlined } from "@ant-design/icons"; +import { Space, Table, Typography } from "antd"; +import type React from "react"; +import getColumns, { type FilesTableEntry } from "./Columns"; + +type Props = { + entries: FilesTableEntry[]; + isPending: boolean; +}; + +const FilesTable: React.FC = ({ entries, isPending }) => { + return ( +
item.filename} + rowClassName={() => themeStyles.compactTable} + locale={{ + emptyText: isPending ? ( + + + + Loading... + + + ) : ( + + + + No files found + + + ), + }} + /> + ); +}; + +export default FilesTable; diff --git a/frontend/src/components/FilesTable/utils.ts b/frontend/src/components/FilesTable/utils.ts new file mode 100644 index 00000000..4f4b1afb --- /dev/null +++ b/frontend/src/components/FilesTable/utils.ts @@ -0,0 +1,153 @@ +import type { + ActionResult, + Command, + DigestFunction_Value, + LogFile, + OutputDirectory, + OutputFile, + OutputSymlink, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { digestFunctionValueToString } from "@/utils/digestFunctionUtils"; +import { generateFileUrl } from "@/utils/urlGenerator"; +import type { FilesTableEntry } from "./Columns"; + +export function filesTableEntryFromOutputDirectory( + outputDirectory: OutputDirectory, + instanceName: string, + digestFunction: DigestFunction_Value, +): FilesTableEntry { + const digest = outputDirectory.rootDirectoryDigest + ? outputDirectory.rootDirectoryDigest + : outputDirectory.treeDigest; + + return { + mode: "drwxr-xr-x", + size: digest?.sizeBytes, + filename: outputDirectory.path, + href: `/${instanceName}/blobs/${digestFunctionValueToString( + digestFunction, + )}/directory/${digest?.hash}-${digest?.sizeBytes}`, + }; +} + +export function filesTableEntryFromOutputSymlink( + outputSymlink: OutputSymlink, +): FilesTableEntry { + return { + mode: "lrwxrwxrwx", + size: undefined, + filename: `${outputSymlink.path} -> ${outputSymlink.target}`, + href: undefined, + }; +} + +export function filesTableEntryFromOutputFile( + outputFile: OutputFile, + instanceName: string, + digestFunction: DigestFunction_Value, +): FilesTableEntry { + return { + mode: `-rw${outputFile.isExecutable ? "x" : "-"}r-${ + outputFile.isExecutable ? "x" : "-" + }r-${outputFile.isExecutable ? "x" : "-"}`, + size: outputFile.digest?.sizeBytes, + filename: outputFile.path, + href: outputFile.digest + ? generateFileUrl( + instanceName, + digestFunction, + outputFile.digest, + outputFile.path.split("/").slice(-1)[0], + ) + : undefined, + }; +} + +export function filesTableEntriesFromOutputPath( + outputPath: string, +): FilesTableEntry { + return { + mode: undefined, + size: undefined, + filename: outputPath, + href: undefined, + }; +} + +export function filesTableEntriesFromActionResultAndCommand( + actionResult: ActionResult | undefined, + command: Command | undefined, + instanceName: string, + digestFunction: DigestFunction_Value, +): FilesTableEntry[] { + const entries: FilesTableEntry[] = []; + + if (actionResult) { + if (actionResult.outputDirectories) { + for (const outputDirectory of actionResult.outputDirectories) { + entries.push( + filesTableEntryFromOutputDirectory( + outputDirectory, + instanceName, + digestFunction, + ), + ); + } + } + + if (actionResult.outputSymlinks) { + for (const outputSymlink of actionResult.outputSymlinks) { + entries.push(filesTableEntryFromOutputSymlink(outputSymlink)); + } + } + if (actionResult.outputFiles) { + for (const outputFile of actionResult.outputFiles) { + entries.push( + filesTableEntryFromOutputFile( + outputFile, + instanceName, + digestFunction, + ), + ); + } + } + } + + if (command) { + for (const outputPath of command.outputPaths) { + if ( + !entries.find((filesTableEntry) => { + return filesTableEntry.filename === outputPath; + }) + ) { + entries.push(filesTableEntriesFromOutputPath(outputPath)); + } + } + } + + return entries; +} + +export function filesTableEntriesFromServerLogs( + serverLogs: { + [key: string]: LogFile; + }, + instanceName: string, + digestFunction: DigestFunction_Value, +): FilesTableEntry[] { + const entries: FilesTableEntry[] = []; + + for (const key of Object.keys(serverLogs)) { + const logFile = serverLogs[key]; + entries.push({ + mode: "-rw-r--r--", + size: logFile.digest?.sizeBytes, + filename: key, + href: logFile.digest + ? generateFileUrl(instanceName, digestFunction, logFile.digest, key) + : undefined, + }); + } + + return entries; +} diff --git a/frontend/src/components/PreviousExecuteStatsPlot/index.tsx b/frontend/src/components/PreviousExecuteStatsPlot/index.tsx new file mode 100644 index 00000000..426e28e2 --- /dev/null +++ b/frontend/src/components/PreviousExecuteStatsPlot/index.tsx @@ -0,0 +1,138 @@ +import type { PreviousExecutionStats } from "@/lib/grpc-client/buildbarn/iscc/iscc"; +import { formatDurationFromSeconds } from "@/utils/formatValues"; +import { + Legend, + ReferenceArea, + Scatter, + ScatterChart, + Tooltip, + XAxis, + YAxis, +} from "recharts"; +import { durationToSeconds } from "../Utilities/time"; + +interface Props { + prevStats: PreviousExecutionStats; +} + +interface PlotDataPoint { + x: number; + y: number; + sizeClass: number; +} + +const PADDING_FACTOR = 4; + +const PreviousExecutionsPlot: React.FC = ({ prevStats }) => { + const succeeded: PlotDataPoint[] = []; + const timedOut: PlotDataPoint[] = []; + const sizeClasses: number[] = []; + + for (const sizeClassEntry of Object.entries(prevStats.sizeClasses)) { + const sizeClass = Number.parseInt(sizeClassEntry[0]); + sizeClasses.push(sizeClass); + for (const prevExec of sizeClassEntry[1].previousExecutions) { + // TODO: Make random scatter deterministic for each data point + // TODO: Nicely visualize class gaps in plot (i.e. if the only + // two size classes are labeled 0 and 64, it should not + // look weird) + const xValue = sizeClass + (Math.random() - 0.5) / 3; + if (prevExec.succeeded) { + const time = durationToSeconds(prevExec.succeeded); + succeeded.push({ + x: xValue, + y: time, + sizeClass: sizeClass, + }); + } + if (prevExec.timedOut) { + const time = durationToSeconds(prevExec.timedOut); + timedOut.push({ + x: xValue, + y: time, + sizeClass: sizeClass, + }); + // `prevExec.failed` has no time information, + // so we cannot visualize them in the graph + } + } + } + + return ( + + { + const len = sizeClasses.length; + return [-PADDING_FACTOR / len, len - 1 + PADDING_FACTOR / len]; + }} + /> + + + { + switch (name) { + case "Size class": { + return [props.payload.sizeClass, name]; + } + case "Execution time": { + return [formatDurationFromSeconds(props.payload.y, 10), name]; + } + default: { + return [value, name]; + } + } + }} + /> + {sizeClasses.map((sizeClass) => { + return ( + + ); + })} + {succeeded.length > 0 && ( + + )} + {timedOut.length > 0 && ( + + )} + + + ); +}; + +export default PreviousExecutionsPlot; diff --git a/frontend/src/components/SizeClassOutcome/index.tsx b/frontend/src/components/SizeClassOutcome/index.tsx new file mode 100644 index 00000000..fe9a9045 --- /dev/null +++ b/frontend/src/components/SizeClassOutcome/index.tsx @@ -0,0 +1,48 @@ +import type { PerSizeClassStats } from "@/lib/grpc-client/buildbarn/iscc/iscc"; +import { formatDuration } from "@/utils/formatValues"; +import { Space, Typography } from "antd"; +import SizeClassOutcomeTag from "../SizeClassOutcomeTag"; + +interface Props { + sizeClassStats: PerSizeClassStats; +} + +const SizeClassOutcome: React.FC = ({ sizeClassStats }) => { + return ( + + + {sizeClassStats.previousExecutions.map((val, index) => { + if (val.succeeded) { + return ( + // biome-ignore lint/suspicious/noArrayIndexKey: We have nothing better to use + + Succeeded: {formatDuration(val.succeeded)} + + ); + } + if (val.timedOut) { + return ( + // biome-ignore lint/suspicious/noArrayIndexKey: We have nothing better to use + + Timed out: {formatDuration(val.timedOut)} + + ); + } + if (val.failed) { + return ( + // biome-ignore lint/suspicious/noArrayIndexKey: We have nothing better to use + + Failed + + ); + } + })} + + + {`Initial PageRank probability: ${sizeClassStats.initialPageRankProbability}`} + + + ); +}; + +export default SizeClassOutcome; diff --git a/frontend/src/components/SizeClassOutcomeTag/index.tsx b/frontend/src/components/SizeClassOutcomeTag/index.tsx new file mode 100644 index 00000000..981780f0 --- /dev/null +++ b/frontend/src/components/SizeClassOutcomeTag/index.tsx @@ -0,0 +1,20 @@ +import themeStyles from "@/theme/theme.module.css"; +import { Tag } from "antd"; + +interface Props { + color?: string; + children: React.ReactNode; +} + +const SizeClassOutcomeTag: React.FC = ({ + color = "default", + children, +}) => { + return ( + + {children} + + ); +}; + +export default SizeClassOutcomeTag; diff --git a/frontend/src/context/GrpcClientsContext.tsx b/frontend/src/context/GrpcClientsContext.tsx index 222f22b8..a3d81f5f 100644 --- a/frontend/src/context/GrpcClientsContext.tsx +++ b/frontend/src/context/GrpcClientsContext.tsx @@ -1,8 +1,30 @@ -import { BuildQueueStateClient } from '@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate'; -import { createContext, useContext } from 'react'; +import type { + ActionCacheClient, + DigestFunction_Value, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { BuildQueueStateClient } from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import type { FileSystemAccessCacheClient } from "@/lib/grpc-client/buildbarn/fsac/fsac"; +import type { InitialSizeClassCacheClient } from "@/lib/grpc-client/buildbarn/iscc/iscc"; +import type { ByteStreamClient } from "@/lib/grpc-client/google/bytestream/bytestream"; +import { createContext, useContext } from "react"; + +export type CasObjectFetchFunction = ( + objectType: { + decode: (input: Uint8Array) => T; + toJSON: (input: T) => unknown; + }, + instanceName: string | undefined, + digestFunction: DigestFunction_Value, + digest: string, + sizeBytes: string, +) => Promise; interface GrpcClientsContextState { buildQueueStateClient: BuildQueueStateClient; + actionCacheClient: ActionCacheClient; + casByteStreamClient: ByteStreamClient; + initialSizeClassCacheClient: InitialSizeClassCacheClient; + fileSystemAccessCacheClient: FileSystemAccessCacheClient; } // biome-ignore lint/style/noNonNullAssertion: We want to throw an error if the context is used without provider, instead of failing silently. diff --git a/frontend/src/context/GrpcClientsProvider.tsx b/frontend/src/context/GrpcClientsProvider.tsx index bc805687..42bc2443 100644 --- a/frontend/src/context/GrpcClientsProvider.tsx +++ b/frontend/src/context/GrpcClientsProvider.tsx @@ -1,11 +1,27 @@ import { - BuildQueueStateClient, + type ActionCacheClient, + ActionCacheDefinition, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { + type BuildQueueStateClient, BuildQueueStateDefinition, -} from '@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate'; -import { env } from 'next-runtime-env'; -import { createChannel, createClient } from 'nice-grpc-web'; -import { ReactNode } from 'react'; -import { GrpcClientsContext } from './GrpcClientsContext'; +} from "@/lib/grpc-client/buildbarn/buildqueuestate/buildqueuestate"; +import { + type FileSystemAccessCacheClient, + FileSystemAccessCacheDefinition, +} from "@/lib/grpc-client/buildbarn/fsac/fsac"; +import { + type InitialSizeClassCacheClient, + InitialSizeClassCacheDefinition, +} from "@/lib/grpc-client/buildbarn/iscc/iscc"; +import { + type ByteStreamClient, + ByteStreamDefinition, +} from "@/lib/grpc-client/google/bytestream/bytestream"; +import { env } from "next-runtime-env"; +import { createChannel, createClient } from "nice-grpc-web"; +import type { ReactNode } from "react"; +import { GrpcClientsContext } from "./GrpcClientsContext"; export interface GrpcClientsProviderProps { children: ReactNode; @@ -17,10 +33,34 @@ const GrpcClientsProvider = ({ children }: GrpcClientsProviderProps) => { createChannel(env("NEXT_PUBLIC_BB_BUILDQUEUESTATE_GRPC_BACKEND_URL") || ""), ); + const actionCacheClient: ActionCacheClient = createClient( + ActionCacheDefinition, + createChannel(env("NEXT_PUBLIC_BB_ACTIONCACHE_GRPC_BACKEND_URL") || ""), + ); + + const casByteStreamClient: ByteStreamClient = createClient( + ByteStreamDefinition, + createChannel(env("NEXT_PUBLIC_BB_CAS_GRPC_BACKEND_URL") || ""), + ); + + const initialSizeClassCacheClient: InitialSizeClassCacheClient = createClient( + InitialSizeClassCacheDefinition, + createChannel(env("NEXT_PUBLIC_BB_ISCC_GRPC_BACKEND_URL") || ""), + ); + + const fileSystemAccessCacheClient: FileSystemAccessCacheClient = createClient( + FileSystemAccessCacheDefinition, + createChannel(env("NEXT_PUBLIC_BB_FSAC_GRPC_BACKEND_URL") || ""), + ); + return ( {children} diff --git a/frontend/src/lib/grpc-client/buildbarn/auth/auth.ts b/frontend/src/lib/grpc-client/buildbarn/auth/auth.ts new file mode 100644 index 00000000..c79f5c17 --- /dev/null +++ b/frontend/src/lib/grpc-client/buildbarn/auth/auth.ts @@ -0,0 +1,156 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.6.1 +// protoc v3.19.1 +// source: buildbarn/auth/auth.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { Value } from "../../google/protobuf/struct"; +import { KeyValue } from "../../opentelemetry/proto/common/v1/common"; + +export const protobufPackage = "buildbarn.auth"; + +/** + * Protobuf equivalent of the AuthenticationMetadata structure that is + * used by the auth framework to store information on an authenticated + * user. + */ +export interface AuthenticationMetadata { + /** + * Part of the authentication metadata that is safe to display + * publicly (e.g., as part of logs or bb_browser). + */ + public: + | any + | undefined; + /** + * OpenTelemetry tracing attributes to add to spans in which the + * authentication took place (e.g., gRPC server call spans). All + * attributes will have "auth." prepended to their names + * automatically. + */ + tracingAttributes: KeyValue[]; + /** + * Part of the authentication metadata that should not be displayed + * publicly. This field is useful for propagating information from the + * authentication layer to the authorization layer, as this data can + * be accessed by JMESPathExpressionAuthorizer. + */ + private: any | undefined; +} + +function createBaseAuthenticationMetadata(): AuthenticationMetadata { + return { public: undefined, tracingAttributes: [], private: undefined }; +} + +export const AuthenticationMetadata: MessageFns = { + encode(message: AuthenticationMetadata, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.public !== undefined) { + Value.encode(Value.wrap(message.public), writer.uint32(10).fork()).join(); + } + for (const v of message.tracingAttributes) { + KeyValue.encode(v!, writer.uint32(18).fork()).join(); + } + if (message.private !== undefined) { + Value.encode(Value.wrap(message.private), writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AuthenticationMetadata { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAuthenticationMetadata(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.public = Value.unwrap(Value.decode(reader, reader.uint32())); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.tracingAttributes.push(KeyValue.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.private = Value.unwrap(Value.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AuthenticationMetadata { + return { + public: isSet(object?.public) ? object.public : undefined, + tracingAttributes: globalThis.Array.isArray(object?.tracingAttributes) + ? object.tracingAttributes.map((e: any) => KeyValue.fromJSON(e)) + : [], + private: isSet(object?.private) ? object.private : undefined, + }; + }, + + toJSON(message: AuthenticationMetadata): unknown { + const obj: any = {}; + if (message.public !== undefined) { + obj.public = message.public; + } + if (message.tracingAttributes?.length) { + obj.tracingAttributes = message.tracingAttributes.map((e) => KeyValue.toJSON(e)); + } + if (message.private !== undefined) { + obj.private = message.private; + } + return obj; + }, + + create(base?: DeepPartial): AuthenticationMetadata { + return AuthenticationMetadata.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): AuthenticationMetadata { + const message = createBaseAuthenticationMetadata(); + message.public = object.public ?? undefined; + message.tracingAttributes = object.tracingAttributes?.map((e) => KeyValue.fromPartial(e)) || []; + message.private = object.private ?? undefined; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create(base?: DeepPartial): T; + fromPartial(object: DeepPartial): T; +} diff --git a/frontend/src/lib/grpc-client/buildbarn/cas/cas.ts b/frontend/src/lib/grpc-client/buildbarn/cas/cas.ts new file mode 100644 index 00000000..7f36179e --- /dev/null +++ b/frontend/src/lib/grpc-client/buildbarn/cas/cas.ts @@ -0,0 +1,133 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.6.1 +// protoc v3.19.1 +// source: buildbarn/cas/cas.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { Digest, ExecuteResponse } from "../../build/bazel/remote/execution/v2/remote_execution"; + +export const protobufPackage = "buildbarn.cas"; + +/** + * HistoricalExecuteResponse is a custom message that is stored into the + * Content Addressable Storage. The Action Cache is only permitted to + * contain ActionResults of successful builds. In our case we also want + * to provide the user insight as to why their build fails by storing + * the ActionResult upon failure. + * + * This message is written into the ContentAddressableStorage by + * bb_worker by the CachingBuildExecutor. The digest is returned to the + * user by providing a URL to bb_browser as a message in the + * ExecuteResponse. + * + * Additionally, this message is attached to CompletedActions that are + * streamed through a CompletedActionLogger in order to provide metadata + * for uniquely identifying actions. + */ +export interface HistoricalExecuteResponse { + actionDigest: Digest | undefined; + executeResponse: ExecuteResponse | undefined; +} + +function createBaseHistoricalExecuteResponse(): HistoricalExecuteResponse { + return { actionDigest: undefined, executeResponse: undefined }; +} + +export const HistoricalExecuteResponse: MessageFns = { + encode(message: HistoricalExecuteResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.actionDigest !== undefined) { + Digest.encode(message.actionDigest, writer.uint32(10).fork()).join(); + } + if (message.executeResponse !== undefined) { + ExecuteResponse.encode(message.executeResponse, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): HistoricalExecuteResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHistoricalExecuteResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.actionDigest = Digest.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.executeResponse = ExecuteResponse.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): HistoricalExecuteResponse { + return { + actionDigest: isSet(object.actionDigest) ? Digest.fromJSON(object.actionDigest) : undefined, + executeResponse: isSet(object.executeResponse) ? ExecuteResponse.fromJSON(object.executeResponse) : undefined, + }; + }, + + toJSON(message: HistoricalExecuteResponse): unknown { + const obj: any = {}; + if (message.actionDigest !== undefined) { + obj.actionDigest = Digest.toJSON(message.actionDigest); + } + if (message.executeResponse !== undefined) { + obj.executeResponse = ExecuteResponse.toJSON(message.executeResponse); + } + return obj; + }, + + create(base?: DeepPartial): HistoricalExecuteResponse { + return HistoricalExecuteResponse.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): HistoricalExecuteResponse { + const message = createBaseHistoricalExecuteResponse(); + message.actionDigest = (object.actionDigest !== undefined && object.actionDigest !== null) + ? Digest.fromPartial(object.actionDigest) + : undefined; + message.executeResponse = (object.executeResponse !== undefined && object.executeResponse !== null) + ? ExecuteResponse.fromPartial(object.executeResponse) + : undefined; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create(base?: DeepPartial): T; + fromPartial(object: DeepPartial): T; +} diff --git a/frontend/src/lib/grpc-client/buildbarn/fsac/fsac.ts b/frontend/src/lib/grpc-client/buildbarn/fsac/fsac.ts new file mode 100644 index 00000000..036f2a26 --- /dev/null +++ b/frontend/src/lib/grpc-client/buildbarn/fsac/fsac.ts @@ -0,0 +1,489 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.6.1 +// protoc v3.19.1 +// source: buildbarn/fsac/fsac.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { type CallContext, type CallOptions } from "nice-grpc-common"; +import { + Digest, + DigestFunction_Value, + digestFunction_ValueFromJSON, + digestFunction_ValueToJSON, +} from "../../build/bazel/remote/execution/v2/remote_execution"; +import { Empty } from "../../google/protobuf/empty"; + +export const protobufPackage = "buildbarn.fsac"; + +/** The file system access profile of a build action. */ +export interface FileSystemAccessProfile { + /** + * A Bloom filter that captures paths of regular files and directories + * in the input root whose contents have been read. In case files with + * the same digest are present in the input root multiple times, there + * is no guarantee that all paths are added to the Bloom filter. + * + * This Bloom filter can be used by workers to perform readahead of + * Content Addressable Storage (CAS) objects, thereby reducing the + * probability of execution of actions getting suspended to load data + * over the network. + * + * Hashes are computed by taking the FNV-1a hash of the path in the + * input root, modulo the size of the Bloom filter. The path uses the + * following pattern: + * + * (/${filename})* /* + * + * This means that the root directory uses the empty path. A file + * contained in the root directory may use path "/hello.txt". Between + * [0, k) trailing slashes are added to the path to obtain k + * independent hashes. + * + * The size of the Bloom filter in bits (m) SHOULD be prime. To be + * able to reobtain the exact size in bits, the bits in the final byte + * are terminated with a 1 bit, followed by zero or more 0 bits. + */ + bloomFilter: Uint8Array; + /** + * The number of hash functions (k) that should be considered when + * querying the Bloom filter. + */ + bloomFilterHashFunctions: number; +} + +export interface GetFileSystemAccessProfileRequest { + /** The instance of the execution system to operate against. */ + instanceName: string; + /** The digest function that was used to compute the reduced action digest. */ + digestFunction: DigestFunction_Value; + /** + * The digest of a trimmed down Action message for which a file system + * access profile is requested. This digest is obtained by removing + * all fields from the original Action, except for 'command_digest' + * and 'platform'. + * + * This means that contents of the input root, the Action's timeout + * and the do_not_cache flag are ignored. + */ + reducedActionDigest: Digest | undefined; +} + +export interface UpdateFileSystemAccessProfileRequest { + /** The instance of the execution system to operate against. */ + instanceName: string; + /** The digest function that was used to compute the reduced action digest. */ + digestFunction: DigestFunction_Value; + /** + * The digest of a trimmed down Action message for which a file system + * access profile is being stored. + */ + reducedActionDigest: + | Digest + | undefined; + /** The file system access profile to store. */ + fileSystemAccessProfile: FileSystemAccessProfile | undefined; +} + +function createBaseFileSystemAccessProfile(): FileSystemAccessProfile { + return { bloomFilter: new Uint8Array(0), bloomFilterHashFunctions: 0 }; +} + +export const FileSystemAccessProfile: MessageFns = { + encode(message: FileSystemAccessProfile, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.bloomFilter.length !== 0) { + writer.uint32(10).bytes(message.bloomFilter); + } + if (message.bloomFilterHashFunctions !== 0) { + writer.uint32(16).uint32(message.bloomFilterHashFunctions); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FileSystemAccessProfile { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFileSystemAccessProfile(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.bloomFilter = reader.bytes(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.bloomFilterHashFunctions = reader.uint32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FileSystemAccessProfile { + return { + bloomFilter: isSet(object.bloomFilter) ? bytesFromBase64(object.bloomFilter) : new Uint8Array(0), + bloomFilterHashFunctions: isSet(object.bloomFilterHashFunctions) + ? globalThis.Number(object.bloomFilterHashFunctions) + : 0, + }; + }, + + toJSON(message: FileSystemAccessProfile): unknown { + const obj: any = {}; + if (message.bloomFilter.length !== 0) { + obj.bloomFilter = base64FromBytes(message.bloomFilter); + } + if (message.bloomFilterHashFunctions !== 0) { + obj.bloomFilterHashFunctions = Math.round(message.bloomFilterHashFunctions); + } + return obj; + }, + + create(base?: DeepPartial): FileSystemAccessProfile { + return FileSystemAccessProfile.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): FileSystemAccessProfile { + const message = createBaseFileSystemAccessProfile(); + message.bloomFilter = object.bloomFilter ?? new Uint8Array(0); + message.bloomFilterHashFunctions = object.bloomFilterHashFunctions ?? 0; + return message; + }, +}; + +function createBaseGetFileSystemAccessProfileRequest(): GetFileSystemAccessProfileRequest { + return { instanceName: "", digestFunction: 0, reducedActionDigest: undefined }; +} + +export const GetFileSystemAccessProfileRequest: MessageFns = { + encode(message: GetFileSystemAccessProfileRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.instanceName !== "") { + writer.uint32(10).string(message.instanceName); + } + if (message.digestFunction !== 0) { + writer.uint32(16).int32(message.digestFunction); + } + if (message.reducedActionDigest !== undefined) { + Digest.encode(message.reducedActionDigest, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetFileSystemAccessProfileRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetFileSystemAccessProfileRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.instanceName = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.digestFunction = reader.int32() as any; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.reducedActionDigest = Digest.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetFileSystemAccessProfileRequest { + return { + instanceName: isSet(object.instanceName) ? globalThis.String(object.instanceName) : "", + digestFunction: isSet(object.digestFunction) ? digestFunction_ValueFromJSON(object.digestFunction) : 0, + reducedActionDigest: isSet(object.reducedActionDigest) ? Digest.fromJSON(object.reducedActionDigest) : undefined, + }; + }, + + toJSON(message: GetFileSystemAccessProfileRequest): unknown { + const obj: any = {}; + if (message.instanceName !== "") { + obj.instanceName = message.instanceName; + } + if (message.digestFunction !== 0) { + obj.digestFunction = digestFunction_ValueToJSON(message.digestFunction); + } + if (message.reducedActionDigest !== undefined) { + obj.reducedActionDigest = Digest.toJSON(message.reducedActionDigest); + } + return obj; + }, + + create(base?: DeepPartial): GetFileSystemAccessProfileRequest { + return GetFileSystemAccessProfileRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): GetFileSystemAccessProfileRequest { + const message = createBaseGetFileSystemAccessProfileRequest(); + message.instanceName = object.instanceName ?? ""; + message.digestFunction = object.digestFunction ?? 0; + message.reducedActionDigest = (object.reducedActionDigest !== undefined && object.reducedActionDigest !== null) + ? Digest.fromPartial(object.reducedActionDigest) + : undefined; + return message; + }, +}; + +function createBaseUpdateFileSystemAccessProfileRequest(): UpdateFileSystemAccessProfileRequest { + return { instanceName: "", digestFunction: 0, reducedActionDigest: undefined, fileSystemAccessProfile: undefined }; +} + +export const UpdateFileSystemAccessProfileRequest: MessageFns = { + encode(message: UpdateFileSystemAccessProfileRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.instanceName !== "") { + writer.uint32(10).string(message.instanceName); + } + if (message.digestFunction !== 0) { + writer.uint32(16).int32(message.digestFunction); + } + if (message.reducedActionDigest !== undefined) { + Digest.encode(message.reducedActionDigest, writer.uint32(26).fork()).join(); + } + if (message.fileSystemAccessProfile !== undefined) { + FileSystemAccessProfile.encode(message.fileSystemAccessProfile, writer.uint32(34).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): UpdateFileSystemAccessProfileRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUpdateFileSystemAccessProfileRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.instanceName = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.digestFunction = reader.int32() as any; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.reducedActionDigest = Digest.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.fileSystemAccessProfile = FileSystemAccessProfile.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): UpdateFileSystemAccessProfileRequest { + return { + instanceName: isSet(object.instanceName) ? globalThis.String(object.instanceName) : "", + digestFunction: isSet(object.digestFunction) ? digestFunction_ValueFromJSON(object.digestFunction) : 0, + reducedActionDigest: isSet(object.reducedActionDigest) ? Digest.fromJSON(object.reducedActionDigest) : undefined, + fileSystemAccessProfile: isSet(object.fileSystemAccessProfile) + ? FileSystemAccessProfile.fromJSON(object.fileSystemAccessProfile) + : undefined, + }; + }, + + toJSON(message: UpdateFileSystemAccessProfileRequest): unknown { + const obj: any = {}; + if (message.instanceName !== "") { + obj.instanceName = message.instanceName; + } + if (message.digestFunction !== 0) { + obj.digestFunction = digestFunction_ValueToJSON(message.digestFunction); + } + if (message.reducedActionDigest !== undefined) { + obj.reducedActionDigest = Digest.toJSON(message.reducedActionDigest); + } + if (message.fileSystemAccessProfile !== undefined) { + obj.fileSystemAccessProfile = FileSystemAccessProfile.toJSON(message.fileSystemAccessProfile); + } + return obj; + }, + + create(base?: DeepPartial): UpdateFileSystemAccessProfileRequest { + return UpdateFileSystemAccessProfileRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): UpdateFileSystemAccessProfileRequest { + const message = createBaseUpdateFileSystemAccessProfileRequest(); + message.instanceName = object.instanceName ?? ""; + message.digestFunction = object.digestFunction ?? 0; + message.reducedActionDigest = (object.reducedActionDigest !== undefined && object.reducedActionDigest !== null) + ? Digest.fromPartial(object.reducedActionDigest) + : undefined; + message.fileSystemAccessProfile = + (object.fileSystemAccessProfile !== undefined && object.fileSystemAccessProfile !== null) + ? FileSystemAccessProfile.fromPartial(object.fileSystemAccessProfile) + : undefined; + return message; + }, +}; + +/** + * The File System Access Cache (FSAC) is a Buildbarn specific data + * store that workers can use to store information on how build actions + * access the data stored in the input root. This information can be + * used during subsequent executions of similar actions to speed up file + * system access. + */ +export type FileSystemAccessCacheDefinition = typeof FileSystemAccessCacheDefinition; +export const FileSystemAccessCacheDefinition = { + name: "FileSystemAccessCache", + fullName: "buildbarn.fsac.FileSystemAccessCache", + methods: { + /** + * GetFileSystemAccessProfile() reads a single FileSystemAccessProfile + * from the FSAC. + */ + getFileSystemAccessProfile: { + name: "GetFileSystemAccessProfile", + requestType: GetFileSystemAccessProfileRequest, + requestStream: false, + responseType: FileSystemAccessProfile, + responseStream: false, + options: {}, + }, + /** + * UpdateFileSystemAccessProfile() writes a single + * FileSystemAccessProfile message into the FSAC. + */ + updateFileSystemAccessProfile: { + name: "UpdateFileSystemAccessProfile", + requestType: UpdateFileSystemAccessProfileRequest, + requestStream: false, + responseType: Empty, + responseStream: false, + options: {}, + }, + }, +} as const; + +export interface FileSystemAccessCacheServiceImplementation { + /** + * GetFileSystemAccessProfile() reads a single FileSystemAccessProfile + * from the FSAC. + */ + getFileSystemAccessProfile( + request: GetFileSystemAccessProfileRequest, + context: CallContext & CallContextExt, + ): Promise>; + /** + * UpdateFileSystemAccessProfile() writes a single + * FileSystemAccessProfile message into the FSAC. + */ + updateFileSystemAccessProfile( + request: UpdateFileSystemAccessProfileRequest, + context: CallContext & CallContextExt, + ): Promise>; +} + +export interface FileSystemAccessCacheClient { + /** + * GetFileSystemAccessProfile() reads a single FileSystemAccessProfile + * from the FSAC. + */ + getFileSystemAccessProfile( + request: DeepPartial, + options?: CallOptions & CallOptionsExt, + ): Promise; + /** + * UpdateFileSystemAccessProfile() writes a single + * FileSystemAccessProfile message into the FSAC. + */ + updateFileSystemAccessProfile( + request: DeepPartial, + options?: CallOptions & CallOptionsExt, + ): Promise; +} + +function bytesFromBase64(b64: string): Uint8Array { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; +} + +function base64FromBytes(arr: Uint8Array): string { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create(base?: DeepPartial): T; + fromPartial(object: DeepPartial): T; +} diff --git a/frontend/src/lib/grpc-client/buildbarn/iscc/iscc.ts b/frontend/src/lib/grpc-client/buildbarn/iscc/iscc.ts new file mode 100644 index 00000000..f7653cf5 --- /dev/null +++ b/frontend/src/lib/grpc-client/buildbarn/iscc/iscc.ts @@ -0,0 +1,788 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.6.1 +// protoc v3.19.1 +// source: buildbarn/iscc/iscc.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { type CallContext, type CallOptions } from "nice-grpc-common"; +import { + Digest, + DigestFunction_Value, + digestFunction_ValueFromJSON, + digestFunction_ValueToJSON, +} from "../../build/bazel/remote/execution/v2/remote_execution"; +import { Duration } from "../../google/protobuf/duration"; +import { Empty } from "../../google/protobuf/empty"; +import { Timestamp } from "../../google/protobuf/timestamp"; + +export const protobufPackage = "buildbarn.iscc"; + +/** The outcome of a single action at some point in the past. */ +export interface PreviousExecution { + /** Execution failed with an error. */ + failed?: + | Empty + | undefined; + /** Execution failed due to a timeout. The timeout value is stored. */ + timedOut?: + | Duration + | undefined; + /** Execution succeeded. The virtual execution duration is stored. */ + succeeded?: Duration | undefined; +} + +/** Outcomes of actions for a given size class. */ +export interface PerSizeClassStats { + /** + * The most recent outcomes for this size class, where the last entry + * corresponds to the most recent one. + */ + previousExecutions: PreviousExecution[]; + /** + * An initial probability value to be used for PageRank computation. + * These values may correspond to outcomes of previous PageRank + * computations. Reloading them may make it possible to recompute + * future PageRank probabilities values more quickly. + */ + initialPageRankProbability: number; +} + +export interface PreviousExecutionStats { + /** Outcomes of previous executions of actions, per size class. */ + sizeClasses: { [key: number]: PerSizeClassStats }; + /** The time at which this action failed on the largest size class. */ + lastSeenFailure: Date | undefined; +} + +export interface PreviousExecutionStats_SizeClassesEntry { + key: number; + value: PerSizeClassStats | undefined; +} + +export interface GetPreviousExecutionStatsRequest { + /** The instance of the execution system to operate against. */ + instanceName: string; + /** + * The digest of a trimmed down Action message for which statistics + * are requested. This digest is obtained by removing all fields from + * the original Action, except for 'command_digest' and 'platform'. + * + * This means that contents of the input root, the Action's timeout + * and the do_not_cache flag are ignored. + */ + reducedActionDigest: + | Digest + | undefined; + /** The digest function that was used to compute the reduced action digest. */ + digestFunction: DigestFunction_Value; +} + +export interface UpdatePreviousExecutionStatsRequest { + /** The instance of the execution system to operate against. */ + instanceName: string; + /** + * The digest of a trimmed down Action message for which statistics + * are being stored. + */ + reducedActionDigest: + | Digest + | undefined; + /** The statistics to store. */ + previousExecutionStats: + | PreviousExecutionStats + | undefined; + /** The digest function that was used to compute the reduced action digest. */ + digestFunction: DigestFunction_Value; +} + +function createBasePreviousExecution(): PreviousExecution { + return { failed: undefined, timedOut: undefined, succeeded: undefined }; +} + +export const PreviousExecution: MessageFns = { + encode(message: PreviousExecution, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.failed !== undefined) { + Empty.encode(message.failed, writer.uint32(10).fork()).join(); + } + if (message.timedOut !== undefined) { + Duration.encode(message.timedOut, writer.uint32(18).fork()).join(); + } + if (message.succeeded !== undefined) { + Duration.encode(message.succeeded, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PreviousExecution { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePreviousExecution(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.failed = Empty.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.timedOut = Duration.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.succeeded = Duration.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PreviousExecution { + return { + failed: isSet(object.failed) ? Empty.fromJSON(object.failed) : undefined, + timedOut: isSet(object.timedOut) ? Duration.fromJSON(object.timedOut) : undefined, + succeeded: isSet(object.succeeded) ? Duration.fromJSON(object.succeeded) : undefined, + }; + }, + + toJSON(message: PreviousExecution): unknown { + const obj: any = {}; + if (message.failed !== undefined) { + obj.failed = Empty.toJSON(message.failed); + } + if (message.timedOut !== undefined) { + obj.timedOut = Duration.toJSON(message.timedOut); + } + if (message.succeeded !== undefined) { + obj.succeeded = Duration.toJSON(message.succeeded); + } + return obj; + }, + + create(base?: DeepPartial): PreviousExecution { + return PreviousExecution.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): PreviousExecution { + const message = createBasePreviousExecution(); + message.failed = (object.failed !== undefined && object.failed !== null) + ? Empty.fromPartial(object.failed) + : undefined; + message.timedOut = (object.timedOut !== undefined && object.timedOut !== null) + ? Duration.fromPartial(object.timedOut) + : undefined; + message.succeeded = (object.succeeded !== undefined && object.succeeded !== null) + ? Duration.fromPartial(object.succeeded) + : undefined; + return message; + }, +}; + +function createBasePerSizeClassStats(): PerSizeClassStats { + return { previousExecutions: [], initialPageRankProbability: 0 }; +} + +export const PerSizeClassStats: MessageFns = { + encode(message: PerSizeClassStats, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.previousExecutions) { + PreviousExecution.encode(v!, writer.uint32(10).fork()).join(); + } + if (message.initialPageRankProbability !== 0) { + writer.uint32(25).double(message.initialPageRankProbability); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PerSizeClassStats { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePerSizeClassStats(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.previousExecutions.push(PreviousExecution.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 25) { + break; + } + + message.initialPageRankProbability = reader.double(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PerSizeClassStats { + return { + previousExecutions: globalThis.Array.isArray(object?.previousExecutions) + ? object.previousExecutions.map((e: any) => PreviousExecution.fromJSON(e)) + : [], + initialPageRankProbability: isSet(object.initialPageRankProbability) + ? globalThis.Number(object.initialPageRankProbability) + : 0, + }; + }, + + toJSON(message: PerSizeClassStats): unknown { + const obj: any = {}; + if (message.previousExecutions?.length) { + obj.previousExecutions = message.previousExecutions.map((e) => PreviousExecution.toJSON(e)); + } + if (message.initialPageRankProbability !== 0) { + obj.initialPageRankProbability = message.initialPageRankProbability; + } + return obj; + }, + + create(base?: DeepPartial): PerSizeClassStats { + return PerSizeClassStats.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): PerSizeClassStats { + const message = createBasePerSizeClassStats(); + message.previousExecutions = object.previousExecutions?.map((e) => PreviousExecution.fromPartial(e)) || []; + message.initialPageRankProbability = object.initialPageRankProbability ?? 0; + return message; + }, +}; + +function createBasePreviousExecutionStats(): PreviousExecutionStats { + return { sizeClasses: {}, lastSeenFailure: undefined }; +} + +export const PreviousExecutionStats: MessageFns = { + encode(message: PreviousExecutionStats, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + Object.entries(message.sizeClasses).forEach(([key, value]) => { + PreviousExecutionStats_SizeClassesEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).join(); + }); + if (message.lastSeenFailure !== undefined) { + Timestamp.encode(toTimestamp(message.lastSeenFailure), writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PreviousExecutionStats { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePreviousExecutionStats(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + const entry1 = PreviousExecutionStats_SizeClassesEntry.decode(reader, reader.uint32()); + if (entry1.value !== undefined) { + message.sizeClasses[entry1.key] = entry1.value; + } + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.lastSeenFailure = fromTimestamp(Timestamp.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PreviousExecutionStats { + return { + sizeClasses: isObject(object.sizeClasses) + ? Object.entries(object.sizeClasses).reduce<{ [key: number]: PerSizeClassStats }>((acc, [key, value]) => { + acc[globalThis.Number(key)] = PerSizeClassStats.fromJSON(value); + return acc; + }, {}) + : {}, + lastSeenFailure: isSet(object.lastSeenFailure) ? fromJsonTimestamp(object.lastSeenFailure) : undefined, + }; + }, + + toJSON(message: PreviousExecutionStats): unknown { + const obj: any = {}; + if (message.sizeClasses) { + const entries = Object.entries(message.sizeClasses); + if (entries.length > 0) { + obj.sizeClasses = {}; + entries.forEach(([k, v]) => { + obj.sizeClasses[k] = PerSizeClassStats.toJSON(v); + }); + } + } + if (message.lastSeenFailure !== undefined) { + obj.lastSeenFailure = message.lastSeenFailure.toISOString(); + } + return obj; + }, + + create(base?: DeepPartial): PreviousExecutionStats { + return PreviousExecutionStats.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): PreviousExecutionStats { + const message = createBasePreviousExecutionStats(); + message.sizeClasses = Object.entries(object.sizeClasses ?? {}).reduce<{ [key: number]: PerSizeClassStats }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[globalThis.Number(key)] = PerSizeClassStats.fromPartial(value); + } + return acc; + }, + {}, + ); + message.lastSeenFailure = object.lastSeenFailure ?? undefined; + return message; + }, +}; + +function createBasePreviousExecutionStats_SizeClassesEntry(): PreviousExecutionStats_SizeClassesEntry { + return { key: 0, value: undefined }; +} + +export const PreviousExecutionStats_SizeClassesEntry: MessageFns = { + encode(message: PreviousExecutionStats_SizeClassesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== 0) { + writer.uint32(8).uint32(message.key); + } + if (message.value !== undefined) { + PerSizeClassStats.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PreviousExecutionStats_SizeClassesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePreviousExecutionStats_SizeClassesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.key = reader.uint32(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = PerSizeClassStats.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PreviousExecutionStats_SizeClassesEntry { + return { + key: isSet(object.key) ? globalThis.Number(object.key) : 0, + value: isSet(object.value) ? PerSizeClassStats.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: PreviousExecutionStats_SizeClassesEntry): unknown { + const obj: any = {}; + if (message.key !== 0) { + obj.key = Math.round(message.key); + } + if (message.value !== undefined) { + obj.value = PerSizeClassStats.toJSON(message.value); + } + return obj; + }, + + create(base?: DeepPartial): PreviousExecutionStats_SizeClassesEntry { + return PreviousExecutionStats_SizeClassesEntry.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): PreviousExecutionStats_SizeClassesEntry { + const message = createBasePreviousExecutionStats_SizeClassesEntry(); + message.key = object.key ?? 0; + message.value = (object.value !== undefined && object.value !== null) + ? PerSizeClassStats.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseGetPreviousExecutionStatsRequest(): GetPreviousExecutionStatsRequest { + return { instanceName: "", reducedActionDigest: undefined, digestFunction: 0 }; +} + +export const GetPreviousExecutionStatsRequest: MessageFns = { + encode(message: GetPreviousExecutionStatsRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.instanceName !== "") { + writer.uint32(10).string(message.instanceName); + } + if (message.reducedActionDigest !== undefined) { + Digest.encode(message.reducedActionDigest, writer.uint32(18).fork()).join(); + } + if (message.digestFunction !== 0) { + writer.uint32(24).int32(message.digestFunction); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetPreviousExecutionStatsRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetPreviousExecutionStatsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.instanceName = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.reducedActionDigest = Digest.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.digestFunction = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetPreviousExecutionStatsRequest { + return { + instanceName: isSet(object.instanceName) ? globalThis.String(object.instanceName) : "", + reducedActionDigest: isSet(object.reducedActionDigest) ? Digest.fromJSON(object.reducedActionDigest) : undefined, + digestFunction: isSet(object.digestFunction) ? digestFunction_ValueFromJSON(object.digestFunction) : 0, + }; + }, + + toJSON(message: GetPreviousExecutionStatsRequest): unknown { + const obj: any = {}; + if (message.instanceName !== "") { + obj.instanceName = message.instanceName; + } + if (message.reducedActionDigest !== undefined) { + obj.reducedActionDigest = Digest.toJSON(message.reducedActionDigest); + } + if (message.digestFunction !== 0) { + obj.digestFunction = digestFunction_ValueToJSON(message.digestFunction); + } + return obj; + }, + + create(base?: DeepPartial): GetPreviousExecutionStatsRequest { + return GetPreviousExecutionStatsRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): GetPreviousExecutionStatsRequest { + const message = createBaseGetPreviousExecutionStatsRequest(); + message.instanceName = object.instanceName ?? ""; + message.reducedActionDigest = (object.reducedActionDigest !== undefined && object.reducedActionDigest !== null) + ? Digest.fromPartial(object.reducedActionDigest) + : undefined; + message.digestFunction = object.digestFunction ?? 0; + return message; + }, +}; + +function createBaseUpdatePreviousExecutionStatsRequest(): UpdatePreviousExecutionStatsRequest { + return { instanceName: "", reducedActionDigest: undefined, previousExecutionStats: undefined, digestFunction: 0 }; +} + +export const UpdatePreviousExecutionStatsRequest: MessageFns = { + encode(message: UpdatePreviousExecutionStatsRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.instanceName !== "") { + writer.uint32(10).string(message.instanceName); + } + if (message.reducedActionDigest !== undefined) { + Digest.encode(message.reducedActionDigest, writer.uint32(18).fork()).join(); + } + if (message.previousExecutionStats !== undefined) { + PreviousExecutionStats.encode(message.previousExecutionStats, writer.uint32(26).fork()).join(); + } + if (message.digestFunction !== 0) { + writer.uint32(32).int32(message.digestFunction); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): UpdatePreviousExecutionStatsRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUpdatePreviousExecutionStatsRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.instanceName = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.reducedActionDigest = Digest.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.previousExecutionStats = PreviousExecutionStats.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.digestFunction = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): UpdatePreviousExecutionStatsRequest { + return { + instanceName: isSet(object.instanceName) ? globalThis.String(object.instanceName) : "", + reducedActionDigest: isSet(object.reducedActionDigest) ? Digest.fromJSON(object.reducedActionDigest) : undefined, + previousExecutionStats: isSet(object.previousExecutionStats) + ? PreviousExecutionStats.fromJSON(object.previousExecutionStats) + : undefined, + digestFunction: isSet(object.digestFunction) ? digestFunction_ValueFromJSON(object.digestFunction) : 0, + }; + }, + + toJSON(message: UpdatePreviousExecutionStatsRequest): unknown { + const obj: any = {}; + if (message.instanceName !== "") { + obj.instanceName = message.instanceName; + } + if (message.reducedActionDigest !== undefined) { + obj.reducedActionDigest = Digest.toJSON(message.reducedActionDigest); + } + if (message.previousExecutionStats !== undefined) { + obj.previousExecutionStats = PreviousExecutionStats.toJSON(message.previousExecutionStats); + } + if (message.digestFunction !== 0) { + obj.digestFunction = digestFunction_ValueToJSON(message.digestFunction); + } + return obj; + }, + + create(base?: DeepPartial): UpdatePreviousExecutionStatsRequest { + return UpdatePreviousExecutionStatsRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): UpdatePreviousExecutionStatsRequest { + const message = createBaseUpdatePreviousExecutionStatsRequest(); + message.instanceName = object.instanceName ?? ""; + message.reducedActionDigest = (object.reducedActionDigest !== undefined && object.reducedActionDigest !== null) + ? Digest.fromPartial(object.reducedActionDigest) + : undefined; + message.previousExecutionStats = + (object.previousExecutionStats !== undefined && object.previousExecutionStats !== null) + ? PreviousExecutionStats.fromPartial(object.previousExecutionStats) + : undefined; + message.digestFunction = object.digestFunction ?? 0; + return message; + }, +}; + +/** + * The Initial Size Class Cache (ISCC) is a data store that can be used + * by bb_scheduler to store outcomes of previous executions of an + * action. This data is then used during successive actions of the same + * shape to pick the initial size class on which the action needs to be + * run. + * + * It generally only makes sense to use this data store in case + * platforms are declared that have multiple size classes. + */ +export type InitialSizeClassCacheDefinition = typeof InitialSizeClassCacheDefinition; +export const InitialSizeClassCacheDefinition = { + name: "InitialSizeClassCache", + fullName: "buildbarn.iscc.InitialSizeClassCache", + methods: { + /** + * GetPreviousExecutionStats() reads a single PreviousExecutionStats + * message from the ISCC. + */ + getPreviousExecutionStats: { + name: "GetPreviousExecutionStats", + requestType: GetPreviousExecutionStatsRequest, + requestStream: false, + responseType: PreviousExecutionStats, + responseStream: false, + options: {}, + }, + /** + * UpdatePreviousExecutionStats() writes a single + * PreviousExecutionStats message to the ISCC. + */ + updatePreviousExecutionStats: { + name: "UpdatePreviousExecutionStats", + requestType: UpdatePreviousExecutionStatsRequest, + requestStream: false, + responseType: Empty, + responseStream: false, + options: {}, + }, + }, +} as const; + +export interface InitialSizeClassCacheServiceImplementation { + /** + * GetPreviousExecutionStats() reads a single PreviousExecutionStats + * message from the ISCC. + */ + getPreviousExecutionStats( + request: GetPreviousExecutionStatsRequest, + context: CallContext & CallContextExt, + ): Promise>; + /** + * UpdatePreviousExecutionStats() writes a single + * PreviousExecutionStats message to the ISCC. + */ + updatePreviousExecutionStats( + request: UpdatePreviousExecutionStatsRequest, + context: CallContext & CallContextExt, + ): Promise>; +} + +export interface InitialSizeClassCacheClient { + /** + * GetPreviousExecutionStats() reads a single PreviousExecutionStats + * message from the ISCC. + */ + getPreviousExecutionStats( + request: DeepPartial, + options?: CallOptions & CallOptionsExt, + ): Promise; + /** + * UpdatePreviousExecutionStats() writes a single + * PreviousExecutionStats message to the ISCC. + */ + updatePreviousExecutionStats( + request: DeepPartial, + options?: CallOptions & CallOptionsExt, + ): Promise; +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function toTimestamp(date: Date): Timestamp { + const seconds = Math.trunc(date.getTime() / 1_000).toString(); + const nanos = (date.getTime() % 1_000) * 1_000_000; + return { seconds, nanos }; +} + +function fromTimestamp(t: Timestamp): Date { + let millis = (globalThis.Number(t.seconds) || 0) * 1_000; + millis += (t.nanos || 0) / 1_000_000; + return new globalThis.Date(millis); +} + +function fromJsonTimestamp(o: any): Date { + if (o instanceof globalThis.Date) { + return o; + } else if (typeof o === "string") { + return new globalThis.Date(o); + } else { + return fromTimestamp(Timestamp.fromJSON(o)); + } +} + +function isObject(value: any): boolean { + return typeof value === "object" && value !== null; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create(base?: DeepPartial): T; + fromPartial(object: DeepPartial): T; +} diff --git a/frontend/src/lib/grpc-client/buildbarn/query/query.ts b/frontend/src/lib/grpc-client/buildbarn/query/query.ts new file mode 100644 index 00000000..588d3b67 --- /dev/null +++ b/frontend/src/lib/grpc-client/buildbarn/query/query.ts @@ -0,0 +1,130 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.6.1 +// protoc v3.19.1 +// source: buildbarn/query/query.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { Digest } from "../../build/bazel/remote/execution/v2/remote_execution"; + +export const protobufPackage = "buildbarn.query"; + +/** + * Reference to a certain directory contained in a + * FileSystemAccessProfile, which is provided as part of bb_browser URL + * query parameters when listing directories. + */ +export interface FileSystemAccessProfileReference { + /** + * The digest of the profile stored in the File System Access Cache + * (FSAC). + */ + digest: + | Digest + | undefined; + /** + * The FNV-1a base hash value of the path hashes corresponding to the + * current directory. + */ + pathHashesBaseHash: string; +} + +function createBaseFileSystemAccessProfileReference(): FileSystemAccessProfileReference { + return { digest: undefined, pathHashesBaseHash: "0" }; +} + +export const FileSystemAccessProfileReference: MessageFns = { + encode(message: FileSystemAccessProfileReference, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.digest !== undefined) { + Digest.encode(message.digest, writer.uint32(10).fork()).join(); + } + if (message.pathHashesBaseHash !== "0") { + writer.uint32(16).uint64(message.pathHashesBaseHash); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FileSystemAccessProfileReference { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFileSystemAccessProfileReference(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.digest = Digest.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.pathHashesBaseHash = reader.uint64().toString(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FileSystemAccessProfileReference { + return { + digest: isSet(object.digest) ? Digest.fromJSON(object.digest) : undefined, + pathHashesBaseHash: isSet(object.pathHashesBaseHash) ? globalThis.String(object.pathHashesBaseHash) : "0", + }; + }, + + toJSON(message: FileSystemAccessProfileReference): unknown { + const obj: any = {}; + if (message.digest !== undefined) { + obj.digest = Digest.toJSON(message.digest); + } + if (message.pathHashesBaseHash !== "0") { + obj.pathHashesBaseHash = message.pathHashesBaseHash; + } + return obj; + }, + + create(base?: DeepPartial): FileSystemAccessProfileReference { + return FileSystemAccessProfileReference.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): FileSystemAccessProfileReference { + const message = createBaseFileSystemAccessProfileReference(); + message.digest = (object.digest !== undefined && object.digest !== null) + ? Digest.fromPartial(object.digest) + : undefined; + message.pathHashesBaseHash = object.pathHashesBaseHash ?? "0"; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create(base?: DeepPartial): T; + fromPartial(object: DeepPartial): T; +} diff --git a/frontend/src/lib/grpc-client/buildbarn/resourceusage/resourceusage.ts b/frontend/src/lib/grpc-client/buildbarn/resourceusage/resourceusage.ts new file mode 100644 index 00000000..1b86d87a --- /dev/null +++ b/frontend/src/lib/grpc-client/buildbarn/resourceusage/resourceusage.ts @@ -0,0 +1,963 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.6.1 +// protoc v3.19.1 +// source: buildbarn/resourceusage/resourceusage.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { Duration } from "../../google/protobuf/duration"; + +export const protobufPackage = "buildbarn.resourceusage"; + +/** + * File pool resource usage statistics. File pools are used by bb_worker + * to allocate temporary files that are created by build actions. + * Temporary files include output files created through the FUSE file + * system. + */ +export interface FilePoolResourceUsage { + /** Total number of files created. */ + filesCreated: string; + /** Maximum number of files that existed at some point in time. */ + filesCountPeak: string; + /** Maximum total size of all files at some point in time. */ + filesSizeBytesPeak: string; + /** Total number of ReadAt() calls performed. */ + readsCount: string; + /** Total amount of data returned by all ReadAt() calls. */ + readsSizeBytes: string; + /** Total number of WriteAt() calls performed. */ + writesCount: string; + /** Total amount of data processed by all WriteAt() calls. */ + writesSizeBytes: string; + /** Total number of Truncate() calls performed. */ + truncatesCount: string; +} + +/** + * The equivalent of 'struct rusage' in POSIX, generally returned by + * getrusage(2) or wait4(2). + */ +export interface POSIXResourceUsage { + /** ru_utime: Amount of CPU time in seconds spent in userspace. */ + userTime: + | Duration + | undefined; + /** ru_stime: Amount of CPU time in seconds spent in kernelspace. */ + systemTime: + | Duration + | undefined; + /** ru_maxrss: Maximum amount of resident memory in bytes. */ + maximumResidentSetSize: string; + /** ru_minflt: Page reclaims. */ + pageReclaims: string; + /** ru_majflt: Page faults. */ + pageFaults: string; + /** ru_nswap: Number of swaps. */ + swaps: string; + /** ru_inblock: Block input operations. */ + blockInputOperations: string; + /** ru_oublock: Block output operations. */ + blockOutputOperations: string; + /** ru_msgsnd: Messages sent. */ + messagesSent: string; + /** ru_msgrcv: Messages received. */ + messagesReceived: string; + /** ru_nsignals: Signals received. */ + signalsReceived: string; + /** ru_nvcsw: Voluntary context switches. */ + voluntaryContextSwitches: string; + /** ru_nivcsw: Involuntary context switches. */ + involuntaryContextSwitches: string; + /** + * If abnormal process termination occurred, the name of the signal + * that was delivered, without the "SIG" prefix (e.g., "BUS", "KILL", + * "SEGV"). + * + * Abnormal process termination can occur by calling abort(), or by + * receiving a signal for which no signal handler is installed. + */ + terminationSignal: string; +} + +/** + * A representation of unique factors that may be aggregated to + * compute a given build action's total price. + */ +export interface MonetaryResourceUsage { + /** A mapping of expense categories to their respective costs. */ + expenses: { [key: string]: MonetaryResourceUsage_Expense }; +} + +export interface MonetaryResourceUsage_Expense { + /** + * The type of currency the cost is measured in. Required to be in + * ISO 4217 format: https://en.wikipedia.org/wiki/ISO_4217#Active_codes + */ + currency: string; + /** The value of a specific expense for a build action. */ + cost: number; +} + +export interface MonetaryResourceUsage_ExpensesEntry { + key: string; + value: MonetaryResourceUsage_Expense | undefined; +} + +/** + * Input root resource usage statistics. These statistics indicate how + * many directories and files inside the virtual file system were + * accessed. These statistics are only reported if prefetching is + * enabled, as they are computed together with the Bloom filter. + */ +export interface InputRootResourceUsage { + /** + * The number of directories in the input root that have been + * resolved. This equates to the total number of directories that are + * present in all directories that have been read. + */ + directoriesResolved: string; + /** + * The number of directories whose contents have been read from the + * Content Addressable Storage (CAS). + */ + directoriesRead: string; + /** + * The number of files whose contents have been read from the Content + * Addressable Storage (CAS). + */ + filesRead: string; +} + +function createBaseFilePoolResourceUsage(): FilePoolResourceUsage { + return { + filesCreated: "0", + filesCountPeak: "0", + filesSizeBytesPeak: "0", + readsCount: "0", + readsSizeBytes: "0", + writesCount: "0", + writesSizeBytes: "0", + truncatesCount: "0", + }; +} + +export const FilePoolResourceUsage: MessageFns = { + encode(message: FilePoolResourceUsage, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.filesCreated !== "0") { + writer.uint32(8).uint64(message.filesCreated); + } + if (message.filesCountPeak !== "0") { + writer.uint32(16).uint64(message.filesCountPeak); + } + if (message.filesSizeBytesPeak !== "0") { + writer.uint32(24).uint64(message.filesSizeBytesPeak); + } + if (message.readsCount !== "0") { + writer.uint32(32).uint64(message.readsCount); + } + if (message.readsSizeBytes !== "0") { + writer.uint32(40).uint64(message.readsSizeBytes); + } + if (message.writesCount !== "0") { + writer.uint32(48).uint64(message.writesCount); + } + if (message.writesSizeBytes !== "0") { + writer.uint32(56).uint64(message.writesSizeBytes); + } + if (message.truncatesCount !== "0") { + writer.uint32(64).uint64(message.truncatesCount); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FilePoolResourceUsage { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFilePoolResourceUsage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.filesCreated = reader.uint64().toString(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.filesCountPeak = reader.uint64().toString(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.filesSizeBytesPeak = reader.uint64().toString(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.readsCount = reader.uint64().toString(); + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.readsSizeBytes = reader.uint64().toString(); + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.writesCount = reader.uint64().toString(); + continue; + } + case 7: { + if (tag !== 56) { + break; + } + + message.writesSizeBytes = reader.uint64().toString(); + continue; + } + case 8: { + if (tag !== 64) { + break; + } + + message.truncatesCount = reader.uint64().toString(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FilePoolResourceUsage { + return { + filesCreated: isSet(object.filesCreated) ? globalThis.String(object.filesCreated) : "0", + filesCountPeak: isSet(object.filesCountPeak) ? globalThis.String(object.filesCountPeak) : "0", + filesSizeBytesPeak: isSet(object.filesSizeBytesPeak) ? globalThis.String(object.filesSizeBytesPeak) : "0", + readsCount: isSet(object.readsCount) ? globalThis.String(object.readsCount) : "0", + readsSizeBytes: isSet(object.readsSizeBytes) ? globalThis.String(object.readsSizeBytes) : "0", + writesCount: isSet(object.writesCount) ? globalThis.String(object.writesCount) : "0", + writesSizeBytes: isSet(object.writesSizeBytes) ? globalThis.String(object.writesSizeBytes) : "0", + truncatesCount: isSet(object.truncatesCount) ? globalThis.String(object.truncatesCount) : "0", + }; + }, + + toJSON(message: FilePoolResourceUsage): unknown { + const obj: any = {}; + if (message.filesCreated !== "0") { + obj.filesCreated = message.filesCreated; + } + if (message.filesCountPeak !== "0") { + obj.filesCountPeak = message.filesCountPeak; + } + if (message.filesSizeBytesPeak !== "0") { + obj.filesSizeBytesPeak = message.filesSizeBytesPeak; + } + if (message.readsCount !== "0") { + obj.readsCount = message.readsCount; + } + if (message.readsSizeBytes !== "0") { + obj.readsSizeBytes = message.readsSizeBytes; + } + if (message.writesCount !== "0") { + obj.writesCount = message.writesCount; + } + if (message.writesSizeBytes !== "0") { + obj.writesSizeBytes = message.writesSizeBytes; + } + if (message.truncatesCount !== "0") { + obj.truncatesCount = message.truncatesCount; + } + return obj; + }, + + create(base?: DeepPartial): FilePoolResourceUsage { + return FilePoolResourceUsage.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): FilePoolResourceUsage { + const message = createBaseFilePoolResourceUsage(); + message.filesCreated = object.filesCreated ?? "0"; + message.filesCountPeak = object.filesCountPeak ?? "0"; + message.filesSizeBytesPeak = object.filesSizeBytesPeak ?? "0"; + message.readsCount = object.readsCount ?? "0"; + message.readsSizeBytes = object.readsSizeBytes ?? "0"; + message.writesCount = object.writesCount ?? "0"; + message.writesSizeBytes = object.writesSizeBytes ?? "0"; + message.truncatesCount = object.truncatesCount ?? "0"; + return message; + }, +}; + +function createBasePOSIXResourceUsage(): POSIXResourceUsage { + return { + userTime: undefined, + systemTime: undefined, + maximumResidentSetSize: "0", + pageReclaims: "0", + pageFaults: "0", + swaps: "0", + blockInputOperations: "0", + blockOutputOperations: "0", + messagesSent: "0", + messagesReceived: "0", + signalsReceived: "0", + voluntaryContextSwitches: "0", + involuntaryContextSwitches: "0", + terminationSignal: "", + }; +} + +export const POSIXResourceUsage: MessageFns = { + encode(message: POSIXResourceUsage, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.userTime !== undefined) { + Duration.encode(message.userTime, writer.uint32(10).fork()).join(); + } + if (message.systemTime !== undefined) { + Duration.encode(message.systemTime, writer.uint32(18).fork()).join(); + } + if (message.maximumResidentSetSize !== "0") { + writer.uint32(24).int64(message.maximumResidentSetSize); + } + if (message.pageReclaims !== "0") { + writer.uint32(56).int64(message.pageReclaims); + } + if (message.pageFaults !== "0") { + writer.uint32(64).int64(message.pageFaults); + } + if (message.swaps !== "0") { + writer.uint32(72).int64(message.swaps); + } + if (message.blockInputOperations !== "0") { + writer.uint32(80).int64(message.blockInputOperations); + } + if (message.blockOutputOperations !== "0") { + writer.uint32(88).int64(message.blockOutputOperations); + } + if (message.messagesSent !== "0") { + writer.uint32(96).int64(message.messagesSent); + } + if (message.messagesReceived !== "0") { + writer.uint32(104).int64(message.messagesReceived); + } + if (message.signalsReceived !== "0") { + writer.uint32(112).int64(message.signalsReceived); + } + if (message.voluntaryContextSwitches !== "0") { + writer.uint32(120).int64(message.voluntaryContextSwitches); + } + if (message.involuntaryContextSwitches !== "0") { + writer.uint32(128).int64(message.involuntaryContextSwitches); + } + if (message.terminationSignal !== "") { + writer.uint32(138).string(message.terminationSignal); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): POSIXResourceUsage { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePOSIXResourceUsage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.userTime = Duration.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.systemTime = Duration.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.maximumResidentSetSize = reader.int64().toString(); + continue; + } + case 7: { + if (tag !== 56) { + break; + } + + message.pageReclaims = reader.int64().toString(); + continue; + } + case 8: { + if (tag !== 64) { + break; + } + + message.pageFaults = reader.int64().toString(); + continue; + } + case 9: { + if (tag !== 72) { + break; + } + + message.swaps = reader.int64().toString(); + continue; + } + case 10: { + if (tag !== 80) { + break; + } + + message.blockInputOperations = reader.int64().toString(); + continue; + } + case 11: { + if (tag !== 88) { + break; + } + + message.blockOutputOperations = reader.int64().toString(); + continue; + } + case 12: { + if (tag !== 96) { + break; + } + + message.messagesSent = reader.int64().toString(); + continue; + } + case 13: { + if (tag !== 104) { + break; + } + + message.messagesReceived = reader.int64().toString(); + continue; + } + case 14: { + if (tag !== 112) { + break; + } + + message.signalsReceived = reader.int64().toString(); + continue; + } + case 15: { + if (tag !== 120) { + break; + } + + message.voluntaryContextSwitches = reader.int64().toString(); + continue; + } + case 16: { + if (tag !== 128) { + break; + } + + message.involuntaryContextSwitches = reader.int64().toString(); + continue; + } + case 17: { + if (tag !== 138) { + break; + } + + message.terminationSignal = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): POSIXResourceUsage { + return { + userTime: isSet(object.userTime) ? Duration.fromJSON(object.userTime) : undefined, + systemTime: isSet(object.systemTime) ? Duration.fromJSON(object.systemTime) : undefined, + maximumResidentSetSize: isSet(object.maximumResidentSetSize) + ? globalThis.String(object.maximumResidentSetSize) + : "0", + pageReclaims: isSet(object.pageReclaims) ? globalThis.String(object.pageReclaims) : "0", + pageFaults: isSet(object.pageFaults) ? globalThis.String(object.pageFaults) : "0", + swaps: isSet(object.swaps) ? globalThis.String(object.swaps) : "0", + blockInputOperations: isSet(object.blockInputOperations) ? globalThis.String(object.blockInputOperations) : "0", + blockOutputOperations: isSet(object.blockOutputOperations) + ? globalThis.String(object.blockOutputOperations) + : "0", + messagesSent: isSet(object.messagesSent) ? globalThis.String(object.messagesSent) : "0", + messagesReceived: isSet(object.messagesReceived) ? globalThis.String(object.messagesReceived) : "0", + signalsReceived: isSet(object.signalsReceived) ? globalThis.String(object.signalsReceived) : "0", + voluntaryContextSwitches: isSet(object.voluntaryContextSwitches) + ? globalThis.String(object.voluntaryContextSwitches) + : "0", + involuntaryContextSwitches: isSet(object.involuntaryContextSwitches) + ? globalThis.String(object.involuntaryContextSwitches) + : "0", + terminationSignal: isSet(object.terminationSignal) ? globalThis.String(object.terminationSignal) : "", + }; + }, + + toJSON(message: POSIXResourceUsage): unknown { + const obj: any = {}; + if (message.userTime !== undefined) { + obj.userTime = Duration.toJSON(message.userTime); + } + if (message.systemTime !== undefined) { + obj.systemTime = Duration.toJSON(message.systemTime); + } + if (message.maximumResidentSetSize !== "0") { + obj.maximumResidentSetSize = message.maximumResidentSetSize; + } + if (message.pageReclaims !== "0") { + obj.pageReclaims = message.pageReclaims; + } + if (message.pageFaults !== "0") { + obj.pageFaults = message.pageFaults; + } + if (message.swaps !== "0") { + obj.swaps = message.swaps; + } + if (message.blockInputOperations !== "0") { + obj.blockInputOperations = message.blockInputOperations; + } + if (message.blockOutputOperations !== "0") { + obj.blockOutputOperations = message.blockOutputOperations; + } + if (message.messagesSent !== "0") { + obj.messagesSent = message.messagesSent; + } + if (message.messagesReceived !== "0") { + obj.messagesReceived = message.messagesReceived; + } + if (message.signalsReceived !== "0") { + obj.signalsReceived = message.signalsReceived; + } + if (message.voluntaryContextSwitches !== "0") { + obj.voluntaryContextSwitches = message.voluntaryContextSwitches; + } + if (message.involuntaryContextSwitches !== "0") { + obj.involuntaryContextSwitches = message.involuntaryContextSwitches; + } + if (message.terminationSignal !== "") { + obj.terminationSignal = message.terminationSignal; + } + return obj; + }, + + create(base?: DeepPartial): POSIXResourceUsage { + return POSIXResourceUsage.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): POSIXResourceUsage { + const message = createBasePOSIXResourceUsage(); + message.userTime = (object.userTime !== undefined && object.userTime !== null) + ? Duration.fromPartial(object.userTime) + : undefined; + message.systemTime = (object.systemTime !== undefined && object.systemTime !== null) + ? Duration.fromPartial(object.systemTime) + : undefined; + message.maximumResidentSetSize = object.maximumResidentSetSize ?? "0"; + message.pageReclaims = object.pageReclaims ?? "0"; + message.pageFaults = object.pageFaults ?? "0"; + message.swaps = object.swaps ?? "0"; + message.blockInputOperations = object.blockInputOperations ?? "0"; + message.blockOutputOperations = object.blockOutputOperations ?? "0"; + message.messagesSent = object.messagesSent ?? "0"; + message.messagesReceived = object.messagesReceived ?? "0"; + message.signalsReceived = object.signalsReceived ?? "0"; + message.voluntaryContextSwitches = object.voluntaryContextSwitches ?? "0"; + message.involuntaryContextSwitches = object.involuntaryContextSwitches ?? "0"; + message.terminationSignal = object.terminationSignal ?? ""; + return message; + }, +}; + +function createBaseMonetaryResourceUsage(): MonetaryResourceUsage { + return { expenses: {} }; +} + +export const MonetaryResourceUsage: MessageFns = { + encode(message: MonetaryResourceUsage, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + Object.entries(message.expenses).forEach(([key, value]) => { + MonetaryResourceUsage_ExpensesEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MonetaryResourceUsage { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMonetaryResourceUsage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + const entry1 = MonetaryResourceUsage_ExpensesEntry.decode(reader, reader.uint32()); + if (entry1.value !== undefined) { + message.expenses[entry1.key] = entry1.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MonetaryResourceUsage { + return { + expenses: isObject(object.expenses) + ? Object.entries(object.expenses).reduce<{ [key: string]: MonetaryResourceUsage_Expense }>( + (acc, [key, value]) => { + acc[key] = MonetaryResourceUsage_Expense.fromJSON(value); + return acc; + }, + {}, + ) + : {}, + }; + }, + + toJSON(message: MonetaryResourceUsage): unknown { + const obj: any = {}; + if (message.expenses) { + const entries = Object.entries(message.expenses); + if (entries.length > 0) { + obj.expenses = {}; + entries.forEach(([k, v]) => { + obj.expenses[k] = MonetaryResourceUsage_Expense.toJSON(v); + }); + } + } + return obj; + }, + + create(base?: DeepPartial): MonetaryResourceUsage { + return MonetaryResourceUsage.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): MonetaryResourceUsage { + const message = createBaseMonetaryResourceUsage(); + message.expenses = Object.entries(object.expenses ?? {}).reduce<{ [key: string]: MonetaryResourceUsage_Expense }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = MonetaryResourceUsage_Expense.fromPartial(value); + } + return acc; + }, + {}, + ); + return message; + }, +}; + +function createBaseMonetaryResourceUsage_Expense(): MonetaryResourceUsage_Expense { + return { currency: "", cost: 0 }; +} + +export const MonetaryResourceUsage_Expense: MessageFns = { + encode(message: MonetaryResourceUsage_Expense, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.currency !== "") { + writer.uint32(10).string(message.currency); + } + if (message.cost !== 0) { + writer.uint32(17).double(message.cost); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MonetaryResourceUsage_Expense { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMonetaryResourceUsage_Expense(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.currency = reader.string(); + continue; + } + case 2: { + if (tag !== 17) { + break; + } + + message.cost = reader.double(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MonetaryResourceUsage_Expense { + return { + currency: isSet(object.currency) ? globalThis.String(object.currency) : "", + cost: isSet(object.cost) ? globalThis.Number(object.cost) : 0, + }; + }, + + toJSON(message: MonetaryResourceUsage_Expense): unknown { + const obj: any = {}; + if (message.currency !== "") { + obj.currency = message.currency; + } + if (message.cost !== 0) { + obj.cost = message.cost; + } + return obj; + }, + + create(base?: DeepPartial): MonetaryResourceUsage_Expense { + return MonetaryResourceUsage_Expense.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): MonetaryResourceUsage_Expense { + const message = createBaseMonetaryResourceUsage_Expense(); + message.currency = object.currency ?? ""; + message.cost = object.cost ?? 0; + return message; + }, +}; + +function createBaseMonetaryResourceUsage_ExpensesEntry(): MonetaryResourceUsage_ExpensesEntry { + return { key: "", value: undefined }; +} + +export const MonetaryResourceUsage_ExpensesEntry: MessageFns = { + encode(message: MonetaryResourceUsage_ExpensesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + MonetaryResourceUsage_Expense.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MonetaryResourceUsage_ExpensesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMonetaryResourceUsage_ExpensesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = MonetaryResourceUsage_Expense.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MonetaryResourceUsage_ExpensesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? MonetaryResourceUsage_Expense.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: MonetaryResourceUsage_ExpensesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = MonetaryResourceUsage_Expense.toJSON(message.value); + } + return obj; + }, + + create(base?: DeepPartial): MonetaryResourceUsage_ExpensesEntry { + return MonetaryResourceUsage_ExpensesEntry.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): MonetaryResourceUsage_ExpensesEntry { + const message = createBaseMonetaryResourceUsage_ExpensesEntry(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? MonetaryResourceUsage_Expense.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseInputRootResourceUsage(): InputRootResourceUsage { + return { directoriesResolved: "0", directoriesRead: "0", filesRead: "0" }; +} + +export const InputRootResourceUsage: MessageFns = { + encode(message: InputRootResourceUsage, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.directoriesResolved !== "0") { + writer.uint32(8).uint64(message.directoriesResolved); + } + if (message.directoriesRead !== "0") { + writer.uint32(16).uint64(message.directoriesRead); + } + if (message.filesRead !== "0") { + writer.uint32(24).uint64(message.filesRead); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): InputRootResourceUsage { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseInputRootResourceUsage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.directoriesResolved = reader.uint64().toString(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.directoriesRead = reader.uint64().toString(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.filesRead = reader.uint64().toString(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): InputRootResourceUsage { + return { + directoriesResolved: isSet(object.directoriesResolved) ? globalThis.String(object.directoriesResolved) : "0", + directoriesRead: isSet(object.directoriesRead) ? globalThis.String(object.directoriesRead) : "0", + filesRead: isSet(object.filesRead) ? globalThis.String(object.filesRead) : "0", + }; + }, + + toJSON(message: InputRootResourceUsage): unknown { + const obj: any = {}; + if (message.directoriesResolved !== "0") { + obj.directoriesResolved = message.directoriesResolved; + } + if (message.directoriesRead !== "0") { + obj.directoriesRead = message.directoriesRead; + } + if (message.filesRead !== "0") { + obj.filesRead = message.filesRead; + } + return obj; + }, + + create(base?: DeepPartial): InputRootResourceUsage { + return InputRootResourceUsage.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): InputRootResourceUsage { + const message = createBaseInputRootResourceUsage(); + message.directoriesResolved = object.directoriesResolved ?? "0"; + message.directoriesRead = object.directoriesRead ?? "0"; + message.filesRead = object.filesRead ?? "0"; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function isObject(value: any): boolean { + return typeof value === "object" && value !== null; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create(base?: DeepPartial): T; + fromPartial(object: DeepPartial): T; +} diff --git a/frontend/src/lib/grpc-client/google/bytestream/bytestream.ts b/frontend/src/lib/grpc-client/google/bytestream/bytestream.ts new file mode 100644 index 00000000..0e2efea9 --- /dev/null +++ b/frontend/src/lib/grpc-client/google/bytestream/bytestream.ts @@ -0,0 +1,816 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.6.1 +// protoc v3.19.1 +// source: google/bytestream/bytestream.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { type CallContext, type CallOptions } from "nice-grpc-common"; + +export const protobufPackage = "google.bytestream"; + +/** Request object for ByteStream.Read. */ +export interface ReadRequest { + /** The name of the resource to read. */ + resourceName: string; + /** + * The offset for the first byte to return in the read, relative to the start + * of the resource. + * + * A `read_offset` that is negative or greater than the size of the resource + * will cause an `OUT_OF_RANGE` error. + */ + readOffset: string; + /** + * The maximum number of `data` bytes the server is allowed to return in the + * sum of all `ReadResponse` messages. A `read_limit` of zero indicates that + * there is no limit, and a negative `read_limit` will cause an error. + * + * If the stream returns fewer bytes than allowed by the `read_limit` and no + * error occurred, the stream includes all data from the `read_offset` to the + * end of the resource. + */ + readLimit: string; +} + +/** Response object for ByteStream.Read. */ +export interface ReadResponse { + /** + * A portion of the data for the resource. The service **may** leave `data` + * empty for any given `ReadResponse`. This enables the service to inform the + * client that the request is still live while it is running an operation to + * generate more data. + */ + data: Uint8Array; +} + +/** Request object for ByteStream.Write. */ +export interface WriteRequest { + /** + * The name of the resource to write. This **must** be set on the first + * `WriteRequest` of each `Write()` action. If it is set on subsequent calls, + * it **must** match the value of the first request. + */ + resourceName: string; + /** + * The offset from the beginning of the resource at which the data should be + * written. It is required on all `WriteRequest`s. + * + * In the first `WriteRequest` of a `Write()` action, it indicates + * the initial offset for the `Write()` call. The value **must** be equal to + * the `committed_size` that a call to `QueryWriteStatus()` would return. + * + * On subsequent calls, this value **must** be set and **must** be equal to + * the sum of the first `write_offset` and the sizes of all `data` bundles + * sent previously on this stream. + * + * An incorrect value will cause an error. + */ + writeOffset: string; + /** + * If `true`, this indicates that the write is complete. Sending any + * `WriteRequest`s subsequent to one in which `finish_write` is `true` will + * cause an error. + */ + finishWrite: boolean; + /** + * A portion of the data for the resource. The client **may** leave `data` + * empty for any given `WriteRequest`. This enables the client to inform the + * service that the request is still live while it is running an operation to + * generate more data. + */ + data: Uint8Array; +} + +/** Response object for ByteStream.Write. */ +export interface WriteResponse { + /** The number of bytes that have been processed for the given resource. */ + committedSize: string; +} + +/** Request object for ByteStream.QueryWriteStatus. */ +export interface QueryWriteStatusRequest { + /** The name of the resource whose write status is being requested. */ + resourceName: string; +} + +/** Response object for ByteStream.QueryWriteStatus. */ +export interface QueryWriteStatusResponse { + /** The number of bytes that have been processed for the given resource. */ + committedSize: string; + /** + * `complete` is `true` only if the client has sent a `WriteRequest` with + * `finish_write` set to true, and the server has processed that request. + */ + complete: boolean; +} + +function createBaseReadRequest(): ReadRequest { + return { resourceName: "", readOffset: "0", readLimit: "0" }; +} + +export const ReadRequest: MessageFns = { + encode(message: ReadRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.resourceName !== "") { + writer.uint32(10).string(message.resourceName); + } + if (message.readOffset !== "0") { + writer.uint32(16).int64(message.readOffset); + } + if (message.readLimit !== "0") { + writer.uint32(24).int64(message.readLimit); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ReadRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReadRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.resourceName = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.readOffset = reader.int64().toString(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.readLimit = reader.int64().toString(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReadRequest { + return { + resourceName: isSet(object.resourceName) ? globalThis.String(object.resourceName) : "", + readOffset: isSet(object.readOffset) ? globalThis.String(object.readOffset) : "0", + readLimit: isSet(object.readLimit) ? globalThis.String(object.readLimit) : "0", + }; + }, + + toJSON(message: ReadRequest): unknown { + const obj: any = {}; + if (message.resourceName !== "") { + obj.resourceName = message.resourceName; + } + if (message.readOffset !== "0") { + obj.readOffset = message.readOffset; + } + if (message.readLimit !== "0") { + obj.readLimit = message.readLimit; + } + return obj; + }, + + create(base?: DeepPartial): ReadRequest { + return ReadRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): ReadRequest { + const message = createBaseReadRequest(); + message.resourceName = object.resourceName ?? ""; + message.readOffset = object.readOffset ?? "0"; + message.readLimit = object.readLimit ?? "0"; + return message; + }, +}; + +function createBaseReadResponse(): ReadResponse { + return { data: new Uint8Array(0) }; +} + +export const ReadResponse: MessageFns = { + encode(message: ReadResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.data.length !== 0) { + writer.uint32(82).bytes(message.data); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ReadResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseReadResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 10: { + if (tag !== 82) { + break; + } + + message.data = reader.bytes(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ReadResponse { + return { data: isSet(object.data) ? bytesFromBase64(object.data) : new Uint8Array(0) }; + }, + + toJSON(message: ReadResponse): unknown { + const obj: any = {}; + if (message.data.length !== 0) { + obj.data = base64FromBytes(message.data); + } + return obj; + }, + + create(base?: DeepPartial): ReadResponse { + return ReadResponse.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): ReadResponse { + const message = createBaseReadResponse(); + message.data = object.data ?? new Uint8Array(0); + return message; + }, +}; + +function createBaseWriteRequest(): WriteRequest { + return { resourceName: "", writeOffset: "0", finishWrite: false, data: new Uint8Array(0) }; +} + +export const WriteRequest: MessageFns = { + encode(message: WriteRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.resourceName !== "") { + writer.uint32(10).string(message.resourceName); + } + if (message.writeOffset !== "0") { + writer.uint32(16).int64(message.writeOffset); + } + if (message.finishWrite !== false) { + writer.uint32(24).bool(message.finishWrite); + } + if (message.data.length !== 0) { + writer.uint32(82).bytes(message.data); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): WriteRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseWriteRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.resourceName = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.writeOffset = reader.int64().toString(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.finishWrite = reader.bool(); + continue; + } + case 10: { + if (tag !== 82) { + break; + } + + message.data = reader.bytes(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): WriteRequest { + return { + resourceName: isSet(object.resourceName) ? globalThis.String(object.resourceName) : "", + writeOffset: isSet(object.writeOffset) ? globalThis.String(object.writeOffset) : "0", + finishWrite: isSet(object.finishWrite) ? globalThis.Boolean(object.finishWrite) : false, + data: isSet(object.data) ? bytesFromBase64(object.data) : new Uint8Array(0), + }; + }, + + toJSON(message: WriteRequest): unknown { + const obj: any = {}; + if (message.resourceName !== "") { + obj.resourceName = message.resourceName; + } + if (message.writeOffset !== "0") { + obj.writeOffset = message.writeOffset; + } + if (message.finishWrite !== false) { + obj.finishWrite = message.finishWrite; + } + if (message.data.length !== 0) { + obj.data = base64FromBytes(message.data); + } + return obj; + }, + + create(base?: DeepPartial): WriteRequest { + return WriteRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): WriteRequest { + const message = createBaseWriteRequest(); + message.resourceName = object.resourceName ?? ""; + message.writeOffset = object.writeOffset ?? "0"; + message.finishWrite = object.finishWrite ?? false; + message.data = object.data ?? new Uint8Array(0); + return message; + }, +}; + +function createBaseWriteResponse(): WriteResponse { + return { committedSize: "0" }; +} + +export const WriteResponse: MessageFns = { + encode(message: WriteResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.committedSize !== "0") { + writer.uint32(8).int64(message.committedSize); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): WriteResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseWriteResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.committedSize = reader.int64().toString(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): WriteResponse { + return { committedSize: isSet(object.committedSize) ? globalThis.String(object.committedSize) : "0" }; + }, + + toJSON(message: WriteResponse): unknown { + const obj: any = {}; + if (message.committedSize !== "0") { + obj.committedSize = message.committedSize; + } + return obj; + }, + + create(base?: DeepPartial): WriteResponse { + return WriteResponse.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): WriteResponse { + const message = createBaseWriteResponse(); + message.committedSize = object.committedSize ?? "0"; + return message; + }, +}; + +function createBaseQueryWriteStatusRequest(): QueryWriteStatusRequest { + return { resourceName: "" }; +} + +export const QueryWriteStatusRequest: MessageFns = { + encode(message: QueryWriteStatusRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.resourceName !== "") { + writer.uint32(10).string(message.resourceName); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): QueryWriteStatusRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryWriteStatusRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.resourceName = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): QueryWriteStatusRequest { + return { resourceName: isSet(object.resourceName) ? globalThis.String(object.resourceName) : "" }; + }, + + toJSON(message: QueryWriteStatusRequest): unknown { + const obj: any = {}; + if (message.resourceName !== "") { + obj.resourceName = message.resourceName; + } + return obj; + }, + + create(base?: DeepPartial): QueryWriteStatusRequest { + return QueryWriteStatusRequest.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): QueryWriteStatusRequest { + const message = createBaseQueryWriteStatusRequest(); + message.resourceName = object.resourceName ?? ""; + return message; + }, +}; + +function createBaseQueryWriteStatusResponse(): QueryWriteStatusResponse { + return { committedSize: "0", complete: false }; +} + +export const QueryWriteStatusResponse: MessageFns = { + encode(message: QueryWriteStatusResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.committedSize !== "0") { + writer.uint32(8).int64(message.committedSize); + } + if (message.complete !== false) { + writer.uint32(16).bool(message.complete); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): QueryWriteStatusResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseQueryWriteStatusResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.committedSize = reader.int64().toString(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.complete = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): QueryWriteStatusResponse { + return { + committedSize: isSet(object.committedSize) ? globalThis.String(object.committedSize) : "0", + complete: isSet(object.complete) ? globalThis.Boolean(object.complete) : false, + }; + }, + + toJSON(message: QueryWriteStatusResponse): unknown { + const obj: any = {}; + if (message.committedSize !== "0") { + obj.committedSize = message.committedSize; + } + if (message.complete !== false) { + obj.complete = message.complete; + } + return obj; + }, + + create(base?: DeepPartial): QueryWriteStatusResponse { + return QueryWriteStatusResponse.fromPartial(base ?? {}); + }, + fromPartial(object: DeepPartial): QueryWriteStatusResponse { + const message = createBaseQueryWriteStatusResponse(); + message.committedSize = object.committedSize ?? "0"; + message.complete = object.complete ?? false; + return message; + }, +}; + +/** + * #### Introduction + * + * The Byte Stream API enables a client to read and write a stream of bytes to + * and from a resource. Resources have names, and these names are supplied in + * the API calls below to identify the resource that is being read from or + * written to. + * + * All implementations of the Byte Stream API export the interface defined here: + * + * * `Read()`: Reads the contents of a resource. + * + * * `Write()`: Writes the contents of a resource. The client can call `Write()` + * multiple times with the same resource and can check the status of the write + * by calling `QueryWriteStatus()`. + * + * #### Service parameters and metadata + * + * The ByteStream API provides no direct way to access/modify any metadata + * associated with the resource. + * + * #### Errors + * + * The errors returned by the service are in the Google canonical error space. + */ +export type ByteStreamDefinition = typeof ByteStreamDefinition; +export const ByteStreamDefinition = { + name: "ByteStream", + fullName: "google.bytestream.ByteStream", + methods: { + /** + * `Read()` is used to retrieve the contents of a resource as a sequence + * of bytes. The bytes are returned in a sequence of responses, and the + * responses are delivered as the results of a server-side streaming RPC. + */ + read: { + name: "Read", + requestType: ReadRequest, + requestStream: false, + responseType: ReadResponse, + responseStream: true, + options: {}, + }, + /** + * `Write()` is used to send the contents of a resource as a sequence of + * bytes. The bytes are sent in a sequence of request protos of a client-side + * streaming RPC. + * + * A `Write()` action is resumable. If there is an error or the connection is + * broken during the `Write()`, the client should check the status of the + * `Write()` by calling `QueryWriteStatus()` and continue writing from the + * returned `committed_size`. This may be less than the amount of data the + * client previously sent. + * + * Calling `Write()` on a resource name that was previously written and + * finalized could cause an error, depending on whether the underlying service + * allows over-writing of previously written resources. + * + * When the client closes the request channel, the service will respond with + * a `WriteResponse`. The service will not view the resource as `complete` + * until the client has sent a `WriteRequest` with `finish_write` set to + * `true`. Sending any requests on a stream after sending a request with + * `finish_write` set to `true` will cause an error. The client **should** + * check the `WriteResponse` it receives to determine how much data the + * service was able to commit and whether the service views the resource as + * `complete` or not. + */ + write: { + name: "Write", + requestType: WriteRequest, + requestStream: true, + responseType: WriteResponse, + responseStream: false, + options: {}, + }, + /** + * `QueryWriteStatus()` is used to find the `committed_size` for a resource + * that is being written, which can then be used as the `write_offset` for + * the next `Write()` call. + * + * If the resource does not exist (i.e., the resource has been deleted, or the + * first `Write()` has not yet reached the service), this method returns the + * error `NOT_FOUND`. + * + * The client **may** call `QueryWriteStatus()` at any time to determine how + * much data has been processed for this resource. This is useful if the + * client is buffering data and needs to know which data can be safely + * evicted. For any sequence of `QueryWriteStatus()` calls for a given + * resource name, the sequence of returned `committed_size` values will be + * non-decreasing. + */ + queryWriteStatus: { + name: "QueryWriteStatus", + requestType: QueryWriteStatusRequest, + requestStream: false, + responseType: QueryWriteStatusResponse, + responseStream: false, + options: {}, + }, + }, +} as const; + +export interface ByteStreamServiceImplementation { + /** + * `Read()` is used to retrieve the contents of a resource as a sequence + * of bytes. The bytes are returned in a sequence of responses, and the + * responses are delivered as the results of a server-side streaming RPC. + */ + read( + request: ReadRequest, + context: CallContext & CallContextExt, + ): ServerStreamingMethodResult>; + /** + * `Write()` is used to send the contents of a resource as a sequence of + * bytes. The bytes are sent in a sequence of request protos of a client-side + * streaming RPC. + * + * A `Write()` action is resumable. If there is an error or the connection is + * broken during the `Write()`, the client should check the status of the + * `Write()` by calling `QueryWriteStatus()` and continue writing from the + * returned `committed_size`. This may be less than the amount of data the + * client previously sent. + * + * Calling `Write()` on a resource name that was previously written and + * finalized could cause an error, depending on whether the underlying service + * allows over-writing of previously written resources. + * + * When the client closes the request channel, the service will respond with + * a `WriteResponse`. The service will not view the resource as `complete` + * until the client has sent a `WriteRequest` with `finish_write` set to + * `true`. Sending any requests on a stream after sending a request with + * `finish_write` set to `true` will cause an error. The client **should** + * check the `WriteResponse` it receives to determine how much data the + * service was able to commit and whether the service views the resource as + * `complete` or not. + */ + write( + request: AsyncIterable, + context: CallContext & CallContextExt, + ): Promise>; + /** + * `QueryWriteStatus()` is used to find the `committed_size` for a resource + * that is being written, which can then be used as the `write_offset` for + * the next `Write()` call. + * + * If the resource does not exist (i.e., the resource has been deleted, or the + * first `Write()` has not yet reached the service), this method returns the + * error `NOT_FOUND`. + * + * The client **may** call `QueryWriteStatus()` at any time to determine how + * much data has been processed for this resource. This is useful if the + * client is buffering data and needs to know which data can be safely + * evicted. For any sequence of `QueryWriteStatus()` calls for a given + * resource name, the sequence of returned `committed_size` values will be + * non-decreasing. + */ + queryWriteStatus( + request: QueryWriteStatusRequest, + context: CallContext & CallContextExt, + ): Promise>; +} + +export interface ByteStreamClient { + /** + * `Read()` is used to retrieve the contents of a resource as a sequence + * of bytes. The bytes are returned in a sequence of responses, and the + * responses are delivered as the results of a server-side streaming RPC. + */ + read(request: DeepPartial, options?: CallOptions & CallOptionsExt): AsyncIterable; + /** + * `Write()` is used to send the contents of a resource as a sequence of + * bytes. The bytes are sent in a sequence of request protos of a client-side + * streaming RPC. + * + * A `Write()` action is resumable. If there is an error or the connection is + * broken during the `Write()`, the client should check the status of the + * `Write()` by calling `QueryWriteStatus()` and continue writing from the + * returned `committed_size`. This may be less than the amount of data the + * client previously sent. + * + * Calling `Write()` on a resource name that was previously written and + * finalized could cause an error, depending on whether the underlying service + * allows over-writing of previously written resources. + * + * When the client closes the request channel, the service will respond with + * a `WriteResponse`. The service will not view the resource as `complete` + * until the client has sent a `WriteRequest` with `finish_write` set to + * `true`. Sending any requests on a stream after sending a request with + * `finish_write` set to `true` will cause an error. The client **should** + * check the `WriteResponse` it receives to determine how much data the + * service was able to commit and whether the service views the resource as + * `complete` or not. + */ + write( + request: AsyncIterable>, + options?: CallOptions & CallOptionsExt, + ): Promise; + /** + * `QueryWriteStatus()` is used to find the `committed_size` for a resource + * that is being written, which can then be used as the `write_offset` for + * the next `Write()` call. + * + * If the resource does not exist (i.e., the resource has been deleted, or the + * first `Write()` has not yet reached the service), this method returns the + * error `NOT_FOUND`. + * + * The client **may** call `QueryWriteStatus()` at any time to determine how + * much data has been processed for this resource. This is useful if the + * client is buffering data and needs to know which data can be safely + * evicted. For any sequence of `QueryWriteStatus()` calls for a given + * resource name, the sequence of returned `committed_size` values will be + * non-decreasing. + */ + queryWriteStatus( + request: DeepPartial, + options?: CallOptions & CallOptionsExt, + ): Promise; +} + +function bytesFromBase64(b64: string): Uint8Array { + const bin = globalThis.atob(b64); + const arr = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i); + } + return arr; +} + +function base64FromBytes(arr: Uint8Array): string { + const bin: string[] = []; + arr.forEach((byte) => { + bin.push(globalThis.String.fromCharCode(byte)); + }); + return globalThis.btoa(bin.join("")); +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export type ServerStreamingMethodResult = { [Symbol.asyncIterator](): AsyncIterator }; + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create(base?: DeepPartial): T; + fromPartial(object: DeepPartial): T; +} diff --git a/frontend/src/proto/buildbarn/auth/auth.proto b/frontend/src/proto/buildbarn/auth/auth.proto new file mode 100644 index 00000000..af01ef68 --- /dev/null +++ b/frontend/src/proto/buildbarn/auth/auth.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package buildbarn.auth; + +import "google/protobuf/struct.proto"; +import "opentelemetry/proto/common/v1/common.proto"; + +option go_package = "github.com/buildbarn/bb-storage/pkg/proto/auth"; + +// Protobuf equivalent of the AuthenticationMetadata structure that is +// used by the auth framework to store information on an authenticated +// user. +message AuthenticationMetadata { + // Part of the authentication metadata that is safe to display + // publicly (e.g., as part of logs or bb_browser). + google.protobuf.Value public = 1; + + // OpenTelemetry tracing attributes to add to spans in which the + // authentication took place (e.g., gRPC server call spans). All + // attributes will have "auth." prepended to their names + // automatically. + repeated opentelemetry.proto.common.v1.KeyValue tracing_attributes = 2; + + // Part of the authentication metadata that should not be displayed + // publicly. This field is useful for propagating information from the + // authentication layer to the authorization layer, as this data can + // be accessed by JMESPathExpressionAuthorizer. + google.protobuf.Value private = 3; +} \ No newline at end of file diff --git a/frontend/src/proto/buildbarn/cas/cas.proto b/frontend/src/proto/buildbarn/cas/cas.proto new file mode 100644 index 00000000..9df1d372 --- /dev/null +++ b/frontend/src/proto/buildbarn/cas/cas.proto @@ -0,0 +1,28 @@ +syntax = "proto3"; + +package buildbarn.cas; + +import "build/bazel/remote/execution/v2/remote_execution.proto"; + +option go_package = "github.com/buildbarn/bb-remote-execution/pkg/proto/cas"; + +// HistoricalExecuteResponse is a custom message that is stored into the +// Content Addressable Storage. The Action Cache is only permitted to +// contain ActionResults of successful builds. In our case we also want +// to provide the user insight as to why their build fails by storing +// the ActionResult upon failure. +// +// This message is written into the ContentAddressableStorage by +// bb_worker by the CachingBuildExecutor. The digest is returned to the +// user by providing a URL to bb_browser as a message in the +// ExecuteResponse. +// +// Additionally, this message is attached to CompletedActions that are +// streamed through a CompletedActionLogger in order to provide metadata +// for uniquely identifying actions. +message HistoricalExecuteResponse { + reserved 2; + + build.bazel.remote.execution.v2.Digest action_digest = 1; + build.bazel.remote.execution.v2.ExecuteResponse execute_response = 3; +} diff --git a/frontend/src/proto/buildbarn/fsac/fsac.proto b/frontend/src/proto/buildbarn/fsac/fsac.proto new file mode 100644 index 00000000..444df3a1 --- /dev/null +++ b/frontend/src/proto/buildbarn/fsac/fsac.proto @@ -0,0 +1,90 @@ +syntax = "proto3"; + +package buildbarn.fsac; + +import "build/bazel/remote/execution/v2/remote_execution.proto"; +import "google/protobuf/empty.proto"; + +option go_package = "github.com/buildbarn/bb-storage/pkg/proto/fsac"; + +// The File System Access Cache (FSAC) is a Buildbarn specific data +// store that workers can use to store information on how build actions +// access the data stored in the input root. This information can be +// used during subsequent executions of similar actions to speed up file +// system access. +service FileSystemAccessCache { + // GetFileSystemAccessProfile() reads a single FileSystemAccessProfile + // from the FSAC. + rpc GetFileSystemAccessProfile(GetFileSystemAccessProfileRequest) + returns (FileSystemAccessProfile); + + // UpdateFileSystemAccessProfile() writes a single + // FileSystemAccessProfile message into the FSAC. + rpc UpdateFileSystemAccessProfile(UpdateFileSystemAccessProfileRequest) + returns (google.protobuf.Empty); +} + +// The file system access profile of a build action. +message FileSystemAccessProfile { + // A Bloom filter that captures paths of regular files and directories + // in the input root whose contents have been read. In case files with + // the same digest are present in the input root multiple times, there + // is no guarantee that all paths are added to the Bloom filter. + // + // This Bloom filter can be used by workers to perform readahead of + // Content Addressable Storage (CAS) objects, thereby reducing the + // probability of execution of actions getting suspended to load data + // over the network. + // + // Hashes are computed by taking the FNV-1a hash of the path in the + // input root, modulo the size of the Bloom filter. The path uses the + // following pattern: + // + // (/${filename})*/* + // + // This means that the root directory uses the empty path. A file + // contained in the root directory may use path "/hello.txt". Between + // [0, k) trailing slashes are added to the path to obtain k + // independent hashes. + // + // The size of the Bloom filter in bits (m) SHOULD be prime. To be + // able to reobtain the exact size in bits, the bits in the final byte + // are terminated with a 1 bit, followed by zero or more 0 bits. + bytes bloom_filter = 1; + + // The number of hash functions (k) that should be considered when + // querying the Bloom filter. + uint32 bloom_filter_hash_functions = 2; +} + +message GetFileSystemAccessProfileRequest { + // The instance of the execution system to operate against. + string instance_name = 1; + + // The digest function that was used to compute the reduced action digest. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 2; + + // The digest of a trimmed down Action message for which a file system + // access profile is requested. This digest is obtained by removing + // all fields from the original Action, except for 'command_digest' + // and 'platform'. + // + // This means that contents of the input root, the Action's timeout + // and the do_not_cache flag are ignored. + build.bazel.remote.execution.v2.Digest reduced_action_digest = 3; +} + +message UpdateFileSystemAccessProfileRequest { + // The instance of the execution system to operate against. + string instance_name = 1; + + // The digest function that was used to compute the reduced action digest. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 2; + + // The digest of a trimmed down Action message for which a file system + // access profile is being stored. + build.bazel.remote.execution.v2.Digest reduced_action_digest = 3; + + // The file system access profile to store. + FileSystemAccessProfile file_system_access_profile = 4; +} \ No newline at end of file diff --git a/frontend/src/proto/buildbarn/iscc/iscc.proto b/frontend/src/proto/buildbarn/iscc/iscc.proto new file mode 100644 index 00000000..18b64148 --- /dev/null +++ b/frontend/src/proto/buildbarn/iscc/iscc.proto @@ -0,0 +1,98 @@ +syntax = "proto3"; + +package buildbarn.iscc; + +import "build/bazel/remote/execution/v2/remote_execution.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/buildbarn/bb-storage/pkg/proto/iscc"; + +// The Initial Size Class Cache (ISCC) is a data store that can be used +// by bb_scheduler to store outcomes of previous executions of an +// action. This data is then used during successive actions of the same +// shape to pick the initial size class on which the action needs to be +// run. +// +// It generally only makes sense to use this data store in case +// platforms are declared that have multiple size classes. +service InitialSizeClassCache { + // GetPreviousExecutionStats() reads a single PreviousExecutionStats + // message from the ISCC. + rpc GetPreviousExecutionStats(GetPreviousExecutionStatsRequest) + returns (PreviousExecutionStats); + + // UpdatePreviousExecutionStats() writes a single + // PreviousExecutionStats message to the ISCC. + rpc UpdatePreviousExecutionStats(UpdatePreviousExecutionStatsRequest) + returns (google.protobuf.Empty); +} + +// The outcome of a single action at some point in the past. +message PreviousExecution { + oneof outcome { + // Execution failed with an error. + google.protobuf.Empty failed = 1; + + // Execution failed due to a timeout. The timeout value is stored. + google.protobuf.Duration timed_out = 2; + + // Execution succeeded. The virtual execution duration is stored. + google.protobuf.Duration succeeded = 3; + } +} + +// Outcomes of actions for a given size class. +message PerSizeClassStats { + // The most recent outcomes for this size class, where the last entry + // corresponds to the most recent one. + repeated PreviousExecution previous_executions = 1; + + reserved 2; + + // An initial probability value to be used for PageRank computation. + // These values may correspond to outcomes of previous PageRank + // computations. Reloading them may make it possible to recompute + // future PageRank probabilities values more quickly. + double initial_page_rank_probability = 3; +} + +message PreviousExecutionStats { + // Outcomes of previous executions of actions, per size class. + map size_classes = 1; + + // The time at which this action failed on the largest size class. + google.protobuf.Timestamp last_seen_failure = 2; +} + +message GetPreviousExecutionStatsRequest { + // The instance of the execution system to operate against. + string instance_name = 1; + + // The digest of a trimmed down Action message for which statistics + // are requested. This digest is obtained by removing all fields from + // the original Action, except for 'command_digest' and 'platform'. + // + // This means that contents of the input root, the Action's timeout + // and the do_not_cache flag are ignored. + build.bazel.remote.execution.v2.Digest reduced_action_digest = 2; + + // The digest function that was used to compute the reduced action digest. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 3; +} + +message UpdatePreviousExecutionStatsRequest { + // The instance of the execution system to operate against. + string instance_name = 1; + + // The digest of a trimmed down Action message for which statistics + // are being stored. + build.bazel.remote.execution.v2.Digest reduced_action_digest = 2; + + // The statistics to store. + PreviousExecutionStats previous_execution_stats = 3; + + // The digest function that was used to compute the reduced action digest. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 4; +} \ No newline at end of file diff --git a/frontend/src/proto/buildbarn/query/query.proto b/frontend/src/proto/buildbarn/query/query.proto new file mode 100644 index 00000000..36c23feb --- /dev/null +++ b/frontend/src/proto/buildbarn/query/query.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; + +package buildbarn.query; + +import "build/bazel/remote/execution/v2/remote_execution.proto"; + +option go_package = "github.com/buildbarn/bb-browser/pkg/proto/query"; + +// Reference to a certain directory contained in a +// FileSystemAccessProfile, which is provided as part of bb_browser URL +// query parameters when listing directories. +message FileSystemAccessProfileReference { + // The digest of the profile stored in the File System Access Cache + // (FSAC). + build.bazel.remote.execution.v2.Digest digest = 1; + + // The FNV-1a base hash value of the path hashes corresponding to the + // current directory. + uint64 path_hashes_base_hash = 2; +} diff --git a/frontend/src/proto/buildbarn/resourceusage/resourceusage.proto b/frontend/src/proto/buildbarn/resourceusage/resourceusage.proto new file mode 100644 index 00000000..f3c45d05 --- /dev/null +++ b/frontend/src/proto/buildbarn/resourceusage/resourceusage.proto @@ -0,0 +1,128 @@ +syntax = "proto3"; + +package buildbarn.resourceusage; + +import "google/protobuf/duration.proto"; + +option go_package = "github.com/buildbarn/bb-portal/pkg/proto/resourceusage"; + +// File pool resource usage statistics. File pools are used by bb_worker +// to allocate temporary files that are created by build actions. +// Temporary files include output files created through the FUSE file +// system. +message FilePoolResourceUsage { + // Total number of files created. + uint64 files_created = 1; + + // Maximum number of files that existed at some point in time. + uint64 files_count_peak = 2; + + // Maximum total size of all files at some point in time. + uint64 files_size_bytes_peak = 3; + + // Total number of ReadAt() calls performed. + uint64 reads_count = 4; + + // Total amount of data returned by all ReadAt() calls. + uint64 reads_size_bytes = 5; + + // Total number of WriteAt() calls performed. + uint64 writes_count = 6; + + // Total amount of data processed by all WriteAt() calls. + uint64 writes_size_bytes = 7; + + // Total number of Truncate() calls performed. + uint64 truncates_count = 8; +} + +// The equivalent of 'struct rusage' in POSIX, generally returned by +// getrusage(2) or wait4(2). +message POSIXResourceUsage { + // ru_utime: Amount of CPU time in seconds spent in userspace. + google.protobuf.Duration user_time = 1; + + // ru_stime: Amount of CPU time in seconds spent in kernelspace. + google.protobuf.Duration system_time = 2; + + // ru_maxrss: Maximum amount of resident memory in bytes. + int64 maximum_resident_set_size = 3; + + // ru_ixrss, ru_idrss and ru_isrss are omitted, as there is no + // portable way to obtain the number of ticks used to compute these + // integrals. + reserved 4, 5, 6; + + // ru_minflt: Page reclaims. + int64 page_reclaims = 7; + + // ru_majflt: Page faults. + int64 page_faults = 8; + + // ru_nswap: Number of swaps. + int64 swaps = 9; + + // ru_inblock: Block input operations. + int64 block_input_operations = 10; + + // ru_oublock: Block output operations. + int64 block_output_operations = 11; + + // ru_msgsnd: Messages sent. + int64 messages_sent = 12; + + // ru_msgrcv: Messages received. + int64 messages_received = 13; + + // ru_nsignals: Signals received. + int64 signals_received = 14; + + // ru_nvcsw: Voluntary context switches. + int64 voluntary_context_switches = 15; + + // ru_nivcsw: Involuntary context switches. + int64 involuntary_context_switches = 16; + + // If abnormal process termination occurred, the name of the signal + // that was delivered, without the "SIG" prefix (e.g., "BUS", "KILL", + // "SEGV"). + // + // Abnormal process termination can occur by calling abort(), or by + // receiving a signal for which no signal handler is installed. + string termination_signal = 17; +} + +// A representation of unique factors that may be aggregated to +// compute a given build action's total price. +message MonetaryResourceUsage { + message Expense { + // The type of currency the cost is measured in. Required to be in + // ISO 4217 format: https://en.wikipedia.org/wiki/ISO_4217#Active_codes + string currency = 1; + + // The value of a specific expense for a build action. + double cost = 2; + } + + // A mapping of expense categories to their respective costs. + map expenses = 1; +} + +// Input root resource usage statistics. These statistics indicate how +// many directories and files inside the virtual file system were +// accessed. These statistics are only reported if prefetching is +// enabled, as they are computed together with the Bloom filter. +message InputRootResourceUsage { + // The number of directories in the input root that have been + // resolved. This equates to the total number of directories that are + // present in all directories that have been read. + uint64 directories_resolved = 1; + + // The number of directories whose contents have been read from the + // Content Addressable Storage (CAS). + uint64 directories_read = 2; + + // The number of files whose contents have been read from the Content + // Addressable Storage (CAS). + uint64 files_read = 3; +} diff --git a/frontend/src/proto/google/bytestream/bytestream.proto b/frontend/src/proto/google/bytestream/bytestream.proto new file mode 100644 index 00000000..a7ad4eb4 --- /dev/null +++ b/frontend/src/proto/google/bytestream/bytestream.proto @@ -0,0 +1,178 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.bytestream; + +option go_package = "google.golang.org/genproto/googleapis/bytestream;bytestream"; +option java_outer_classname = "ByteStreamProto"; +option java_package = "com.google.bytestream"; + +// #### Introduction +// +// The Byte Stream API enables a client to read and write a stream of bytes to +// and from a resource. Resources have names, and these names are supplied in +// the API calls below to identify the resource that is being read from or +// written to. +// +// All implementations of the Byte Stream API export the interface defined here: +// +// * `Read()`: Reads the contents of a resource. +// +// * `Write()`: Writes the contents of a resource. The client can call `Write()` +// multiple times with the same resource and can check the status of the write +// by calling `QueryWriteStatus()`. +// +// #### Service parameters and metadata +// +// The ByteStream API provides no direct way to access/modify any metadata +// associated with the resource. +// +// #### Errors +// +// The errors returned by the service are in the Google canonical error space. +service ByteStream { + // `Read()` is used to retrieve the contents of a resource as a sequence + // of bytes. The bytes are returned in a sequence of responses, and the + // responses are delivered as the results of a server-side streaming RPC. + rpc Read(ReadRequest) returns (stream ReadResponse); + + // `Write()` is used to send the contents of a resource as a sequence of + // bytes. The bytes are sent in a sequence of request protos of a client-side + // streaming RPC. + // + // A `Write()` action is resumable. If there is an error or the connection is + // broken during the `Write()`, the client should check the status of the + // `Write()` by calling `QueryWriteStatus()` and continue writing from the + // returned `committed_size`. This may be less than the amount of data the + // client previously sent. + // + // Calling `Write()` on a resource name that was previously written and + // finalized could cause an error, depending on whether the underlying service + // allows over-writing of previously written resources. + // + // When the client closes the request channel, the service will respond with + // a `WriteResponse`. The service will not view the resource as `complete` + // until the client has sent a `WriteRequest` with `finish_write` set to + // `true`. Sending any requests on a stream after sending a request with + // `finish_write` set to `true` will cause an error. The client **should** + // check the `WriteResponse` it receives to determine how much data the + // service was able to commit and whether the service views the resource as + // `complete` or not. + rpc Write(stream WriteRequest) returns (WriteResponse); + + // `QueryWriteStatus()` is used to find the `committed_size` for a resource + // that is being written, which can then be used as the `write_offset` for + // the next `Write()` call. + // + // If the resource does not exist (i.e., the resource has been deleted, or the + // first `Write()` has not yet reached the service), this method returns the + // error `NOT_FOUND`. + // + // The client **may** call `QueryWriteStatus()` at any time to determine how + // much data has been processed for this resource. This is useful if the + // client is buffering data and needs to know which data can be safely + // evicted. For any sequence of `QueryWriteStatus()` calls for a given + // resource name, the sequence of returned `committed_size` values will be + // non-decreasing. + rpc QueryWriteStatus(QueryWriteStatusRequest) + returns (QueryWriteStatusResponse); +} + +// Request object for ByteStream.Read. +message ReadRequest { + // The name of the resource to read. + string resource_name = 1; + + // The offset for the first byte to return in the read, relative to the start + // of the resource. + // + // A `read_offset` that is negative or greater than the size of the resource + // will cause an `OUT_OF_RANGE` error. + int64 read_offset = 2; + + // The maximum number of `data` bytes the server is allowed to return in the + // sum of all `ReadResponse` messages. A `read_limit` of zero indicates that + // there is no limit, and a negative `read_limit` will cause an error. + // + // If the stream returns fewer bytes than allowed by the `read_limit` and no + // error occurred, the stream includes all data from the `read_offset` to the + // end of the resource. + int64 read_limit = 3; +} + +// Response object for ByteStream.Read. +message ReadResponse { + // A portion of the data for the resource. The service **may** leave `data` + // empty for any given `ReadResponse`. This enables the service to inform the + // client that the request is still live while it is running an operation to + // generate more data. + bytes data = 10; +} + +// Request object for ByteStream.Write. +message WriteRequest { + // The name of the resource to write. This **must** be set on the first + // `WriteRequest` of each `Write()` action. If it is set on subsequent calls, + // it **must** match the value of the first request. + string resource_name = 1; + + // The offset from the beginning of the resource at which the data should be + // written. It is required on all `WriteRequest`s. + // + // In the first `WriteRequest` of a `Write()` action, it indicates + // the initial offset for the `Write()` call. The value **must** be equal to + // the `committed_size` that a call to `QueryWriteStatus()` would return. + // + // On subsequent calls, this value **must** be set and **must** be equal to + // the sum of the first `write_offset` and the sizes of all `data` bundles + // sent previously on this stream. + // + // An incorrect value will cause an error. + int64 write_offset = 2; + + // If `true`, this indicates that the write is complete. Sending any + // `WriteRequest`s subsequent to one in which `finish_write` is `true` will + // cause an error. + bool finish_write = 3; + + // A portion of the data for the resource. The client **may** leave `data` + // empty for any given `WriteRequest`. This enables the client to inform the + // service that the request is still live while it is running an operation to + // generate more data. + bytes data = 10; +} + +// Response object for ByteStream.Write. +message WriteResponse { + // The number of bytes that have been processed for the given resource. + int64 committed_size = 1; +} + +// Request object for ByteStream.QueryWriteStatus. +message QueryWriteStatusRequest { + // The name of the resource whose write status is being requested. + string resource_name = 1; +} + +// Response object for ByteStream.QueryWriteStatus. +message QueryWriteStatusResponse { + // The number of bytes that have been processed for the given resource. + int64 committed_size = 1; + + // `complete` is `true` only if the client has sent a `WriteRequest` with + // `finish_write` set to true, and the server has processed that request. + bool complete = 2; +} \ No newline at end of file diff --git a/frontend/src/types/BrowserPageType.ts b/frontend/src/types/BrowserPageType.ts new file mode 100644 index 00000000..6e8f6777 --- /dev/null +++ b/frontend/src/types/BrowserPageType.ts @@ -0,0 +1,31 @@ +import type { + Digest, + DigestFunction_Value, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; + +export enum BrowserPageType { + Action = "action", + Command = "command", + Directory = "directory", + File = "file", + HistoricalExecuteResponse = "historical_execute_response", + PreviousExecutionStats = "previous_execution_stats", + Tree = "tree", +} + +export const getBrowserPageTypeFromString = ( + value: string, +): BrowserPageType | undefined => { + if (Object.values(BrowserPageType).includes(value as BrowserPageType)) { + return value as BrowserPageType; + } + return undefined; +}; + +export interface BrowserPageParams { + instanceName: string; + digestFunction: DigestFunction_Value; + browserPageType: BrowserPageType; + digest: Digest; + otherParams: Array; +} diff --git a/frontend/src/types/protobufTypeUrls.ts b/frontend/src/types/protobufTypeUrls.ts new file mode 100644 index 00000000..46e7947b --- /dev/null +++ b/frontend/src/types/protobufTypeUrls.ts @@ -0,0 +1,8 @@ +export enum ProtobufTypeUrls { + AUTHENTICATION_METADATA = 'type.googleapis.com/buildbarn.auth.AuthenticationMetadata', + REQUEST_METADATA = 'type.googleapis.com/build.bazel.remote.execution.v2.RequestMetadata', + POSIX_RESOURCE_USAGE = 'type.googleapis.com/buildbarn.resourceusage.POSIXResourceUsage', + FILE_POOL_RESOURCE_USAGE = 'type.googleapis.com/buildbarn.resourceusage.FilePoolResourceUsage', + INPUT_ROOT_RESOURCE_USAGE = 'type.googleapis.com/buildbarn.resourceusage.InputRootResourceUsage', + MONETARY_RESOURCE_USAGE = 'type.googleapis.com/buildbarn.resourceusage.MonetaryResourceUsage', +} diff --git a/frontend/src/utils/bloomFilter.test.ts b/frontend/src/utils/bloomFilter.test.ts new file mode 100644 index 00000000..a8db97c2 --- /dev/null +++ b/frontend/src/utils/bloomFilter.test.ts @@ -0,0 +1,92 @@ +import { Digest } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { FileSystemAccessProfile } from "@/lib/grpc-client/buildbarn/fsac/fsac"; +import { expect, test } from "vitest"; +import { + PATH_HASH_BASE_HASH, + PathHashes, + containsPathHashes, + generateFileSystemReferenceQueryParams, + readBloomFilter, +} from "./bloomFilter"; + +test("bloomFilterReader", () => { + expect(() => readBloomFilter(FileSystemAccessProfile.create())).toThrowError( + "Bloom filter is empty", + ); + + expect(() => + readBloomFilter({ + bloomFilter: Uint8Array.from([0x01]), + bloomFilterHashFunctions: 123, + }), + ).toThrowError("Bloom filter has zero bits"); + + expect(() => + readBloomFilter({ + bloomFilter: Uint8Array.from([0x12, 0x00]), + bloomFilterHashFunctions: 123, + }), + ).toThrowError("Bloom filter's trailing byte is not properly padded"); +}); + +test("containsPathHashes", () => { + const bloomFilterReader = readBloomFilter({ + bloomFilter: Uint8Array.from([ + 0x1d, 0xb2, 0x43, 0xf1, 0x61, 0xfa, 0x18, 0x3f, + ]), + bloomFilterHashFunctions: 11, + }); + + expect( + containsPathHashes( + bloomFilterReader, + new PathHashes().appendComponent("dir"), + ), + ).toBe(true); + + expect( + containsPathHashes( + bloomFilterReader, + new PathHashes().appendComponent("file"), + ), + ).toBe(true); + + expect( + containsPathHashes( + bloomFilterReader, + new PathHashes().appendComponent("dir").appendComponent("file"), + ), + ).toBe(true); + + expect( + containsPathHashes( + bloomFilterReader, + new PathHashes().appendComponent("nonexistent"), + ), + ).toBe(false); +}); + +test("generateFileSystemReferenceQueryParams", () => { + expect(generateFileSystemReferenceQueryParams(undefined)).toBeUndefined(); + + expect( + generateFileSystemReferenceQueryParams({ + digest: Digest.create({ + hash: "01234", + sizeBytes: "999", + }), + pathHashesBaseHash: "56789", + }), + ).toEqual({ + fileSystemAccessProfile: + "%7B%22digest%22%3A%7B%22hash%22%3A%2201234%22%2C%22sizeBytes%22%3A%22999%22%7D%2C%22pathHashesBaseHash%22%3A%2256789%22%7D", + }); +}); + +test("PathHashes", () => { + expect(new PathHashes().baseHash).toEqual(BigInt(PATH_HASH_BASE_HASH)); + + expect(new PathHashes(BigInt("123456789")).baseHash).toEqual( + BigInt("123456789"), + ); +}); diff --git a/frontend/src/utils/bloomFilter.ts b/frontend/src/utils/bloomFilter.ts new file mode 100644 index 00000000..6ead7de6 --- /dev/null +++ b/frontend/src/utils/bloomFilter.ts @@ -0,0 +1,121 @@ +import type { ParsedUrlQueryInput } from "node:querystring"; +import type { FileSystemAccessProfile } from "@/lib/grpc-client/buildbarn/fsac/fsac"; +import { FileSystemAccessProfileReference } from "@/lib/grpc-client/buildbarn/query/query"; + +export interface BloomFilterReader { + bloomFilter: Uint8Array; + sizeBits: number; + hashFunctions: number; +} + +const MAXIMUM_HASH_FUNCTIONS = 1000; +const FNV1A_PRIME = BigInt("1099511628211"); +const SLASH_UNICODE_VALUE = BigInt("/".charCodeAt(0)); +export const PATH_HASH_BASE_HASH = "14695981039346656037"; + +const countLeadingZeros = (byte: number) => { + if (byte > 0xff) { + throw new Error("Input is larger than a byte"); + } + + // This function is equivalent to the function `LeadingZeros8`: + // Return value equal to 8 minus the minimum number of bits + // required to represent `byte`, or 8 if `byte` == 0. + // https://pkg.go.dev/math/bits#LeadingZeros8 + return byte === 0 ? 8 : 8 - byte.toString(2).length; +}; + +const getNextHash = (hash: bigint) => { + return BigInt.asUintN(64, (hash ^ SLASH_UNICODE_VALUE) * FNV1A_PRIME); +}; + +export const readBloomFilter = ( + fsacProfile: FileSystemAccessProfile, +): BloomFilterReader => { + const bloomFilter = fsacProfile.bloomFilter; + let hashFunctions = fsacProfile.bloomFilterHashFunctions; + + const lastByte = bloomFilter.at(bloomFilter.length - 1); + if (lastByte === undefined) { + throw new Error("Bloom filter is empty"); + } + + const leadingZeros: number = countLeadingZeros(lastByte); + if (leadingZeros > 7) { + throw new Error("Bloom filter's trailing byte is not properly padded"); + } + + const sizeBits: number = bloomFilter.length * 8 - leadingZeros - 1; + if (sizeBits === 0) { + throw new Error("Bloom filter has zero bits"); + } + + if (hashFunctions > MAXIMUM_HASH_FUNCTIONS) { + hashFunctions = MAXIMUM_HASH_FUNCTIONS; + } + + return { + bloomFilter: bloomFilter, + sizeBits: sizeBits, + hashFunctions: hashFunctions, + }; +}; + +export const containsPathHashes = ( + r: BloomFilterReader, + pathHashes: PathHashes, +): boolean => { + let iterHash = pathHashes.baseHash; + for (let i = 0; i < r.hashFunctions; ++i) { + const bit = Number(iterHash % BigInt(r.sizeBits)); + + if ((r.bloomFilter[Math.floor(bit >> 3)] & (1 << (bit % 8))) === 0) { + return false; + } + iterHash = getNextHash(iterHash); + } + return true; +}; + +export const generateFileSystemReferenceQueryParams = ( + fileSystemAccessProfileReference: + | FileSystemAccessProfileReference + | undefined, + pathHashes?: PathHashes, +): ParsedUrlQueryInput | undefined => { + if (fileSystemAccessProfileReference === undefined) { + return undefined; + } + + let newPathHash = pathHashes; + + if (newPathHash === undefined) { + newPathHash = new PathHashes( + BigInt(fileSystemAccessProfileReference.pathHashesBaseHash), + ); + } + + return { + fileSystemAccessProfile: JSON.stringify( + FileSystemAccessProfileReference.toJSON({ + digest: fileSystemAccessProfileReference.digest, + pathHashesBaseHash: newPathHash.baseHash.toString(), + }), + ), + }; +}; + +export class PathHashes { + baseHash: bigint; + constructor(baseHash?: bigint) { + this.baseHash = baseHash ? baseHash : BigInt(PATH_HASH_BASE_HASH); + } + + appendComponent(name: string): PathHashes { + let hash = (this.baseHash ^ SLASH_UNICODE_VALUE) * FNV1A_PRIME; + for (const c of name) { + hash = (hash ^ BigInt(c.charCodeAt(0))) * FNV1A_PRIME; + } + return new PathHashes(BigInt.asUintN(64, hash)); + } +} diff --git a/frontend/src/utils/digestFunctionUtils.ts b/frontend/src/utils/digestFunctionUtils.ts index 7d0df90f..0855d55f 100644 --- a/frontend/src/utils/digestFunctionUtils.ts +++ b/frontend/src/utils/digestFunctionUtils.ts @@ -1,6 +1,12 @@ +// biome-ignore lint/style/useNodejsImportProtocol: This feature is only available in Node version 23.8+ +import { createHash } from "crypto"; import { - DigestFunction_Value, digestFunction_ValueFromJSON, - digestFunction_ValueToJSON + Action, + Digest, + DigestFunction_Value, + type Platform, + digestFunction_ValueFromJSON, + digestFunction_ValueToJSON, } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; export const digestFunctionValueFromString = ( @@ -28,3 +34,23 @@ export const includeDigestFunctionInCasFetch = ( DigestFunction_Value.VSO, ].includes(digestFunction); }; + +// Currently we only support SHA256, as some of the other +// algorithms are difficult to implement in Node. +// TODO: Handle different types of algorithms. +export const getReducedActionDigest_SHA256 = ( + commandDigest: Digest, + platform: Platform, +): Digest => { + const encodedReducedAction = Action.encode( + Action.fromPartial({ + commandDigest: commandDigest, + platform: platform, + }), + ).finish(); + + return Digest.create({ + hash: createHash("sha256").update(encodedReducedAction).digest("hex"), + sizeBytes: encodedReducedAction.length.toString(), + }); +}; diff --git a/frontend/src/utils/fetchCasObject.ts b/frontend/src/utils/fetchCasObject.ts new file mode 100644 index 00000000..93b9932a --- /dev/null +++ b/frontend/src/utils/fetchCasObject.ts @@ -0,0 +1,64 @@ +import type { + Digest, + DigestFunction_Value, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import type { ByteStreamClient } from "@/lib/grpc-client/google/bytestream/bytestream"; +import { + digestFunctionValueToString, + includeDigestFunctionInCasFetch, +} from "@/utils/digestFunctionUtils"; +import { protobufToObject } from "@/utils/protobufToObject"; + +export const fetchCasObject = async ( + casByteStreamClient: ByteStreamClient, + instanceName: string | undefined, + digestFunction: DigestFunction_Value, + digest: Digest, +): Promise => { + const resourceName = [ + instanceName ? `/${instanceName}` : "", + "/blobs", + includeDigestFunctionInCasFetch(digestFunction) + ? `/${digestFunctionValueToString(digestFunction)}` + : "", + `/${digest.hash}/${digest.sizeBytes}`, + ].join(""); + + const responseStream = casByteStreamClient.read({ + resourceName, + readOffset: "0", + readLimit: "0", + }); + + const chunks: Uint8Array[] = []; + for await (const chunk of responseStream) { + chunks.push(chunk.data); + } + + return new Uint8Array( + chunks.reduce( + (acc: number[], chunk) => acc.concat(Array.from(chunk)), + [] as number[], + ), + ); +}; + +export const fetchCasObjectAndParse = async ( + casByteStreamClient: ByteStreamClient, + instanceName: string | undefined, + digestFunction: DigestFunction_Value, + digest: Digest, + objectType: { + decode: (input: Uint8Array) => T; + toJSON: (input: T) => unknown; + }, +): Promise => { + const combinedChunks = await fetchCasObject( + casByteStreamClient, + instanceName, + digestFunction, + digest, + ); + + return protobufToObject(objectType, combinedChunks, true); +}; diff --git a/frontend/src/utils/getBbClientdPath.ts b/frontend/src/utils/getBbClientdPath.ts new file mode 100644 index 00000000..7f0ccd35 --- /dev/null +++ b/frontend/src/utils/getBbClientdPath.ts @@ -0,0 +1,16 @@ +import type { + Digest, + DigestFunction_Value, +} from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { digestFunctionValueToString } from "./digestFunctionUtils"; + +export function getBBClientdPath( + instanceName: string, + digestFunction: DigestFunction_Value, + digest: Digest, + blobType: string, +): string { + return `~/bb_clientd/cas/${instanceName}/blobs/${digestFunctionValueToString( + digestFunction, + )}/${blobType}/${digest.hash}-${digest.sizeBytes}`; +} diff --git a/frontend/src/utils/parseBrowserPageSlug.test.ts b/frontend/src/utils/parseBrowserPageSlug.test.ts new file mode 100644 index 00000000..8e580e8c --- /dev/null +++ b/frontend/src/utils/parseBrowserPageSlug.test.ts @@ -0,0 +1,101 @@ +import { describe, expect, it } from "vitest"; +import { parseBrowserPageSlug } from "./parseBrowserPageSlug"; + +describe("parseBrowserPageSlug", () => { + it('should return undefined if "blobs" is not in the slug', () => { + const result = parseBrowserPageSlug([ + "instance", + "not-blobs", + "sha256", + "action", + "hash-size", + "other", + "params", + ]); + expect(result).toBeUndefined(); + }); + + it('should return undefined if "blobs" is at the end of the slug', () => { + const result = parseBrowserPageSlug([ + "instance", + "sha256", + "action", + "hash-size", + "other", + "params", + "blobs", + ]); + expect(result).toBeUndefined(); + }); + + it("should return undefined if instanceName is empty", () => { + const result = parseBrowserPageSlug([ + "blobs", + "sha256", + "action", + "hash-size", + ]); + expect(result).toBeUndefined(); + }); + + it("should return undefined if browserPageType is undefined", () => { + const result = parseBrowserPageSlug([ + "instance", + "blobs", + "sha256", + "invalidType", + "hash-size", + ]); + expect(result).toBeUndefined(); + }); + + it("should return undefined if digest or sizeBytes is missing", () => { + const result = parseBrowserPageSlug([ + "instance", + "blobs", + "sha256", + "action", + "digest", + ]); + expect(result).toBeUndefined(); + }); + + it("should parse valid slug correctly", () => { + const result = parseBrowserPageSlug([ + "instance", + "blobs", + "sha256", + "action", + "hash-size", + "other", + "params", + ]); + expect(result).toEqual({ + instanceName: "instance", + digestFunction: 1, + browserPageType: "action", + digest: { hash: "hash", sizeBytes: "size" }, + otherParams: ["other", "params"], + }); + }); + + it("should parse valid slug with instance name with slashes correctly", () => { + const result = parseBrowserPageSlug([ + "instance", + "name", + "with", + "slashes", + "blobs", + "sha256", + "action", + "hash-size", + ]); + expect(result).toEqual({ + instanceName: "instance/name/with/slashes", + digestFunction: 1, + browserPageType: "action", + digest: { hash: "hash", sizeBytes: "size" }, + otherParams: [], + }); + }); +}); diff --git a/frontend/src/utils/parseBrowserPageSlug.ts b/frontend/src/utils/parseBrowserPageSlug.ts new file mode 100644 index 00000000..d344ae6b --- /dev/null +++ b/frontend/src/utils/parseBrowserPageSlug.ts @@ -0,0 +1,42 @@ +import { + type BrowserPageParams, + getBrowserPageTypeFromString, +} from "@/types/BrowserPageType"; +import { digestFunctionValueFromString } from "./digestFunctionUtils"; + +export const parseBrowserPageSlug = ( + slug: Array, +): BrowserPageParams | undefined => { + const blobIndex = slug.indexOf("blobs"); + if (blobIndex === -1 || blobIndex + 3 >= slug.length) { + return undefined; + } + + const instanceName = slug.slice(0, blobIndex).join("/"); + const digestFunction = digestFunctionValueFromString(slug[blobIndex + 1]); + const browserPageType = getBrowserPageTypeFromString(slug[blobIndex + 2]); + + if ( + instanceName === "" || + digestFunction === undefined || + browserPageType === undefined + ) { + return undefined; + } + + const hashAndSize = slug[blobIndex + 3]; + const [hash, sizeBytes] = hashAndSize.split("-"); + + if (!hash || !sizeBytes) { + return undefined; + } + + const otherParams = slug.slice(blobIndex + 4); + return { + instanceName, + digestFunction, + browserPageType, + digest: { hash, sizeBytes }, + otherParams, + }; +}; diff --git a/frontend/src/utils/protobufToObject.ts b/frontend/src/utils/protobufToObject.ts new file mode 100644 index 00000000..5a292bcb --- /dev/null +++ b/frontend/src/utils/protobufToObject.ts @@ -0,0 +1,68 @@ +import { RequestMetadata } from "@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution"; +import { AuthenticationMetadata } from "@/lib/grpc-client/buildbarn/auth/auth"; +import { + FilePoolResourceUsage, + InputRootResourceUsage, + MonetaryResourceUsage, + POSIXResourceUsage, +} from "@/lib/grpc-client/buildbarn/resourceusage/resourceusage"; +import type { Any } from "@/lib/grpc-client/google/protobuf/any"; +import { ProtobufTypeUrls } from "@/types/protobufTypeUrls"; + +export function protobufToObject( + objectType: { + decode: (input: Uint8Array) => T; + toJSON: (input: T) => unknown; + }, + protobuf: Uint8Array, + keepDefaultValues: boolean, +): T { + if (keepDefaultValues) { + return objectType.decode(protobuf); + } + return objectType.toJSON(objectType.decode(protobuf)) as T; +} + +export function protobufToObjectWithTypeField( + protobuf: Any, + keepDefaultValues: boolean, +): unknown { + const typeUrl = protobuf.typeUrl; + const value = protobuf.value; + + switch (typeUrl) { + case ProtobufTypeUrls.AUTHENTICATION_METADATA: + return { + "@type": typeUrl, + ...protobufToObject(AuthenticationMetadata, value, keepDefaultValues), + }; + case ProtobufTypeUrls.REQUEST_METADATA: + return { + "@type": typeUrl, + ...protobufToObject(RequestMetadata, value, keepDefaultValues), + }; + case ProtobufTypeUrls.POSIX_RESOURCE_USAGE: + return { + "@type": typeUrl, + ...protobufToObject(POSIXResourceUsage, value, keepDefaultValues), + }; + case ProtobufTypeUrls.FILE_POOL_RESOURCE_USAGE: + return { + "@type": typeUrl, + ...protobufToObject(FilePoolResourceUsage, value, keepDefaultValues), + }; + case ProtobufTypeUrls.INPUT_ROOT_RESOURCE_USAGE: + return { + "@type": typeUrl, + ...protobufToObject(InputRootResourceUsage, value, keepDefaultValues), + }; + case ProtobufTypeUrls.MONETARY_RESOURCE_USAGE: + return { + "@type": typeUrl, + ...protobufToObject(MonetaryResourceUsage, value, keepDefaultValues), + }; + default: + console.error(`Unknown typeUrl: ${typeUrl}`); + return {}; + } +} diff --git a/frontend/src/utils/urlGenerator.ts b/frontend/src/utils/urlGenerator.ts new file mode 100644 index 00000000..23d3fde9 --- /dev/null +++ b/frontend/src/utils/urlGenerator.ts @@ -0,0 +1,43 @@ +import { + Digest, + DigestFunction_Value, +} from '@/lib/grpc-client/build/bazel/remote/execution/v2/remote_execution'; +import { env } from 'next-runtime-env'; +import { digestFunctionValueToString } from './digestFunctionUtils'; + +export function generateFileUrl( + instanceName: string, + digestFunction: DigestFunction_Value, + digest: Digest, + fileName: string, +): string { + return `${env( + 'NEXT_PUBLIC_BES_BACKEND_URL', + )}/api/servefile/${instanceName}/blobs/${digestFunctionValueToString( + digestFunction, + )}/file/${digest.hash}-${digest.sizeBytes}/${fileName}`; +} + +export function generateCommandShellScriptUrl( + instanceName: string, + digestFunction: DigestFunction_Value, + digest: Digest, +): string { + return `${env( + 'NEXT_PUBLIC_BES_BACKEND_URL', + )}/api/servefile/${instanceName}/blobs/${digestFunctionValueToString( + digestFunction, + )}/command/${digest.hash}-${digest.sizeBytes}/?format=sh`; +} + +export function generateDirectoryTarballUrl( + instanceName: string, + digestFunction: DigestFunction_Value, + digest: Digest, +): string { + return `${env( + 'NEXT_PUBLIC_BES_BACKEND_URL', + )}/api/servefile/${instanceName}/blobs/${digestFunctionValueToString( + digestFunction, + )}/directory/${digest.hash}-${digest.sizeBytes}/?format=tar`; +} diff --git a/go.mod b/go.mod index 66ae0856..5fab0888 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( entgo.io/ent v0.13.1 github.com/99designs/gqlgen v0.17.55 github.com/bazelbuild/buildtools v0.0.0-20240918101019-be1c24cc9a44 + github.com/bazelbuild/remote-apis v0.0.0-20240924123010-a6328f5026d3 github.com/bazelbuild/remote-apis-sdks v0.0.0-20240522145720-89b6d6b399ad github.com/buildbarn/bb-remote-execution v0.0.0-20250201092335-31d23d1a2b0c github.com/buildbarn/bb-storage v0.0.0-20241007042721-0941111f29e3 @@ -29,6 +30,7 @@ require ( golang.org/x/sync v0.8.0 google.golang.org/api v0.198.0 google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 + google.golang.org/genproto/googleapis/bytestream v0.0.0-20240903143218-8af14fe29dc1 google.golang.org/grpc v1.67.0 google.golang.org/protobuf v1.34.2 mvdan.cc/gofumpt v0.7.0 @@ -36,25 +38,53 @@ require ( require ( ariga.io/atlas v0.19.1-0.20240203083654-5948b60a8e43 // indirect + cloud.google.com/go v0.115.1 // indirect + cloud.google.com/go/auth v0.9.4 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect cloud.google.com/go/compute/metadata v0.5.2 // indirect + cloud.google.com/go/iam v1.2.1 // indirect cloud.google.com/go/longrunning v0.6.1 // indirect + cloud.google.com/go/storage v1.43.0 // indirect github.com/agext/levenshtein v1.2.1 // indirect github.com/agnivade/levenshtein v1.1.1 // indirect github.com/aohorodnyk/mimeheader v0.0.6 // indirect github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect - github.com/bazelbuild/remote-apis v0.0.0-20240924123010-a6328f5026d3 // indirect + github.com/aws/aws-sdk-go-v2 v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 // indirect + github.com/aws/aws-sdk-go-v2/config v1.27.37 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.35 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.63.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.31.1 // indirect + github.com/aws/smithy-go v1.21.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.1.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fxtlabs/primes v0.0.0-20150821004651-dad82d10a449 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/inflect v0.19.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-jsonnet v0.20.0 // indirect + github.com/google/s2a-go v0.1.8 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.13.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -65,7 +95,9 @@ require ( github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/compress v1.17.10 // indirect + github.com/lazybeaver/xorshift v0.0.0-20170702203709-ce511d4823dd // indirect github.com/matryer/is v1.4.1 // indirect github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -81,7 +113,9 @@ require ( github.com/vmihailenco/msgpack/v5 v5.0.0-beta.9 // indirect github.com/vmihailenco/tagparser v0.1.2 // indirect github.com/zclconf/go-cty v1.8.0 // indirect + go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.30.0 // indirect go.opentelemetry.io/otel v1.30.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect @@ -97,6 +131,7 @@ require ( golang.org/x/oauth2 v0.23.0 // indirect golang.org/x/sys v0.25.0 // indirect golang.org/x/text v0.18.0 // indirect + golang.org/x/time v0.6.0 // indirect golang.org/x/tools v0.25.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect diff --git a/go.sum b/go.sum index d801ac26..7f36b99a 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,12 @@ cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI= +cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA= +cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= +cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -41,6 +47,8 @@ cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/yb cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= +cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc= cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -52,6 +60,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= +cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= entgo.io/contrib v0.5.0 h1:M4IqodImfUm327RDwNAITLNz3PsxVeC3rD4DPeVA8Gs= entgo.io/contrib v0.5.0/go.mod h1:q8dXQCmzqpSlVdT2bWDydjgznGcy3y4zmsYmVFC9V/U= @@ -106,6 +116,42 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.31.0 h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U= +github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 h1:xDAuZTn4IMm8o1LnBZvmrL8JA1io4o3YWNXgohbf20g= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5/go.mod h1:wYSv6iDS621sEFLfKvpPE2ugjTuGlAG7iROg0hLOkfc= +github.com/aws/aws-sdk-go-v2/config v1.27.37 h1:xaoIwzHVuRWRHFI0jhgEdEGc8xE1l91KaeRDsWEIncU= +github.com/aws/aws-sdk-go-v2/config v1.27.37/go.mod h1:S2e3ax9/8KnMSyRVNd3sWTKs+1clJ2f1U6nE0lpvQRg= +github.com/aws/aws-sdk-go-v2/credentials v1.17.35 h1:7QknrZhYySEB1lEXJxGAmuD5sWwys5ZXNr4m5oEz0IE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.35/go.mod h1:8Vy4kk7at4aPSmibr7K+nLTzG6qUQAUO4tW49fzUV4E= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 h1:C/d03NAmh8C4BZXhuRNboF/DqhBkBCeDiJDcaqIT5pA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14/go.mod h1:7I0Ju7p9mCIdlrfS+JCgqcYD0VXz/N4yozsox+0o078= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 h1:OWYvKL53l1rbsUmW7bQyJVsYU/Ii3bbAAQIIFNbM0Tk= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18/go.mod h1:CUx0G1v3wG6l01tUB+j7Y8kclA8NSqK4ef0YG79a4cg= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 h1:QFASJGfT8wMXtuP3D5CRmMjARHv9ZmzFUMJznHDOY3w= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5/go.mod h1:QdZ3OmoIjSX+8D1OPAzPxDfjXASbBMDsz9qvtyIhtik= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 h1:rTWjG6AvWekO2B1LHeM3ktU7MqyX9rzWQ7hgzneZW7E= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20/go.mod h1:RGW2DDpVc8hu6Y6yG8G5CHVmVOAn1oV8rNKOHRJyswg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 h1:Xbwbmk44URTiHNx6PNo0ujDE6ERlsCKJD3u1zfnzAPg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20/go.mod h1:oAfOFzUB14ltPZj1rWwRc3d/6OgD76R8KlvU3EqM9Fg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 h1:eb+tFOIl9ZsUe2259/BKPeniKuz4/02zZFH/i4Nf8Rg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18/go.mod h1:GVCC2IJNJTmdlyEsSmofEy7EfJncP7DNnXDzRjJ5Keg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.63.1 h1:TR96r56VwELV0qguNFCuz+/bEpRfnR3ZsS9/IG05C7Q= +github.com/aws/aws-sdk-go-v2/service/s3 v1.63.1/go.mod h1:NLTqRLe3pUNu3nTEHI6XlHLKYmc8fbHUdMxAB6+s41Q= +github.com/aws/aws-sdk-go-v2/service/sso v1.23.1 h1:2jrVsMHqdLD1+PA4BA6Nh1eZp0Gsy3mFSB5MxDvcJtU= +github.com/aws/aws-sdk-go-v2/service/sso v1.23.1/go.mod h1:XRlMvmad0ZNL+75C5FYdMvbbLkd6qiqz6foR1nA1PXY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.1 h1:0L7yGCg3Hb3YQqnSgBTZM5wepougtL1aEccdcdYhHME= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.1/go.mod h1:FnvDM4sfa+isJ3kDXIzAB9GAwVSzFzSy97uZ3IsHo4E= +github.com/aws/aws-sdk-go-v2/service/sts v1.31.1 h1:8K0UNOkZiK9Uh3HIF6Bx0rcNCftqGCeKmOaR7Gp5BSo= +github.com/aws/aws-sdk-go-v2/service/sts v1.31.1/go.mod h1:yMWe0F+XG0DkRZK5ODZhG7BEFYhLXi2dqGsv6tX0cgI= +github.com/aws/smithy-go v1.21.0 h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA= +github.com/aws/smithy-go v1.21.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/bazelbuild/buildtools v0.0.0-20240918101019-be1c24cc9a44 h1:FGzENZi+SX9I7h9xvMtRA3rel8hCEfyzSixteBgn7MU= github.com/bazelbuild/buildtools v0.0.0-20240918101019-be1c24cc9a44/go.mod h1:PLNUetjLa77TCCziPsz0EI8a6CUxgC+1jgmWv0H25tg= github.com/bazelbuild/remote-apis v0.0.0-20240924123010-a6328f5026d3 h1:gLdOIZMdBPwLnJmj8WmqQpldVvoUzLbbldJtYhZ5WbA= @@ -188,12 +234,16 @@ github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fxtlabs/primes v0.0.0-20150821004651-dad82d10a449 h1:HOYnhuVrhAVGKdg3rZapII640so7QfXQmkLkefUN/uM= +github.com/fxtlabs/primes v0.0.0-20150821004651-dad82d10a449/go.mod h1:i+vbdOOivRRh2j+WwBkjZXloGN/+KAqfKDwNfUJeugc= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= @@ -249,6 +299,7 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -301,10 +352,13 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-jsonnet v0.20.0 h1:WG4TTSARuV7bSm4PMB4ohjxe33IHT5WVTrJSU33uT4g= github.com/google/go-jsonnet v0.20.0/go.mod h1:VbgWF9JX7ztlv770x/TolZNGGFfiHEVx9G6ca2eUmeA= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -320,15 +374,21 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -435,6 +495,8 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -458,6 +520,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lazybeaver/xorshift v0.0.0-20170702203709-ce511d4823dd h1:TfmftEfB1zJiDTFi3Qw1xlbEbfJPKUhEDC19clfBMb8= +github.com/lazybeaver/xorshift v0.0.0-20170702203709-ce511d4823dd/go.mod h1:qXyNSomGEqu0M7ewNl3CLgle09PFHk8++5NrBWCz7+Q= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -642,6 +706,8 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -651,6 +717,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1-0.20210427113832-6241f9ab9942/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -697,8 +766,12 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= go.opentelemetry.io/contrib/propagators/b3 v1.30.0 h1:vumy4r1KMyaoQRltX7cJ37p3nluzALX9nugCjNNefuY= go.opentelemetry.io/contrib/propagators/b3 v1.30.0/go.mod h1:fRbvRsaeVZ82LIl3u0rIvusIel2UUf+JcaaIpy5taho= go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= @@ -989,6 +1062,8 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1172,6 +1247,8 @@ google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eY google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240903143218-8af14fe29dc1 h1:W0PHii1rtgc5UgBtJif8xGePValKeZRomnuC5hatKME= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:q0eWNnCW04EJlyrmLT+ZHsjuoUiZ36/eAEdCCezZoco= google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= diff --git a/internal/api/grpcweb/actioncacheproxy/BUILD.bazel b/internal/api/grpcweb/actioncacheproxy/BUILD.bazel new file mode 100644 index 00000000..54592cab --- /dev/null +++ b/internal/api/grpcweb/actioncacheproxy/BUILD.bazel @@ -0,0 +1,15 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "actioncacheproxy", + srcs = ["server.go"], + importpath = "github.com/buildbarn/bb-portal/internal/api/grpcweb/actioncacheproxy", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/api/grpcweb", + "@bazel_remote_apis//build/bazel/remote/execution/v2:remote_execution_go_proto", + "@com_github_buildbarn_bb_storage//pkg/auth", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//status", + ], +) diff --git a/internal/api/grpcweb/actioncacheproxy/server.go b/internal/api/grpcweb/actioncacheproxy/server.go new file mode 100644 index 00000000..1e4aa9f7 --- /dev/null +++ b/internal/api/grpcweb/actioncacheproxy/server.go @@ -0,0 +1,45 @@ +package actioncacheproxy + +import ( + "context" + + remoteexecution "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2" + "github.com/buildbarn/bb-portal/internal/api/grpcweb" + "github.com/buildbarn/bb-storage/pkg/auth" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// ActionCacheServerImpl is a gRPC server that forwards requests to an ActionCacheClient. +type ActionCacheServerImpl struct { + client remoteexecution.ActionCacheClient + authorizer auth.Authorizer +} + +// NewAcctionCacheServerImpl creates a new ActionCacheServerImpl from a given client. +func NewAcctionCacheServerImpl(client remoteexecution.ActionCacheClient, authorizer auth.Authorizer) *ActionCacheServerImpl { + return &ActionCacheServerImpl{client: client, authorizer: authorizer} +} + +// GetActionResult proxies GetActionResult requests to the client. +func (s *ActionCacheServerImpl) GetActionResult(ctx context.Context, req *remoteexecution.GetActionResultRequest) (*remoteexecution.ActionResult, error) { + if req == nil { + return nil, status.Errorf(codes.InvalidArgument, "Invalid request") + } + + if !grpcweb.IsInstanceNamePrefixAllowed(ctx, s.authorizer, req.InstanceName) { + return nil, status.Errorf(codes.NotFound, "Not found") + } + + response, err := s.client.GetActionResult(ctx, req) + if err != nil { + return nil, status.Errorf(codes.NotFound, "Not found") + } + + return response, err +} + +// UpdateActionResult proxies UpdateActionResult requests to the client. +func (s *ActionCacheServerImpl) UpdateActionResult(ctx context.Context, req *remoteexecution.UpdateActionResultRequest) (*remoteexecution.ActionResult, error) { + return nil, status.Errorf(codes.Unimplemented, "Action is not supported") +} diff --git a/internal/api/grpcweb/casproxy/BUILD.bazel b/internal/api/grpcweb/casproxy/BUILD.bazel new file mode 100644 index 00000000..e84e7abd --- /dev/null +++ b/internal/api/grpcweb/casproxy/BUILD.bazel @@ -0,0 +1,21 @@ +load("@rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "casproxy", + srcs = ["server.go"], + importpath = "github.com/buildbarn/bb-portal/internal/api/grpcweb/casproxy", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/api/grpcweb", + "@com_github_buildbarn_bb_storage//pkg/auth", + "@org_golang_google_genproto_googleapis_bytestream//:bytestream", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//status", + ], +) + +go_test( + name = "casproxy_test", + srcs = ["server_test.go"], + embed = [":casproxy"], +) diff --git a/internal/api/grpcweb/casproxy/server.go b/internal/api/grpcweb/casproxy/server.go new file mode 100644 index 00000000..7de5f18d --- /dev/null +++ b/internal/api/grpcweb/casproxy/server.go @@ -0,0 +1,69 @@ +package casproxy + +import ( + "context" + "io" + "strings" + + "github.com/buildbarn/bb-portal/internal/api/grpcweb" + "github.com/buildbarn/bb-storage/pkg/auth" + "google.golang.org/genproto/googleapis/bytestream" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// CasServerImpl is an gRPC server that forwards requests to a ByteStreamClient. +type CasServerImpl struct { + client bytestream.ByteStreamClient + authorizer auth.Authorizer +} + +// NewCasServerImpl creates a new CasServerImpl from a given client. +func NewCasServerImpl(client bytestream.ByteStreamClient, authorizer auth.Authorizer) *CasServerImpl { + return &CasServerImpl{client: client, authorizer: authorizer} +} + +// Read proxies Read requests to the client. +func (s *CasServerImpl) Read(req *bytestream.ReadRequest, stream bytestream.ByteStream_ReadServer) error { + if req == nil { + return status.Errorf(codes.InvalidArgument, "Invalid request") + } + + instanceName := getInstanceName(req.ResourceName) + if !grpcweb.IsInstanceNamePrefixAllowed(stream.Context(), s.authorizer, instanceName) { + return status.Errorf(codes.PermissionDenied, "Not authorized") + } + + clientStream, err := s.client.Read(context.Background(), req) + if err != nil { + return err + } + for { + resp, err := clientStream.Recv() + if err == io.EOF { + break + } + if err != nil { + return err + } + if err := stream.Send(resp); err != nil { + return err + } + } + return nil +} + +// Write proxies Write requests to the client. +func (s *CasServerImpl) Write(stream bytestream.ByteStream_WriteServer) error { + return status.Errorf(codes.Unimplemented, "Action is not supported") +} + +// QueryWriteStatus proxies QueryWriteStatus requests to the client. +func (s *CasServerImpl) QueryWriteStatus(ctx context.Context, req *bytestream.QueryWriteStatusRequest) (*bytestream.QueryWriteStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "Action is not supported") +} + +func getInstanceName(resourceName string) string { + splitString := strings.Split(resourceName, "/blobs")[0] + return strings.TrimPrefix(splitString, "/") +} diff --git a/internal/api/grpcweb/casproxy/server_test.go b/internal/api/grpcweb/casproxy/server_test.go new file mode 100644 index 00000000..230187f9 --- /dev/null +++ b/internal/api/grpcweb/casproxy/server_test.go @@ -0,0 +1,33 @@ +package casproxy + +import ( + "testing" +) + +func TestGetInstanceName(t *testing.T) { + tests := []struct { + resourceName string + expected string + }{ + {"/instance1/blobs/abc123", "instance1"}, + {"instance2/blobs/abc123", "instance2"}, + {"/instance3/blobs", "instance3"}, + {"instance4/blobs", "instance4"}, + {"/blobs/abc123", ""}, + {"/blobs", ""}, + {"", ""}, + {"/in/stance/5/blobs/abc123", "in/stance/5"}, + {"in/stance/6/blobs/abc123", "in/stance/6"}, + {"/in/stance/7/blobs", "in/stance/7"}, + {"in/stance/8/blobs", "in/stance/8"}, + } + + for _, test := range tests { + t.Run(test.resourceName, func(t *testing.T) { + result := getInstanceName(test.resourceName) + if result != test.expected { + t.Errorf("getInstanceName(%q) = %q; want %q", test.resourceName, result, test.expected) + } + }) + } +} diff --git a/internal/api/grpcweb/fsacproxy/BUILD.bazel b/internal/api/grpcweb/fsacproxy/BUILD.bazel new file mode 100644 index 00000000..4a239b93 --- /dev/null +++ b/internal/api/grpcweb/fsacproxy/BUILD.bazel @@ -0,0 +1,16 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "fsacproxy", + srcs = ["server.go"], + importpath = "github.com/buildbarn/bb-portal/internal/api/grpcweb/fsacproxy", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/api/grpcweb", + "@com_github_buildbarn_bb_storage//pkg/auth", + "@com_github_buildbarn_bb_storage//pkg/proto/fsac", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//status", + "@org_golang_google_protobuf//types/known/emptypb", + ], +) diff --git a/internal/api/grpcweb/fsacproxy/server.go b/internal/api/grpcweb/fsacproxy/server.go new file mode 100644 index 00000000..a5fc455b --- /dev/null +++ b/internal/api/grpcweb/fsacproxy/server.go @@ -0,0 +1,40 @@ +package fsacproxy + +import ( + "context" + + "github.com/buildbarn/bb-portal/internal/api/grpcweb" + "github.com/buildbarn/bb-storage/pkg/auth" + "github.com/buildbarn/bb-storage/pkg/proto/fsac" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" +) + +// FsacServerImpl is a gRPC server that forwards requests to an FileSystemAccessCacheClient. +type FsacServerImpl struct { + client fsac.FileSystemAccessCacheClient + authorizer auth.Authorizer +} + +// NewFsacServerImpl creates a new FsacServerImpl from a given client. +func NewFsacServerImpl(client fsac.FileSystemAccessCacheClient, authorizer auth.Authorizer) *FsacServerImpl { + return &FsacServerImpl{client: client, authorizer: authorizer} +} + +// GetFileSystemAccessProfile proxies GetFileSystemAccessProfile requests to the client. +func (s *FsacServerImpl) GetFileSystemAccessProfile(ctx context.Context, req *fsac.GetFileSystemAccessProfileRequest) (*fsac.FileSystemAccessProfile, error) { + if req == nil { + return nil, status.Errorf(codes.InvalidArgument, "Invalid request") + } + + if !grpcweb.IsInstanceNamePrefixAllowed(ctx, s.authorizer, req.InstanceName) { + return nil, status.Errorf(codes.PermissionDenied, "Not authorized") + } + return s.client.GetFileSystemAccessProfile(ctx, req) +} + +// UpdateFileSystemAccessProfile proxies UpdateFileSystemAccessProfile requests to the client. +func (s *FsacServerImpl) UpdateFileSystemAccessProfile(ctx context.Context, req *fsac.UpdateFileSystemAccessProfileRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "Action is not supported") +} diff --git a/internal/api/grpcweb/isccproxy/BUILD.bazel b/internal/api/grpcweb/isccproxy/BUILD.bazel new file mode 100644 index 00000000..a3f61a2a --- /dev/null +++ b/internal/api/grpcweb/isccproxy/BUILD.bazel @@ -0,0 +1,16 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "isccproxy", + srcs = ["server.go"], + importpath = "github.com/buildbarn/bb-portal/internal/api/grpcweb/isccproxy", + visibility = ["//:__subpackages__"], + deps = [ + "//internal/api/grpcweb", + "@com_github_buildbarn_bb_storage//pkg/auth", + "@com_github_buildbarn_bb_storage//pkg/proto/iscc", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//status", + "@org_golang_google_protobuf//types/known/emptypb", + ], +) diff --git a/internal/api/grpcweb/isccproxy/server.go b/internal/api/grpcweb/isccproxy/server.go new file mode 100644 index 00000000..8521bcaf --- /dev/null +++ b/internal/api/grpcweb/isccproxy/server.go @@ -0,0 +1,40 @@ +package isccproxy + +import ( + "context" + + "github.com/buildbarn/bb-portal/internal/api/grpcweb" + "github.com/buildbarn/bb-storage/pkg/auth" + "github.com/buildbarn/bb-storage/pkg/proto/iscc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" +) + +// IsccServerImpl is a gRPC server that forwards requests to an InitialSizeClassCacheClient. +type IsccServerImpl struct { + client iscc.InitialSizeClassCacheClient + authorizer auth.Authorizer +} + +// NewIsccServerImpl creates a new IsccServerImpl from a given client. +func NewIsccServerImpl(client iscc.InitialSizeClassCacheClient, authorizer auth.Authorizer) *IsccServerImpl { + return &IsccServerImpl{client: client, authorizer: authorizer} +} + +// GetPreviousExecutionStats proxies GetPreviousExecutionStats requests to the client. +func (s *IsccServerImpl) GetPreviousExecutionStats(ctx context.Context, req *iscc.GetPreviousExecutionStatsRequest) (*iscc.PreviousExecutionStats, error) { + if req == nil { + return nil, status.Errorf(codes.InvalidArgument, "Invalid request") + } + + if !grpcweb.IsInstanceNamePrefixAllowed(ctx, s.authorizer, req.InstanceName) { + return nil, status.Errorf(codes.PermissionDenied, "Not authorized") + } + return s.client.GetPreviousExecutionStats(ctx, req) +} + +// UpdatePreviousExecutionStats proxies UpdatePreviousExecutionStats requests to the client. +func (s *IsccServerImpl) UpdatePreviousExecutionStats(ctx context.Context, req *iscc.UpdatePreviousExecutionStatsRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "Action is not supported") +} diff --git a/internal/api/servefiles/BUILD.bazel b/internal/api/servefiles/BUILD.bazel new file mode 100644 index 00000000..277eb6bd --- /dev/null +++ b/internal/api/servefiles/BUILD.bazel @@ -0,0 +1,28 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "servefiles_lib", + srcs = [ + "serve_tarball.go", + "server.go", + ], + importpath = "github.com/buildbarn/bb-portal/internal/api/servefiles", + visibility = ["//:__subpackages__"], + deps = [ + "//pkg/proto/configuration/bb_portal", + "@bazel_remote_apis//build/bazel/remote/execution/v2:remote_execution_go_proto", + "@com_github_buildbarn_bb_remote_execution//pkg/builder", + "@com_github_buildbarn_bb_storage//pkg/auth", + "@com_github_buildbarn_bb_storage//pkg/blobstore", + "@com_github_buildbarn_bb_storage//pkg/blobstore/configuration", + "@com_github_buildbarn_bb_storage//pkg/digest", + "@com_github_buildbarn_bb_storage//pkg/filesystem/path", + "@com_github_buildbarn_bb_storage//pkg/grpc", + "@com_github_buildbarn_bb_storage//pkg/program", + "@com_github_buildbarn_bb_storage//pkg/util", + "@com_github_gorilla_mux//:mux", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//metadata", + "@org_golang_google_grpc//status", + ], +) diff --git a/internal/api/servefiles/serve_tarball.go b/internal/api/servefiles/serve_tarball.go new file mode 100644 index 00000000..a26630d9 --- /dev/null +++ b/internal/api/servefiles/serve_tarball.go @@ -0,0 +1,182 @@ +package servefiles + +import ( + "archive/tar" + "compress/gzip" + "context" + "fmt" + "log" + "net/http" + + remoteexecution "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2" + "github.com/buildbarn/bb-storage/pkg/digest" + "github.com/buildbarn/bb-storage/pkg/filesystem/path" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (s FileServerService) generateTarballDirectory(ctx context.Context, w *tar.Writer, digestFunction digest.Function, directory *remoteexecution.Directory, directoryPath *path.Trace, getDirectory func(context.Context, digest.Digest) (*remoteexecution.Directory, error), filesSeen map[string]string) error { + // Emit child directories. + for _, directoryNode := range directory.Directories { + childName, ok := path.NewComponent(directoryNode.Name) + if !ok { + return status.Errorf(codes.InvalidArgument, "Directory %#v in directory %#v has an invalid name", directoryNode.Name, directoryPath.GetUNIXString()) + } + childPath := directoryPath.Append(childName) + + if err := w.WriteHeader(&tar.Header{ + Typeflag: tar.TypeDir, + Name: childPath.GetUNIXString(), + Mode: 0o777, + }); err != nil { + return err + } + childDigest, err := digestFunction.NewDigestFromProto(directoryNode.Digest) + if err != nil { + return err + } + childDirectory, err := getDirectory(ctx, childDigest) + if err != nil { + return err + } + if err := s.generateTarballDirectory(ctx, w, digestFunction, childDirectory, childPath, getDirectory, filesSeen); err != nil { + return err + } + } + + // Emit symlinks. + for _, symlinkNode := range directory.Symlinks { + childName, ok := path.NewComponent(symlinkNode.Name) + if !ok { + return status.Errorf(codes.InvalidArgument, "Symbolic link %#v in directory %#v has an invalid name", symlinkNode.Name, directoryPath.GetUNIXString()) + } + childPath := directoryPath.Append(childName) + + if err := w.WriteHeader(&tar.Header{ + Typeflag: tar.TypeSymlink, + Name: childPath.GetUNIXString(), + Linkname: symlinkNode.Target, + Mode: 0o777, + }); err != nil { + return err + } + } + + // Emit regular files. + for _, fileNode := range directory.Files { + childName, ok := path.NewComponent(fileNode.Name) + if !ok { + return status.Errorf(codes.InvalidArgument, "File %#v in directory %#v has an invalid name", fileNode.Name, directoryPath.GetUNIXString()) + } + childPath := directoryPath.Append(childName) + childPathString := childPath.GetUNIXString() + + childDigest, err := digestFunction.NewDigestFromProto(fileNode.Digest) + if err != nil { + return err + } + + childKey := childDigest.GetKey(digest.KeyWithoutInstance) + if fileNode.IsExecutable { + childKey += "+x" + } else { + childKey += "-x" + } + + if linkPath, ok := filesSeen[childKey]; ok { + // This file was already returned previously. + // Emit a hardlink pointing to the first + // occurrence. + // + // Not only does this reduce the size of the + // tarball, it also makes the directory more + // representative of what it looks like when + // executed through bb_worker. + if err := w.WriteHeader(&tar.Header{ + Typeflag: tar.TypeLink, + Name: childPathString, + Linkname: linkPath, + }); err != nil { + return err + } + } else { + // This is the first time we're returning this + // file. Actually add it to the archive. + mode := int64(0o666) + if fileNode.IsExecutable { + mode = 0o777 + } + if err := w.WriteHeader(&tar.Header{ + Typeflag: tar.TypeReg, + Name: childPathString, + Size: fileNode.Digest.SizeBytes, + Mode: mode, + }); err != nil { + return err + } + + if err := s.contentAddressableStorage.Get(ctx, childDigest).IntoWriter(w); err != nil { + return err + } + + filesSeen[childKey] = childPathString + } + } + return nil +} + +func (s FileServerService) generateTarball(ctx context.Context, w http.ResponseWriter, digest digest.Digest, directory *remoteexecution.Directory, getDirectory func(context.Context, digest.Digest) (*remoteexecution.Directory, error)) { + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s.tar.gz\"", digest.GetHashString())) + w.Header().Set("Content-Type", "application/gzip") + gzipWriter := gzip.NewWriter(w) + tarWriter := tar.NewWriter(gzipWriter) + filesSeen := map[string]string{} + if err := s.generateTarballDirectory(ctx, tarWriter, digest.GetDigestFunction(), directory, nil, getDirectory, filesSeen); err != nil { + // TODO(edsch): Any way to propagate this to the client? + log.Print(err) + panic(http.ErrAbortHandler) + } + if err := tarWriter.Close(); err != nil { + log.Print(err) + panic(http.ErrAbortHandler) + } + if err := gzipWriter.Close(); err != nil { + log.Print(err) + panic(http.ErrAbortHandler) + } +} + +// HandleDirectory serves a directory as a tarball. +func (s FileServerService) HandleDirectory(w http.ResponseWriter, req *http.Request) { + if req.Method != "GET" { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + if req.URL.Query().Get("format") != "tar" { + http.Error(w, "Invalid format. Only supports \"tar\"", http.StatusNotFound) + return + } + + directoryDigest, err := getDigestFromRequest(req) + if err != nil { + http.Error(w, "Digest not found", http.StatusNotFound) + return + } + + ctx := extractContextFromRequest(req) + directoryMessage, err := s.contentAddressableStorage.Get(ctx, directoryDigest).ToProto(&remoteexecution.Directory{}, s.maximumMessageSizeBytes) + if err != nil { + http.Error(w, "Digest not found", http.StatusNotFound) + return + } + directory := directoryMessage.(*remoteexecution.Directory) + + s.generateTarball(ctx, w, directoryDigest, directory, func(ctx context.Context, digest digest.Digest) (*remoteexecution.Directory, error) { + directoryMessage, err := s.contentAddressableStorage.Get(ctx, digest).ToProto(&remoteexecution.Directory{}, s.maximumMessageSizeBytes) + if err != nil { + return nil, err + } + return directoryMessage.(*remoteexecution.Directory), nil + }) +} diff --git a/internal/api/servefiles/server.go b/internal/api/servefiles/server.go new file mode 100644 index 00000000..23fd4e0b --- /dev/null +++ b/internal/api/servefiles/server.go @@ -0,0 +1,178 @@ +package servefiles + +import ( + "bufio" + "context" + "io" + "log" + "net/http" + "strconv" + "strings" + "unicode/utf8" + + "github.com/buildbarn/bb-portal/pkg/proto/configuration/bb_portal" + "github.com/buildbarn/bb-remote-execution/pkg/builder" + "github.com/buildbarn/bb-storage/pkg/auth" + "github.com/buildbarn/bb-storage/pkg/blobstore" + blobstore_configuration "github.com/buildbarn/bb-storage/pkg/blobstore/configuration" + "github.com/buildbarn/bb-storage/pkg/digest" + bb_grpc "github.com/buildbarn/bb-storage/pkg/grpc" + "github.com/buildbarn/bb-storage/pkg/program" + "github.com/buildbarn/bb-storage/pkg/util" + "github.com/gorilla/mux" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + + remoteexecution "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2" +) + +var digestFunctionStrings = map[string]remoteexecution.DigestFunction_Value{} + +func init() { + for _, digestFunction := range digest.SupportedDigestFunctions { + digestFunctionStrings[strings.ToLower(digestFunction.String())] = digestFunction + } +} + +func getDigestFromRequest(req *http.Request) (digest.Digest, error) { + vars := mux.Vars(req) + instanceNameStr := strings.TrimSuffix(vars["instanceName"], "/") + instanceName, err := digest.NewInstanceName(instanceNameStr) + if err != nil { + return digest.BadDigest, util.StatusWrapf(err, "Invalid instance name %#v", instanceNameStr) + } + digestFunctionStr := vars["digestFunction"] + digestFunctionEnum, ok := digestFunctionStrings[digestFunctionStr] + if !ok { + return digest.BadDigest, status.Errorf(codes.InvalidArgument, "Unknown digest function %#v", digestFunctionStr) + } + digestFunction, err := instanceName.GetDigestFunction(digestFunctionEnum, 0) + if err != nil { + return digest.BadDigest, err + } + sizeBytes, err := strconv.ParseInt(vars["sizeBytes"], 10, 64) + if err != nil { + return digest.BadDigest, util.StatusWrapf(err, "Invalid blob size %#v", vars["sizeBytes"]) + } + return digestFunction.NewDigest(vars["hash"], sizeBytes) +} + +// Generates a Context from an incoming HTTP request, forwarding any +// request headers as gRPC metadata. +func extractContextFromRequest(req *http.Request) context.Context { + var pairs []string + for key, values := range req.Header { + for _, value := range values { + pairs = append(pairs, key, value) + } + } + return metadata.NewIncomingContext(req.Context(), metadata.Pairs(pairs...)) +} + +// FileServerService is a service that serves files from the Content +// Addressable Storage (CAS) over HTTP. It also serves shell scripts generated +// from Command messages, and directories as Tarballs. +type FileServerService struct { + contentAddressableStorage blobstore.BlobAccess + maximumMessageSizeBytes int +} + +// NewFileServerServiceFromConfiguration creates a new ServeFilesService +// with an authorizing CAS if ServeFilesCasConfiguration is configured. +func NewFileServerServiceFromConfiguration(dependenciesGroup program.Group, configuration *bb_portal.ApplicationConfiguration, grpcClientFactory bb_grpc.ClientFactory) *FileServerService { + if configuration.ServeFilesCasConfiguration == nil { + log.Printf("Did not start serving files from Content Addressable Storage because ServeFilesCasConfiguration is not configured") + return nil + } + + instanceNameAuthorizer, err := auth.DefaultAuthorizerFactory.NewAuthorizerFromConfiguration(configuration.InstanceNameAuthorizer) + if err != nil { + log.Fatalf("Failed to create InstanceNameAuthorizer: %v", err) + } + + contentAddressableStorage, err := blobstore_configuration.NewBlobAccessFromConfiguration( + dependenciesGroup, + configuration.ServeFilesCasConfiguration, + blobstore_configuration.NewCASBlobAccessCreator(grpcClientFactory, int(configuration.MaximumMessageSizeBytes)), + ) + if err != nil { + log.Fatalf("Failed to serve files from Content Addressable Storage: %v", err) + } + + return &FileServerService{ + blobstore.NewAuthorizingBlobAccess(contentAddressableStorage.BlobAccess, instanceNameAuthorizer, nil, nil), + int(configuration.MaximumMessageSizeBytes), + } +} + +// HandleFile serves a file from the Content Addressable Storage (CAS) over HTTP. +func (s FileServerService) HandleFile(w http.ResponseWriter, req *http.Request) { + digest, err := getDigestFromRequest(req) + if err != nil { + http.Error(w, "Digest not found", http.StatusNotFound) + return + } + + ctx := extractContextFromRequest(req) + r := s.contentAddressableStorage.Get(ctx, digest).ToReader() + defer r.Close() + + // Attempt to read the first chunk of data to see whether we can + // trigger an error. Only when no error occurs, we start setting + // response headers. + var first [4096]byte + n, err := r.Read(first[:]) + if err != nil && err != io.EOF { + http.Error(w, "Could not send file", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Length", strconv.FormatInt(digest.GetSizeBytes(), 10)) + if utf8.ValidString(string(first[:])) { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + } else { + w.Header().Set("Content-Type", "application/octet-stream") + } + w.Write(first[:n]) + io.Copy(w, r) +} + +// HandleCommand serves a Command message from the Content Addressable Storage +// (CAS) as a shell script over HTTP. +func (s FileServerService) HandleCommand(w http.ResponseWriter, req *http.Request) { + if req.Method != "GET" { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + if req.URL.Query().Get("format") != "sh" { + http.Error(w, "Invalid format. Only supports \"sh\"", http.StatusNotFound) + return + } + + digest, err := getDigestFromRequest(req) + if err != nil { + http.Error(w, "Digest not found", http.StatusNotFound) + return + } + ctx := extractContextFromRequest(req) + + commandMessage, err := s.contentAddressableStorage.Get(ctx, digest).ToProto(&remoteexecution.Command{}, s.maximumMessageSizeBytes) + if err != nil { + http.Error(w, "Not found", http.StatusNotFound) + return + } + command := commandMessage.(*remoteexecution.Command) + + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + bw := bufio.NewWriter(w) + if err := builder.ConvertCommandToShellScript(command, bw); err != nil { + log.Print(err) + panic(http.ErrAbortHandler) + } + if err := bw.Flush(); err != nil { + log.Print(err) + panic(http.ErrAbortHandler) + } +} diff --git a/pkg/proto/configuration/bb_portal/BUILD.bazel b/pkg/proto/configuration/bb_portal/BUILD.bazel index 0a5eb8a4..13ce8ff5 100644 --- a/pkg/proto/configuration/bb_portal/BUILD.bazel +++ b/pkg/proto/configuration/bb_portal/BUILD.bazel @@ -8,6 +8,7 @@ proto_library( visibility = ["//visibility:public"], deps = [ "@com_github_buildbarn_bb_storage//pkg/proto/configuration/auth:auth_proto", + "@com_github_buildbarn_bb_storage//pkg/proto/configuration/blobstore:blobstore_proto", "@com_github_buildbarn_bb_storage//pkg/proto/configuration/global:global_proto", "@com_github_buildbarn_bb_storage//pkg/proto/configuration/grpc:grpc_proto", "@com_github_buildbarn_bb_storage//pkg/proto/configuration/http:http_proto", @@ -21,6 +22,7 @@ go_proto_library( visibility = ["//visibility:public"], deps = [ "@com_github_buildbarn_bb_storage//pkg/proto/configuration/auth", + "@com_github_buildbarn_bb_storage//pkg/proto/configuration/blobstore", "@com_github_buildbarn_bb_storage//pkg/proto/configuration/global", "@com_github_buildbarn_bb_storage//pkg/proto/configuration/grpc", "@com_github_buildbarn_bb_storage//pkg/proto/configuration/http", diff --git a/pkg/proto/configuration/bb_portal/bb_portal.pb.go b/pkg/proto/configuration/bb_portal/bb_portal.pb.go index ea620214..b6a3e254 100644 --- a/pkg/proto/configuration/bb_portal/bb_portal.pb.go +++ b/pkg/proto/configuration/bb_portal/bb_portal.pb.go @@ -8,6 +8,7 @@ package bb_portal import ( auth "github.com/buildbarn/bb-storage/pkg/proto/configuration/auth" + blobstore "github.com/buildbarn/bb-storage/pkg/proto/configuration/blobstore" global "github.com/buildbarn/bb-storage/pkg/proto/configuration/global" grpc "github.com/buildbarn/bb-storage/pkg/proto/configuration/grpc" http "github.com/buildbarn/bb-storage/pkg/proto/configuration/http" @@ -92,11 +93,17 @@ type ApplicationConfiguration struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - HttpServers []*http.ServerConfiguration `protobuf:"bytes,1,rep,name=http_servers,json=httpServers,proto3" json:"http_servers,omitempty"` - GrpcServers []*grpc.ServerConfiguration `protobuf:"bytes,2,rep,name=grpc_servers,json=grpcServers,proto3" json:"grpc_servers,omitempty"` - Global *global.Configuration `protobuf:"bytes,3,opt,name=global,proto3" json:"global,omitempty"` - InstanceNameAuthorizer *auth.AuthorizerConfiguration `protobuf:"bytes,4,opt,name=instance_name_authorizer,json=instanceNameAuthorizer,proto3" json:"instance_name_authorizer,omitempty"` - BuildQueueStateProxy *GrpcWebProxyConfiguration `protobuf:"bytes,5,opt,name=build_queue_state_proxy,json=buildQueueStateProxy,proto3" json:"build_queue_state_proxy,omitempty"` + HttpServers []*http.ServerConfiguration `protobuf:"bytes,1,rep,name=http_servers,json=httpServers,proto3" json:"http_servers,omitempty"` + GrpcServers []*grpc.ServerConfiguration `protobuf:"bytes,2,rep,name=grpc_servers,json=grpcServers,proto3" json:"grpc_servers,omitempty"` + Global *global.Configuration `protobuf:"bytes,3,opt,name=global,proto3" json:"global,omitempty"` + InstanceNameAuthorizer *auth.AuthorizerConfiguration `protobuf:"bytes,4,opt,name=instance_name_authorizer,json=instanceNameAuthorizer,proto3" json:"instance_name_authorizer,omitempty"` + BuildQueueStateProxy *GrpcWebProxyConfiguration `protobuf:"bytes,5,opt,name=build_queue_state_proxy,json=buildQueueStateProxy,proto3" json:"build_queue_state_proxy,omitempty"` + ActionCacheProxy *GrpcWebProxyConfiguration `protobuf:"bytes,6,opt,name=action_cache_proxy,json=actionCacheProxy,proto3" json:"action_cache_proxy,omitempty"` + ContentAddressableStorageProxy *GrpcWebProxyConfiguration `protobuf:"bytes,7,opt,name=content_addressable_storage_proxy,json=contentAddressableStorageProxy,proto3" json:"content_addressable_storage_proxy,omitempty"` + InitialSizeClassCacheProxy *GrpcWebProxyConfiguration `protobuf:"bytes,8,opt,name=initial_size_class_cache_proxy,json=initialSizeClassCacheProxy,proto3" json:"initial_size_class_cache_proxy,omitempty"` + FileSystemAccessCacheProxy *GrpcWebProxyConfiguration `protobuf:"bytes,9,opt,name=file_system_access_cache_proxy,json=fileSystemAccessCacheProxy,proto3" json:"file_system_access_cache_proxy,omitempty"` + ServeFilesCasConfiguration *blobstore.BlobAccessConfiguration `protobuf:"bytes,10,opt,name=serve_files_cas_configuration,json=serveFilesCasConfiguration,proto3" json:"serve_files_cas_configuration,omitempty"` + MaximumMessageSizeBytes int64 `protobuf:"varint,11,opt,name=maximum_message_size_bytes,json=maximumMessageSizeBytes,proto3" json:"maximum_message_size_bytes,omitempty"` } func (x *ApplicationConfiguration) Reset() { @@ -166,6 +173,48 @@ func (x *ApplicationConfiguration) GetBuildQueueStateProxy() *GrpcWebProxyConfig return nil } +func (x *ApplicationConfiguration) GetActionCacheProxy() *GrpcWebProxyConfiguration { + if x != nil { + return x.ActionCacheProxy + } + return nil +} + +func (x *ApplicationConfiguration) GetContentAddressableStorageProxy() *GrpcWebProxyConfiguration { + if x != nil { + return x.ContentAddressableStorageProxy + } + return nil +} + +func (x *ApplicationConfiguration) GetInitialSizeClassCacheProxy() *GrpcWebProxyConfiguration { + if x != nil { + return x.InitialSizeClassCacheProxy + } + return nil +} + +func (x *ApplicationConfiguration) GetFileSystemAccessCacheProxy() *GrpcWebProxyConfiguration { + if x != nil { + return x.FileSystemAccessCacheProxy + } + return nil +} + +func (x *ApplicationConfiguration) GetServeFilesCasConfiguration() *blobstore.BlobAccessConfiguration { + if x != nil { + return x.ServeFilesCasConfiguration + } + return nil +} + +func (x *ApplicationConfiguration) GetMaximumMessageSizeBytes() int64 { + if x != nil { + return x.MaximumMessageSizeBytes + } + return 0 +} + var File_pkg_proto_configuration_bb_portal_bb_portal_proto protoreflect.FileDescriptor var file_pkg_proto_configuration_bb_portal_bb_portal_proto_rawDesc = []byte{ @@ -177,65 +226,112 @@ var file_pkg_proto_configuration_bb_portal_bb_portal_proto_rawDesc = []byte{ 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x1a, 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x2b, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x6b, - 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, - 0x01, 0x0a, 0x19, 0x47, 0x72, 0x70, 0x63, 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x06, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, - 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x22, 0xf3, 0x03, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x68, 0x74, - 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x0c, 0x67, 0x72, 0x70, - 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x31, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x2b, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xe5, 0x01, 0x0a, 0x19, 0x47, 0x72, 0x70, 0x63, 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x49, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, - 0x45, 0x0a, 0x06, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x12, 0x6f, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x0c, 0x68, 0x74, + 0x74, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x22, 0xab, 0x09, 0x0a, 0x18, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x73, 0x0a, 0x17, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x62, 0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x2e, 0x47, 0x72, 0x70, - 0x63, 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x51, 0x75, 0x65, - 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x42, 0x42, 0x5a, 0x40, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x62, 0x61, 0x72, 0x6e, 0x2f, 0x62, 0x62, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0b, 0x68, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x0c, + 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x12, 0x6f, 0x0a, 0x18, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x72, 0x12, 0x73, 0x0a, 0x17, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x2e, + 0x47, 0x72, 0x70, 0x63, 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x51, 0x75, 0x65, 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, + 0x6a, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x2e, + 0x47, 0x72, 0x70, 0x63, 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x21, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, + 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x62, 0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x2e, 0x47, 0x72, 0x70, 0x63, + 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x80, 0x01, 0x0a, 0x1e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, + 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6c, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x80, 0x01, 0x0a, 0x1e, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x62, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x57, 0x65, 0x62, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x1a, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x7d, 0x0a, 0x1d, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x61, 0x73, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x6c, 0x6f, + 0x62, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x61, 0x73, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x1a, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x42, 0x42, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x61, 0x72, 0x6e, 0x2f, + 0x62, 0x62, 0x2d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x62, 0x62, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -252,27 +348,33 @@ func file_pkg_proto_configuration_bb_portal_bb_portal_proto_rawDescGZIP() []byte var file_pkg_proto_configuration_bb_portal_bb_portal_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_pkg_proto_configuration_bb_portal_bb_portal_proto_goTypes = []any{ - (*GrpcWebProxyConfiguration)(nil), // 0: buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration - (*ApplicationConfiguration)(nil), // 1: buildbarn.configuration.bb_portal.ApplicationConfiguration - (*grpc.ClientConfiguration)(nil), // 2: buildbarn.configuration.grpc.ClientConfiguration - (*http.ServerConfiguration)(nil), // 3: buildbarn.configuration.http.ServerConfiguration - (*grpc.ServerConfiguration)(nil), // 4: buildbarn.configuration.grpc.ServerConfiguration - (*global.Configuration)(nil), // 5: buildbarn.configuration.global.Configuration - (*auth.AuthorizerConfiguration)(nil), // 6: buildbarn.configuration.auth.AuthorizerConfiguration + (*GrpcWebProxyConfiguration)(nil), // 0: buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration + (*ApplicationConfiguration)(nil), // 1: buildbarn.configuration.bb_portal.ApplicationConfiguration + (*grpc.ClientConfiguration)(nil), // 2: buildbarn.configuration.grpc.ClientConfiguration + (*http.ServerConfiguration)(nil), // 3: buildbarn.configuration.http.ServerConfiguration + (*grpc.ServerConfiguration)(nil), // 4: buildbarn.configuration.grpc.ServerConfiguration + (*global.Configuration)(nil), // 5: buildbarn.configuration.global.Configuration + (*auth.AuthorizerConfiguration)(nil), // 6: buildbarn.configuration.auth.AuthorizerConfiguration + (*blobstore.BlobAccessConfiguration)(nil), // 7: buildbarn.configuration.blobstore.BlobAccessConfiguration } var file_pkg_proto_configuration_bb_portal_bb_portal_proto_depIdxs = []int32{ - 2, // 0: buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration.client:type_name -> buildbarn.configuration.grpc.ClientConfiguration - 3, // 1: buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration.http_servers:type_name -> buildbarn.configuration.http.ServerConfiguration - 3, // 2: buildbarn.configuration.bb_portal.ApplicationConfiguration.http_servers:type_name -> buildbarn.configuration.http.ServerConfiguration - 4, // 3: buildbarn.configuration.bb_portal.ApplicationConfiguration.grpc_servers:type_name -> buildbarn.configuration.grpc.ServerConfiguration - 5, // 4: buildbarn.configuration.bb_portal.ApplicationConfiguration.global:type_name -> buildbarn.configuration.global.Configuration - 6, // 5: buildbarn.configuration.bb_portal.ApplicationConfiguration.instance_name_authorizer:type_name -> buildbarn.configuration.auth.AuthorizerConfiguration - 0, // 6: buildbarn.configuration.bb_portal.ApplicationConfiguration.build_queue_state_proxy:type_name -> buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 2, // 0: buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration.client:type_name -> buildbarn.configuration.grpc.ClientConfiguration + 3, // 1: buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration.http_servers:type_name -> buildbarn.configuration.http.ServerConfiguration + 3, // 2: buildbarn.configuration.bb_portal.ApplicationConfiguration.http_servers:type_name -> buildbarn.configuration.http.ServerConfiguration + 4, // 3: buildbarn.configuration.bb_portal.ApplicationConfiguration.grpc_servers:type_name -> buildbarn.configuration.grpc.ServerConfiguration + 5, // 4: buildbarn.configuration.bb_portal.ApplicationConfiguration.global:type_name -> buildbarn.configuration.global.Configuration + 6, // 5: buildbarn.configuration.bb_portal.ApplicationConfiguration.instance_name_authorizer:type_name -> buildbarn.configuration.auth.AuthorizerConfiguration + 0, // 6: buildbarn.configuration.bb_portal.ApplicationConfiguration.build_queue_state_proxy:type_name -> buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration + 0, // 7: buildbarn.configuration.bb_portal.ApplicationConfiguration.action_cache_proxy:type_name -> buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration + 0, // 8: buildbarn.configuration.bb_portal.ApplicationConfiguration.content_addressable_storage_proxy:type_name -> buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration + 0, // 9: buildbarn.configuration.bb_portal.ApplicationConfiguration.initial_size_class_cache_proxy:type_name -> buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration + 0, // 10: buildbarn.configuration.bb_portal.ApplicationConfiguration.file_system_access_cache_proxy:type_name -> buildbarn.configuration.bb_portal.GrpcWebProxyConfiguration + 7, // 11: buildbarn.configuration.bb_portal.ApplicationConfiguration.serve_files_cas_configuration:type_name -> buildbarn.configuration.blobstore.BlobAccessConfiguration + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_pkg_proto_configuration_bb_portal_bb_portal_proto_init() } diff --git a/pkg/proto/configuration/bb_portal/bb_portal.proto b/pkg/proto/configuration/bb_portal/bb_portal.proto index a8b99e26..c4c37809 100644 --- a/pkg/proto/configuration/bb_portal/bb_portal.proto +++ b/pkg/proto/configuration/bb_portal/bb_portal.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package buildbarn.configuration.bb_portal; import "pkg/proto/configuration/auth/auth.proto"; +import "pkg/proto/configuration/blobstore/blobstore.proto"; import "pkg/proto/configuration/global/global.proto"; import "pkg/proto/configuration/grpc/grpc.proto"; import "pkg/proto/configuration/http/http.proto"; @@ -39,4 +40,15 @@ message ApplicationConfiguration { // Configures the gRPC-Web proxies that are used from the web UI to // communicate with the Buildbarn. GrpcWebProxyConfiguration build_queue_state_proxy = 5; + GrpcWebProxyConfiguration action_cache_proxy = 6; + GrpcWebProxyConfiguration content_addressable_storage_proxy = 7; + GrpcWebProxyConfiguration initial_size_class_cache_proxy = 8; + GrpcWebProxyConfiguration file_system_access_cache_proxy = 9; + + // Configuration for serving files with Content Addressable Storage. + buildbarn.configuration.blobstore.BlobAccessConfiguration + serve_files_cas_configuration = 10; + + // Maximum Protobuf message size to unmarshal. + int64 maximum_message_size_bytes = 11; }