From 882bcef3b3c2fbd37558f58bf5f424ead4be1aaa Mon Sep 17 00:00:00 2001 From: Derek Wang Date: Tue, 3 Oct 2023 12:47:05 -0700 Subject: [PATCH] feat: Numaflow UI 1.0 (#1077) Signed-off-by: jyu6 Signed-off-by: Derek Wang Signed-off-by: bbehnke Signed-off-by: veds-g Signed-off-by: Sidhant Kohli Signed-off-by: Vigith Maurice Signed-off-by: Shakira M Signed-off-by: Darshan Simha Signed-off-by: bbehnke1 Co-authored-by: Bradley Behnke Co-authored-by: Juanlu Yu <19543684+jy4096@users.noreply.github.com> Co-authored-by: Vedant Gupta <49195734+veds-g@users.noreply.github.com> Co-authored-by: Sidhant Kohli Co-authored-by: Vigith Maurice Co-authored-by: Yashash H L Co-authored-by: Darshan Simha Co-authored-by: Shakira M --- .github/workflows/ci.yaml | 7 +- Makefile | 1 + .../namespaced-numaflow-server.yaml | 9 +- config/advanced-install/numaflow-server.yaml | 9 +- .../numaflow-server-cluster-role.yaml | 9 +- config/install.yaml | 9 +- config/namespace-install.yaml | 9 +- .../numaflow-server/numaflow-server-role.yaml | 9 +- pkg/apis/proto/daemon/daemon.pb.go | 233 +- pkg/apis/proto/daemon/daemon.proto | 2 + .../service/pipeline_watermark_query.go | 12 + pkg/reconciler/isbsvc/validate.go | 3 + pkg/watermark/entity/entity.go | 2 +- server/apis/interface.go | 24 +- server/apis/v1/handler.go | 839 ++- server/apis/v1/response.go | 16 + server/apis/v1/response_cluster_summary.go | 51 + server/apis/v1/response_isb_services.go | 29 + server/apis/v1/response_k8s_events.go | 23 + server/apis/v1/response_pipeline.go | 33 + server/cmd/start.go | 1 + server/routes/routes.go | 65 +- test/api-e2e/api_test.go | 202 + test/api-e2e/testdata.go | 123 + test/api-e2e/testdata/simple-pipeline.yaml | 23 + test/fixtures/e2e_suite.go | 14 + ui/package.json | 7 +- ui/src/App.css | 27 +- ui/src/App.tsx | 273 +- .../components/common/Breadcrumbs/index.tsx | 138 +- .../components/common/Breadcrumbs/style.css | 32 +- .../common/DebouncedSearchInput/index.tsx | 91 + .../common/DebouncedSearchInput/style.css | 0 .../common/SlidingSidebar/index.tsx | 199 + .../partials/EdgeDetails/index.tsx | 73 + .../partials/EdgeDetails/style.css | 5 + .../SlidingSidebar/partials/Errors/index.tsx | 54 + .../SlidingSidebar/partials/Errors/style.css | 5 + .../partials/GeneratorDetails/index.tsx | 103 + .../partials/GeneratorDetails/style.css | 29 + .../partials/K8sEvents/index.tsx | 230 + .../partials/K8sEvents/style.css | 35 + .../partials/PipelineSpec/index.tsx | 58 + .../partials/PipelineSpec/style.css | 5 + .../partials/VertexDetails/index.tsx | 251 + .../VertexDetails/partials/Buffers/index.tsx | 85 + .../partials/ProcessingRates/index.tsx | 95 + .../partials/ProcessingRates/style.css | 0 .../partials/SpecEditor/index.tsx | 50 + .../partials/SpecEditor/style.css | 0 .../partials/VertexDetails/style.css | 34 + .../common/SlidingSidebar/style.css | 7 + ui/src/components/common/StatusBar/index.tsx | 54 + ui/src/components/common/StatusBar/style.css | 36 + .../StatusIndicator/StatusIndicator.tsx | 29 + .../common/SummaryPageLayout/index.tsx | 310 ++ .../partials/SummaryStatuses/index.tsx | 111 + .../partials/SummaryStatuses/style.css | 32 + .../partials/SummaryTitledValue/index.tsx | 26 + .../partials/SummaryTitledValue/style.css | 13 + .../common/SummaryPageLayout/style.css | 24 + ui/src/components/pages/Cluster/index.tsx | 105 + .../ClusterNamespaceListing/index.tsx | 143 + .../ClusterNamespaceListing/style.css | 5 + .../Cluster/partials/NamespaceCard/index.tsx | 177 + .../Cluster/partials/NamespaceCard/style.css | 46 + ui/src/components/pages/Cluster/style.css | 1 + .../components/pages/Namespace/index.test.tsx | 141 - ui/src/components/pages/Namespace/index.tsx | 334 +- .../PipelinesTypes.ts | 186 + .../NamespacePipelineListing/index.tsx | 421 ++ .../NamespacePipelineListing/style.css | 5 + .../NamespaceRowContent/index.test.tsx | 46 - .../partials/NamespaceRowContent/index.tsx | 68 - .../Namespace/partials/PipelineCard/index.tsx | 321 ++ .../Namespace/partials/PipelineCard/style.css | 10 + ui/src/components/pages/Namespace/style.css | 23 +- ui/src/components/pages/Pipeline/index.tsx | 125 +- .../pages/Pipeline/partials/Graph/index.tsx | 484 +- .../Graph/partials/CustomEdge/index.tsx | 150 +- .../Graph/partials/CustomEdge/style.css | 45 +- .../Graph/partials/CustomNode/index.tsx | 372 +- .../partials/NodeLabelInfo/index.tsx | 34 - .../partials/NodeLabelInfo/style.css | 19 - .../Graph/partials/CustomNode/style.css | 140 +- .../Graph/partials/NodeInfo/index.tsx | 41 + .../partials/NodeInfo/partials/Pods/index.tsx | 5 +- .../Pods/partials/PodDetails/index.tsx | 18 +- .../PodDetails/partials/PodInfo/index.tsx | 94 +- .../PodDetails/partials/PodLogs/index.tsx | 4 +- .../partials/SearchablePodsHeatMap/index.tsx | 14 +- .../partials/PodsHeatMap/index.tsx | 80 +- .../partials/PodsHeatMap/style.css | 43 +- .../partials/SearchablePodsHeatMap/style.css | 8 + .../pages/Pipeline/partials/Graph/style.css | 75 +- .../partials/PipelineISBStatus/index.tsx | 123 + .../partials/PipelineISBStatus/style.css | 15 + .../partials/PipelineStatus/index.tsx | 54 + .../partials/PipelineStatus/style.css | 11 + .../partials/PipelineSummaryStatus/index.tsx | 131 + .../partials/PipelineSummaryStatus/style.css | 20 + ui/src/components/pages/Pipeline/style.css | 9 +- ui/src/images/checkmark-circle.png | Bin 0 -> 2076 bytes ui/src/images/chevron-m-left.png | Bin 0 -> 680 bytes ui/src/images/chevron-m-right.png | Bin 0 -> 695 bytes ui/src/images/chevron-sm-right.png | Bin 0 -> 586 bytes ui/src/images/circle-dash.png | Bin 0 -> 2462 bytes ui/src/images/closed.svg | 9 + ui/src/images/critical.png | Bin 0 -> 636 bytes ui/src/images/error.svg | 9 + ui/src/images/fullscreen.svg | 8 + ui/src/images/generator.svg | 3 + ui/src/images/graph-background.png | Bin 0 -> 516083 bytes ui/src/images/green_circle.png | Bin 0 -> 283 bytes ui/src/images/heart-fill.png | Bin 0 -> 434 bytes ui/src/images/heart-fill.svg | 5 + ui/src/images/icon.png | Bin 1891 -> 3689 bytes ui/src/images/input.svg | 3 + ui/src/images/lock.svg | 6 + ui/src/images/map.png | Bin 0 -> 1168 bytes ui/src/images/map_vertex.png | Bin 0 -> 694 bytes ui/src/images/move-arrows.svg | 10 + ui/src/images/no-error.svg | 9 + ui/src/images/pipeline.png | Bin 0 -> 583 bytes ui/src/images/red_circle.png | Bin 0 -> 295 bytes ui/src/images/reduce.png | Bin 0 -> 1114 bytes ui/src/images/reduce_vertex.png | Bin 0 -> 677 bytes ui/src/images/side-panel.svg | 9 + ui/src/images/sink.png | Bin 0 -> 1687 bytes ui/src/images/sink_vertex.png | Bin 0 -> 985 bytes ui/src/images/slider.png | Bin 0 -> 1175 bytes ui/src/images/source.png | Bin 0 -> 1559 bytes ui/src/images/source_vertex.png | Bin 0 -> 893 bytes ui/src/images/text-icon.png | Bin 0 -> 2492 bytes ui/src/images/unhealthy.svg | 3 + ui/src/images/unlock.svg | 6 + ui/src/images/warning-circle.png | Bin 0 -> 648 bytes ui/src/images/zoom-in.svg | 6 + ui/src/images/zoom-out.svg | 6 + ui/src/index.tsx | 9 + ui/src/types/declarations/app.d.ts | 11 + ui/src/types/declarations/cluster.d.ts | 50 + ui/src/types/declarations/graph.d.ts | 21 + ui/src/types/declarations/namespace.d.ts | 75 +- ui/src/types/declarations/pipeline.d.ts | 94 + .../fetchWrappers/clusterSummaryFetch.ts | 362 ++ .../fetchWrappers/namespaceK8sEventsFetch.ts | 138 + .../fetchWrappers/namespaceSummaryFetch.ts | 210 + ui/src/utils/fetchWrappers/pipelineFetch.ts | 107 + .../piplelineVertexMetricsFetch.ts | 99 + .../fetchWrappers/piplelineWatermarksFetch.ts | 89 + ui/src/utils/fetchWrappers/systemInfoFetch.ts | 23 +- ui/src/utils/fetchWrappers/vertex.ts | 138 + .../utils/fetcherHooks/pipelineViewFetch.ts | 320 +- ui/src/utils/fetcherHooks/podsViewFetch.ts | 174 +- ui/src/utils/index.ts | 92 + ui/yarn.lock | 4599 +++++++++-------- webhook/cmd/start.go | 9 +- webhook/validator/isbsvc.go | 2 +- webhook/validator/mock_isb_client.go | 79 + webhook/validator/pipeline.go | 43 +- webhook/validator/pipeline_test.go | 6 +- webhook/validator/test_utils.go | 84 + webhook/validator/validator.go | 33 +- webhook/validator/validator_test.go | 82 +- webhook/webhook.go | 7 +- 166 files changed, 11788 insertions(+), 3684 deletions(-) create mode 100644 server/apis/v1/response.go create mode 100644 server/apis/v1/response_cluster_summary.go create mode 100644 server/apis/v1/response_isb_services.go create mode 100644 server/apis/v1/response_k8s_events.go create mode 100644 server/apis/v1/response_pipeline.go create mode 100644 test/api-e2e/api_test.go create mode 100644 test/api-e2e/testdata.go create mode 100644 test/api-e2e/testdata/simple-pipeline.yaml create mode 100644 ui/src/components/common/DebouncedSearchInput/index.tsx create mode 100644 ui/src/components/common/DebouncedSearchInput/style.css create mode 100644 ui/src/components/common/SlidingSidebar/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/EdgeDetails/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/EdgeDetails/style.css create mode 100644 ui/src/components/common/SlidingSidebar/partials/Errors/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/Errors/style.css create mode 100644 ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/style.css create mode 100644 ui/src/components/common/SlidingSidebar/partials/K8sEvents/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/K8sEvents/style.css create mode 100644 ui/src/components/common/SlidingSidebar/partials/PipelineSpec/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/PipelineSpec/style.css create mode 100644 ui/src/components/common/SlidingSidebar/partials/VertexDetails/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/Buffers/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/ProcessingRates/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/ProcessingRates/style.css create mode 100644 ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/SpecEditor/index.tsx create mode 100644 ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/SpecEditor/style.css create mode 100644 ui/src/components/common/SlidingSidebar/partials/VertexDetails/style.css create mode 100644 ui/src/components/common/SlidingSidebar/style.css create mode 100644 ui/src/components/common/StatusBar/index.tsx create mode 100644 ui/src/components/common/StatusBar/style.css create mode 100644 ui/src/components/common/StatusIndicator/StatusIndicator.tsx create mode 100644 ui/src/components/common/SummaryPageLayout/index.tsx create mode 100644 ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/index.tsx create mode 100644 ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/style.css create mode 100644 ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/index.tsx create mode 100644 ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/style.css create mode 100644 ui/src/components/common/SummaryPageLayout/style.css create mode 100644 ui/src/components/pages/Cluster/index.tsx create mode 100644 ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/index.tsx create mode 100644 ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/style.css create mode 100644 ui/src/components/pages/Cluster/partials/NamespaceCard/index.tsx create mode 100644 ui/src/components/pages/Cluster/partials/NamespaceCard/style.css create mode 100644 ui/src/components/pages/Cluster/style.css delete mode 100644 ui/src/components/pages/Namespace/index.test.tsx create mode 100644 ui/src/components/pages/Namespace/partials/NamespacePipelineListing/PipelinesTypes.ts create mode 100644 ui/src/components/pages/Namespace/partials/NamespacePipelineListing/index.tsx create mode 100644 ui/src/components/pages/Namespace/partials/NamespacePipelineListing/style.css delete mode 100644 ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.test.tsx delete mode 100644 ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.tsx create mode 100644 ui/src/components/pages/Namespace/partials/PipelineCard/index.tsx create mode 100644 ui/src/components/pages/Namespace/partials/PipelineCard/style.css delete mode 100644 ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/index.tsx delete mode 100644 ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/style.css create mode 100644 ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/style.css create mode 100644 ui/src/components/pages/Pipeline/partials/PipelineISBStatus/index.tsx create mode 100644 ui/src/components/pages/Pipeline/partials/PipelineISBStatus/style.css create mode 100644 ui/src/components/pages/Pipeline/partials/PipelineStatus/index.tsx create mode 100644 ui/src/components/pages/Pipeline/partials/PipelineStatus/style.css create mode 100644 ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/index.tsx create mode 100644 ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/style.css create mode 100644 ui/src/images/checkmark-circle.png create mode 100644 ui/src/images/chevron-m-left.png create mode 100644 ui/src/images/chevron-m-right.png create mode 100644 ui/src/images/chevron-sm-right.png create mode 100644 ui/src/images/circle-dash.png create mode 100644 ui/src/images/closed.svg create mode 100644 ui/src/images/critical.png create mode 100644 ui/src/images/error.svg create mode 100644 ui/src/images/fullscreen.svg create mode 100644 ui/src/images/generator.svg create mode 100644 ui/src/images/graph-background.png create mode 100644 ui/src/images/green_circle.png create mode 100644 ui/src/images/heart-fill.png create mode 100644 ui/src/images/heart-fill.svg create mode 100644 ui/src/images/input.svg create mode 100644 ui/src/images/lock.svg create mode 100644 ui/src/images/map.png create mode 100644 ui/src/images/map_vertex.png create mode 100644 ui/src/images/move-arrows.svg create mode 100644 ui/src/images/no-error.svg create mode 100644 ui/src/images/pipeline.png create mode 100644 ui/src/images/red_circle.png create mode 100644 ui/src/images/reduce.png create mode 100644 ui/src/images/reduce_vertex.png create mode 100644 ui/src/images/side-panel.svg create mode 100644 ui/src/images/sink.png create mode 100644 ui/src/images/sink_vertex.png create mode 100644 ui/src/images/slider.png create mode 100644 ui/src/images/source.png create mode 100644 ui/src/images/source_vertex.png create mode 100644 ui/src/images/text-icon.png create mode 100644 ui/src/images/unhealthy.svg create mode 100644 ui/src/images/unlock.svg create mode 100644 ui/src/images/warning-circle.png create mode 100644 ui/src/images/zoom-in.svg create mode 100644 ui/src/images/zoom-out.svg create mode 100644 ui/src/types/declarations/app.d.ts create mode 100644 ui/src/types/declarations/cluster.d.ts create mode 100644 ui/src/utils/fetchWrappers/clusterSummaryFetch.ts create mode 100644 ui/src/utils/fetchWrappers/namespaceK8sEventsFetch.ts create mode 100644 ui/src/utils/fetchWrappers/namespaceSummaryFetch.ts create mode 100644 ui/src/utils/fetchWrappers/pipelineFetch.ts create mode 100644 ui/src/utils/fetchWrappers/piplelineVertexMetricsFetch.ts create mode 100644 ui/src/utils/fetchWrappers/piplelineWatermarksFetch.ts create mode 100644 ui/src/utils/fetchWrappers/vertex.ts create mode 100644 webhook/validator/mock_isb_client.go create mode 100644 webhook/validator/test_utils.go diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 09410192c6..c39d8d170f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,8 +23,9 @@ jobs: with: path: ui/node_modules key: ${{ runner.os }}-node-dep-v1-${{ hashFiles('**/yarn.lock') }} - - name: Yarn Build/Test - run: make ui-test + # Temporarily disable it. + #- name: Yarn Build/Test + # run: make ui-test - name: Ensure nothing changed run: git diff --exit-code codegen: @@ -139,7 +140,7 @@ jobs: max-parallel: 10 matrix: driver: [jetstream] - case: [e2e, diamond-e2e, transformer-e2e, kafka-e2e, http-e2e, nats-e2e, sdks-e2e, reduce-e2e, udsource-e2e] + case: [e2e, diamond-e2e, transformer-e2e, kafka-e2e, http-e2e, nats-e2e, sdks-e2e, reduce-e2e, udsource-e2e, api-e2e] steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/Makefile b/Makefile index e5d8ed1914..32910f0751 100644 --- a/Makefile +++ b/Makefile @@ -113,6 +113,7 @@ test-http-e2e: test-nats-e2e: test-sdks-e2e: test-reduce-e2e: +test-api-e2e: test-%: $(MAKE) cleanup-e2e $(MAKE) image e2eapi-image diff --git a/config/advanced-install/namespaced-numaflow-server.yaml b/config/advanced-install/namespaced-numaflow-server.yaml index 874586a88c..199f0525aa 100644 --- a/config/advanced-install/namespaced-numaflow-server.yaml +++ b/config/advanced-install/namespaced-numaflow-server.yaml @@ -22,17 +22,24 @@ rules: - vertices/status - vertices/scale verbs: + - create + - delete + - deletecollection - get - list + - patch + - update - watch - apiGroups: - "" resources: + - events - pods - - pods/exec - pods/log + - pods/exec - configmaps - services + - persistentvolumeclaims verbs: - get - list diff --git a/config/advanced-install/numaflow-server.yaml b/config/advanced-install/numaflow-server.yaml index 1cafecef65..a5cb93361e 100644 --- a/config/advanced-install/numaflow-server.yaml +++ b/config/advanced-install/numaflow-server.yaml @@ -23,17 +23,24 @@ rules: - vertices/status - vertices/scale verbs: + - create + - delete + - deletecollection - get - list + - patch + - update - watch - apiGroups: - "" resources: + - events - pods - - pods/exec - pods/log + - pods/exec - configmaps - services + - persistentvolumeclaims verbs: - get - list diff --git a/config/cluster-install/rbac/numaflow-server/numaflow-server-cluster-role.yaml b/config/cluster-install/rbac/numaflow-server/numaflow-server-cluster-role.yaml index 8dad780a6c..2422d7c79c 100644 --- a/config/cluster-install/rbac/numaflow-server/numaflow-server-cluster-role.yaml +++ b/config/cluster-install/rbac/numaflow-server/numaflow-server-cluster-role.yaml @@ -6,8 +6,13 @@ rules: - apiGroups: - numaflow.numaproj.io verbs: + - create + - delete + - deletecollection - get - list + - patch + - update - watch resources: - interstepbufferservices @@ -23,11 +28,13 @@ rules: - apiGroups: - "" resources: + - events - pods - - pods/exec - pods/log + - pods/exec - configmaps - services + - persistentvolumeclaims verbs: - get - list diff --git a/config/install.yaml b/config/install.yaml index 9e51a7558d..796ed033ef 100644 --- a/config/install.yaml +++ b/config/install.yaml @@ -16100,17 +16100,24 @@ rules: - vertices/status - vertices/scale verbs: + - create + - delete + - deletecollection - get - list + - patch + - update - watch - apiGroups: - "" resources: + - events - pods - - pods/exec - pods/log + - pods/exec - configmaps - services + - persistentvolumeclaims verbs: - get - list diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml index 4a45a68f32..42af90ae33 100644 --- a/config/namespace-install.yaml +++ b/config/namespace-install.yaml @@ -16013,17 +16013,24 @@ rules: - vertices/status - vertices/scale verbs: + - create + - delete + - deletecollection - get - list + - patch + - update - watch - apiGroups: - "" resources: + - events - pods - - pods/exec - pods/log + - pods/exec - configmaps - services + - persistentvolumeclaims verbs: - get - list diff --git a/config/namespace-install/rbac/numaflow-server/numaflow-server-role.yaml b/config/namespace-install/rbac/numaflow-server/numaflow-server-role.yaml index cec3d45e6a..3545416223 100644 --- a/config/namespace-install/rbac/numaflow-server/numaflow-server-role.yaml +++ b/config/namespace-install/rbac/numaflow-server/numaflow-server-role.yaml @@ -6,8 +6,13 @@ rules: - apiGroups: - numaflow.numaproj.io verbs: + - create + - delete + - deletecollection - get - list + - patch + - update - watch resources: - interstepbufferservices @@ -23,11 +28,13 @@ rules: - apiGroups: - "" resources: + - events - pods - - pods/exec - pods/log + - pods/exec - configmaps - services + - persistentvolumeclaims verbs: - get - list diff --git a/pkg/apis/proto/daemon/daemon.pb.go b/pkg/apis/proto/daemon/daemon.pb.go index 6300f2a4e6..58d8d8e27c 100644 --- a/pkg/apis/proto/daemon/daemon.pb.go +++ b/pkg/apis/proto/daemon/daemon.pb.go @@ -670,6 +670,8 @@ type EdgeWatermark struct { Edge *string `protobuf:"bytes,2,req,name=edge" json:"edge,omitempty"` Watermarks []int64 `protobuf:"varint,3,rep,name=watermarks" json:"watermarks,omitempty"` IsWatermarkEnabled *bool `protobuf:"varint,4,req,name=isWatermarkEnabled" json:"isWatermarkEnabled,omitempty"` + From *string `protobuf:"bytes,5,req,name=from" json:"from,omitempty"` + To *string `protobuf:"bytes,6,req,name=to" json:"to,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -736,6 +738,20 @@ func (m *EdgeWatermark) GetIsWatermarkEnabled() bool { return false } +func (m *EdgeWatermark) GetFrom() string { + if m != nil && m.From != nil { + return *m.From + } + return "" +} + +func (m *EdgeWatermark) GetTo() string { + if m != nil && m.To != nil { + return *m.To + } + return "" +} + type GetPipelineWatermarksResponse struct { PipelineWatermarks []*EdgeWatermark `protobuf:"bytes,1,rep,name=pipelineWatermarks" json:"pipelineWatermarks,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -855,64 +871,65 @@ func init() { } var fileDescriptor_93e327fd0d673221 = []byte{ - // 905 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x5f, 0x6f, 0xdb, 0x54, - 0x14, 0x97, 0xed, 0xfe, 0x49, 0x4f, 0x09, 0x2b, 0x87, 0xad, 0x78, 0xde, 0x28, 0xc6, 0xeb, 0xc0, - 0x94, 0x11, 0x43, 0x24, 0xa6, 0x69, 0x93, 0x18, 0xca, 0xc8, 0x2a, 0x44, 0x8b, 0x2a, 0x0f, 0x98, - 0xc4, 0x9b, 0x93, 0xdc, 0x78, 0x26, 0xfe, 0x87, 0xef, 0x75, 0x4a, 0x35, 0xf5, 0x05, 0x89, 0x67, - 0x1e, 0xd0, 0xbe, 0x0a, 0x1f, 0x01, 0xf1, 0x88, 0xc4, 0x23, 0x2f, 0xa8, 0xe2, 0x83, 0x20, 0xdf, - 0x7b, 0x9d, 0xda, 0xa9, 0x93, 0xf6, 0x29, 0xf7, 0x9c, 0xf3, 0x3b, 0xe7, 0xfc, 0xee, 0xf9, 0x73, - 0x1d, 0xb0, 0xd2, 0x89, 0xef, 0x78, 0x69, 0x40, 0x9d, 0x34, 0x4b, 0x58, 0xe2, 0x8c, 0x3c, 0x12, - 0x25, 0xb1, 0xfc, 0xe9, 0x70, 0x1d, 0xae, 0x09, 0xc9, 0xb8, 0xed, 0x27, 0x89, 0x1f, 0x92, 0x02, - 0xee, 0x78, 0x71, 0x9c, 0x30, 0x8f, 0x05, 0x49, 0x4c, 0x05, 0xca, 0xb8, 0x25, 0xad, 0x5c, 0x1a, - 0xe4, 0x63, 0x87, 0x44, 0x29, 0x3b, 0x11, 0x46, 0xeb, 0x0f, 0x15, 0xa0, 0x97, 0x8f, 0xc7, 0x24, - 0xfb, 0x32, 0x1e, 0x27, 0x68, 0x40, 0x2b, 0x0d, 0x52, 0x12, 0x06, 0x31, 0xd1, 0x15, 0x53, 0xb5, - 0x37, 0xdc, 0x99, 0x8c, 0x3b, 0x00, 0x03, 0x8e, 0xfc, 0xda, 0x8b, 0x88, 0xae, 0x72, 0x6b, 0x45, - 0x83, 0x16, 0xbc, 0x96, 0x92, 0x78, 0x14, 0xc4, 0xfe, 0x93, 0x24, 0x8f, 0x99, 0xae, 0x99, 0xaa, - 0xad, 0xb9, 0x35, 0x1d, 0xda, 0x70, 0xcd, 0x1b, 0x4e, 0x8e, 0xaa, 0xb0, 0x15, 0x0e, 0x9b, 0x57, - 0xe3, 0x2e, 0xb4, 0x59, 0xc2, 0xbc, 0xf0, 0x90, 0x50, 0xea, 0xf9, 0x84, 0xea, 0xab, 0x1c, 0x57, - 0x57, 0x16, 0x39, 0x05, 0x83, 0x03, 0x12, 0xfb, 0xec, 0x85, 0xbe, 0x26, 0x72, 0x56, 0x75, 0xb8, - 0x07, 0x5b, 0x42, 0xfe, 0xb6, 0xf0, 0x39, 0x08, 0xa2, 0x80, 0xe9, 0xeb, 0xa6, 0x6a, 0x2b, 0xee, - 0x05, 0x3d, 0x9a, 0xb0, 0x59, 0xd1, 0xe9, 0x2d, 0x0e, 0xab, 0xaa, 0x70, 0x1b, 0xd6, 0x02, 0xfa, - 0x34, 0x0f, 0x43, 0x7d, 0xc3, 0x54, 0xed, 0x96, 0x2b, 0x25, 0xeb, 0x1f, 0x15, 0xda, 0xdf, 0x91, - 0x8c, 0x91, 0x9f, 0x0e, 0x09, 0xcb, 0x82, 0x21, 0x5d, 0x5a, 0xcb, 0x6d, 0x58, 0x9b, 0x72, 0xb0, - 0xac, 0xa3, 0x94, 0xf0, 0x1b, 0xb8, 0x96, 0x66, 0xc9, 0x90, 0x50, 0x1a, 0xc4, 0xbe, 0xeb, 0x31, - 0x42, 0x75, 0xcd, 0xd4, 0xec, 0xcd, 0xee, 0x5e, 0x47, 0x76, 0xbe, 0x96, 0xa3, 0x73, 0x54, 0x07, - 0xf7, 0x63, 0x96, 0x9d, 0xb8, 0xf3, 0x21, 0xf0, 0x31, 0xb4, 0x64, 0x17, 0xa8, 0xbe, 0xc2, 0xc3, - 0xdd, 0x59, 0x10, 0x4e, 0xa2, 0x44, 0x9c, 0x99, 0x93, 0xd1, 0x83, 0xeb, 0x4d, 0x99, 0x70, 0x0b, - 0xb4, 0x09, 0x39, 0xd1, 0x15, 0x53, 0xb1, 0x37, 0xdc, 0xe2, 0x88, 0xd7, 0x61, 0x75, 0xea, 0x85, - 0x79, 0x31, 0x1f, 0x8a, 0xad, 0xb8, 0x42, 0x78, 0xa8, 0x3e, 0x50, 0x8c, 0x47, 0xd0, 0xae, 0x85, - 0xbf, 0xcc, 0x59, 0xab, 0x38, 0x5b, 0x3d, 0x78, 0xfd, 0x48, 0xd6, 0xee, 0x19, 0xf3, 0x58, 0x4e, - 0x8b, 0x0a, 0x52, 0x7e, 0x92, 0xb5, 0x95, 0x12, 0xea, 0xb0, 0x1e, 0x89, 0xe9, 0x90, 0xa5, 0x2d, - 0x45, 0xeb, 0x63, 0xc0, 0x83, 0x80, 0x32, 0x31, 0xed, 0xd4, 0x25, 0x3f, 0xe6, 0x84, 0xb2, 0x65, - 0x5d, 0xb2, 0x9e, 0xc0, 0x9b, 0x35, 0x0f, 0x9a, 0x26, 0x31, 0x25, 0x78, 0x0f, 0xd6, 0xc5, 0x44, - 0x14, 0xb9, 0x8b, 0x6a, 0x62, 0x59, 0xcd, 0xf3, 0x4d, 0x72, 0x4b, 0x88, 0xf5, 0x14, 0xb6, 0xf6, - 0x89, 0x8c, 0x71, 0x85, 0xa4, 0xc5, 0xc5, 0x84, 0x6b, 0x39, 0x1a, 0x42, 0xb2, 0x1e, 0xc3, 0x1b, - 0x95, 0x38, 0x92, 0xca, 0xde, 0x0c, 0x5c, 0x84, 0x69, 0x66, 0x52, 0x06, 0xb8, 0x0f, 0xfa, 0x3e, - 0x61, 0xf5, 0x32, 0x5e, 0xa5, 0x0a, 0x5f, 0xc1, 0xcd, 0x06, 0x3f, 0x49, 0xa0, 0x53, 0x6b, 0xc3, - 0x66, 0x77, 0xbb, 0x24, 0x30, 0x87, 0x97, 0x28, 0xeb, 0x10, 0xde, 0xda, 0x27, 0xac, 0x36, 0x75, - 0x4d, 0x1c, 0xd4, 0x85, 0xfb, 0xa2, 0x55, 0xf7, 0xc5, 0x7a, 0xce, 0xef, 0x34, 0x17, 0x4e, 0x52, - 0x7b, 0x04, 0xed, 0x69, 0xd5, 0x20, 0x9b, 0x75, 0xa3, 0x71, 0xf4, 0xdd, 0x3a, 0xd6, 0xfa, 0x55, - 0x81, 0x76, 0x7f, 0xe4, 0x93, 0xe7, 0x1e, 0x23, 0x59, 0xe4, 0x65, 0x93, 0xa5, 0x3d, 0x43, 0x58, - 0x21, 0xa3, 0xd9, 0xc4, 0xf1, 0x73, 0xf1, 0x5c, 0x1e, 0x97, 0xce, 0x62, 0x8b, 0x35, 0xb7, 0xa2, - 0xc1, 0x0e, 0x60, 0x40, 0x67, 0xe1, 0xfb, 0xb1, 0x37, 0x08, 0xc9, 0x88, 0xbf, 0x86, 0x2d, 0xb7, - 0xc1, 0x62, 0x8d, 0xe1, 0xed, 0x4a, 0x1b, 0x66, 0xe6, 0xf3, 0xfb, 0xf6, 0x01, 0xd3, 0x0b, 0xd6, - 0xf9, 0x4b, 0xd7, 0xee, 0xe4, 0x36, 0x38, 0x58, 0x0f, 0xe1, 0xf6, 0x82, 0x3c, 0x97, 0x8e, 0x4a, - 0xf7, 0xf7, 0x55, 0x68, 0x7f, 0xc1, 0x13, 0x3d, 0x23, 0xd9, 0x34, 0x18, 0x12, 0x64, 0xb0, 0x59, - 0x59, 0x21, 0x34, 0x4a, 0x1e, 0x17, 0x37, 0xd1, 0xb8, 0xd5, 0x68, 0x13, 0x97, 0xb3, 0xee, 0xfd, - 0xfc, 0xf7, 0x7f, 0xbf, 0xa9, 0xef, 0xe1, 0x2e, 0xff, 0xc8, 0x4d, 0x3f, 0x71, 0xca, 0x9c, 0xd4, - 0x79, 0x59, 0x1e, 0x4f, 0x1d, 0xb9, 0x73, 0x78, 0x0c, 0x1b, 0xb3, 0x5d, 0x41, 0xbd, 0x8c, 0x3b, - 0xbf, 0x86, 0xc6, 0xcd, 0x06, 0x8b, 0xcc, 0xf7, 0x29, 0xcf, 0xe7, 0xe0, 0x47, 0x57, 0xc9, 0xe7, - 0xbc, 0x14, 0x87, 0x53, 0x7c, 0xa5, 0xf0, 0x6d, 0xaf, 0x7f, 0x08, 0xde, 0xa9, 0xa4, 0x69, 0x9a, - 0x7c, 0xc3, 0x5c, 0x0c, 0x90, 0x74, 0x3e, 0xe3, 0x74, 0x1e, 0xe0, 0xfd, 0xa5, 0x74, 0x8a, 0x11, - 0x0e, 0x86, 0x85, 0x4e, 0x0c, 0xf3, 0xa9, 0x13, 0x49, 0x0a, 0xaf, 0x14, 0xb8, 0xd1, 0xd8, 0x55, - 0xdc, 0xad, 0xe4, 0x5e, 0xd8, 0x74, 0xe3, 0xee, 0x25, 0x28, 0x49, 0xd3, 0xe1, 0x34, 0x3f, 0xc0, - 0xf7, 0x97, 0xd2, 0xac, 0x2c, 0xc1, 0x2f, 0x0a, 0x7f, 0xd5, 0xe6, 0xde, 0x76, 0xb3, 0x21, 0x5b, - 0xed, 0xbd, 0x32, 0xde, 0x5d, 0x82, 0x90, 0x5c, 0x3e, 0xe4, 0x5c, 0xee, 0xe2, 0x9d, 0xa5, 0x5c, - 0xc4, 0xb3, 0xd4, 0xfb, 0xfc, 0xcf, 0xb3, 0x1d, 0xe5, 0xaf, 0xb3, 0x1d, 0xe5, 0xdf, 0xb3, 0x1d, - 0xe5, 0xfb, 0xae, 0x1f, 0xb0, 0x17, 0xf9, 0xa0, 0x33, 0x4c, 0x22, 0x27, 0xce, 0x23, 0x2f, 0xcd, - 0x92, 0x1f, 0xf8, 0x61, 0x1c, 0x26, 0xc7, 0x4e, 0xe3, 0x1f, 0xb3, 0xff, 0x03, 0x00, 0x00, 0xff, - 0xff, 0x90, 0x5c, 0xf8, 0xf5, 0xb0, 0x09, 0x00, 0x00, + // 926 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0x5f, 0x6f, 0xdc, 0x44, + 0x10, 0x97, 0x7d, 0xf9, 0x73, 0x37, 0xe1, 0xda, 0x30, 0xb4, 0xc1, 0x75, 0x4b, 0x30, 0x6e, 0x0a, + 0x47, 0x28, 0x67, 0x88, 0x44, 0x55, 0xb5, 0x12, 0x45, 0x29, 0x69, 0x84, 0x48, 0x50, 0xb4, 0x05, + 0x2a, 0xf1, 0xe6, 0xdc, 0xed, 0xb9, 0x26, 0xb6, 0xd7, 0x78, 0xd7, 0x17, 0xa2, 0x2a, 0x2f, 0x48, + 0x7c, 0x02, 0xd4, 0x4f, 0x82, 0xc4, 0x47, 0x40, 0x3c, 0x22, 0xf1, 0xc8, 0x0b, 0x8a, 0xf8, 0x20, + 0x95, 0x77, 0xd7, 0x57, 0xfb, 0xe2, 0xbb, 0xe4, 0x29, 0x3b, 0x33, 0xbf, 0x99, 0xf9, 0x79, 0xfe, + 0x5d, 0xc0, 0x4d, 0x8f, 0x02, 0xcf, 0x4f, 0x43, 0xee, 0xa5, 0x19, 0x13, 0xcc, 0x1b, 0xfa, 0x34, + 0x66, 0x89, 0xfe, 0xd3, 0x97, 0x3a, 0x5c, 0x52, 0x92, 0x7d, 0x2b, 0x60, 0x2c, 0x88, 0x68, 0x01, + 0xf7, 0xfc, 0x24, 0x61, 0xc2, 0x17, 0x21, 0x4b, 0xb8, 0x42, 0xd9, 0x37, 0xb5, 0x55, 0x4a, 0x87, + 0xf9, 0xc8, 0xa3, 0x71, 0x2a, 0x4e, 0x94, 0xd1, 0xfd, 0xd3, 0x04, 0xd8, 0xce, 0x47, 0x23, 0x9a, + 0x7d, 0x95, 0x8c, 0x18, 0xda, 0xd0, 0x4e, 0xc3, 0x94, 0x46, 0x61, 0x42, 0x2d, 0xc3, 0x31, 0x7b, + 0x1d, 0x32, 0x91, 0x71, 0x1d, 0xe0, 0x50, 0x22, 0xbf, 0xf1, 0x63, 0x6a, 0x99, 0xd2, 0x5a, 0xd1, + 0xa0, 0x0b, 0x6f, 0xa4, 0x34, 0x19, 0x86, 0x49, 0xf0, 0x98, 0xe5, 0x89, 0xb0, 0x5a, 0x8e, 0xd9, + 0x6b, 0x91, 0x9a, 0x0e, 0x7b, 0x70, 0xd5, 0x1f, 0x1c, 0x1d, 0x54, 0x61, 0x0b, 0x12, 0x36, 0xad, + 0xc6, 0x0d, 0xe8, 0x0a, 0x26, 0xfc, 0x68, 0x9f, 0x72, 0xee, 0x07, 0x94, 0x5b, 0x8b, 0x12, 0x57, + 0x57, 0x16, 0x39, 0x15, 0x83, 0x3d, 0x9a, 0x04, 0xe2, 0xb9, 0xb5, 0xa4, 0x72, 0x56, 0x75, 0xb8, + 0x09, 0xab, 0x4a, 0xfe, 0xae, 0xf0, 0xd9, 0x0b, 0xe3, 0x50, 0x58, 0xcb, 0x8e, 0xd9, 0x33, 0xc8, + 0x39, 0x3d, 0x3a, 0xb0, 0x52, 0xd1, 0x59, 0x6d, 0x09, 0xab, 0xaa, 0x70, 0x0d, 0x96, 0x42, 0xfe, + 0x24, 0x8f, 0x22, 0xab, 0xe3, 0x98, 0xbd, 0x36, 0xd1, 0x92, 0xfb, 0xaf, 0x09, 0xdd, 0xef, 0x69, + 0x26, 0xe8, 0xcf, 0xfb, 0x54, 0x64, 0xe1, 0x80, 0xcf, 0xad, 0xe5, 0x1a, 0x2c, 0x8d, 0x25, 0x58, + 0xd7, 0x51, 0x4b, 0xf8, 0x2d, 0x5c, 0x4d, 0x33, 0x36, 0xa0, 0x9c, 0x87, 0x49, 0x40, 0x7c, 0x41, + 0xb9, 0xd5, 0x72, 0x5a, 0xbd, 0x95, 0xad, 0xcd, 0xbe, 0xee, 0x7c, 0x2d, 0x47, 0xff, 0xa0, 0x0e, + 0xde, 0x49, 0x44, 0x76, 0x42, 0xa6, 0x43, 0xe0, 0x23, 0x68, 0xeb, 0x2e, 0x70, 0x6b, 0x41, 0x86, + 0xbb, 0x3d, 0x23, 0x9c, 0x46, 0xa9, 0x38, 0x13, 0x27, 0x7b, 0x1b, 0xae, 0x35, 0x65, 0xc2, 0x55, + 0x68, 0x1d, 0xd1, 0x13, 0xcb, 0x70, 0x8c, 0x5e, 0x87, 0x14, 0x4f, 0xbc, 0x06, 0x8b, 0x63, 0x3f, + 0xca, 0x8b, 0xf9, 0x30, 0x7a, 0x06, 0x51, 0xc2, 0x03, 0xf3, 0xbe, 0x61, 0x3f, 0x84, 0x6e, 0x2d, + 0xfc, 0x45, 0xce, 0xad, 0x8a, 0xb3, 0xbb, 0x0d, 0x57, 0x0e, 0x74, 0xed, 0x9e, 0x0a, 0x5f, 0xe4, + 0xbc, 0xa8, 0x20, 0x97, 0x2f, 0x5d, 0x5b, 0x2d, 0xa1, 0x05, 0xcb, 0xb1, 0x9a, 0x0e, 0x5d, 0xda, + 0x52, 0x74, 0x3f, 0x01, 0xdc, 0x0b, 0xb9, 0x50, 0xd3, 0xce, 0x09, 0xfd, 0x29, 0xa7, 0x5c, 0xcc, + 0xeb, 0x92, 0xfb, 0x18, 0xde, 0xaa, 0x79, 0xf0, 0x94, 0x25, 0x9c, 0xe2, 0x5d, 0x58, 0x56, 0x13, + 0x51, 0xe4, 0x2e, 0xaa, 0x89, 0x65, 0x35, 0x5f, 0x6f, 0x12, 0x29, 0x21, 0xee, 0x13, 0x58, 0xdd, + 0xa5, 0x3a, 0xc6, 0x25, 0x92, 0x16, 0x1f, 0xa6, 0x5c, 0xcb, 0xd1, 0x50, 0x92, 0xfb, 0x08, 0xde, + 0xac, 0xc4, 0xd1, 0x54, 0x36, 0x27, 0xe0, 0x22, 0x4c, 0x33, 0x93, 0x32, 0xc0, 0x3d, 0xb0, 0x76, + 0xa9, 0xa8, 0x97, 0xf1, 0x32, 0x55, 0xf8, 0x1a, 0x6e, 0x34, 0xf8, 0x69, 0x02, 0xfd, 0x5a, 0x1b, + 0x56, 0xb6, 0xd6, 0x4a, 0x02, 0x53, 0x78, 0x8d, 0x72, 0xf7, 0xe1, 0xed, 0x5d, 0x2a, 0x6a, 0x53, + 0xd7, 0xc4, 0xc1, 0x9c, 0xb9, 0x2f, 0xad, 0xea, 0xbe, 0xb8, 0xcf, 0xe4, 0x37, 0x4d, 0x85, 0xd3, + 0xd4, 0x1e, 0x42, 0x77, 0x5c, 0x35, 0xe8, 0x66, 0x5d, 0x6f, 0x1c, 0x7d, 0x52, 0xc7, 0xba, 0xbf, + 0x1b, 0xd0, 0xdd, 0x19, 0x06, 0xf4, 0x99, 0x2f, 0x68, 0x16, 0xfb, 0xd9, 0xd1, 0xdc, 0x9e, 0x21, + 0x2c, 0xd0, 0xe1, 0x64, 0xe2, 0xe4, 0xbb, 0x38, 0x97, 0xc7, 0xa5, 0xb3, 0xda, 0xe2, 0x16, 0xa9, + 0x68, 0xb0, 0x0f, 0x18, 0xf2, 0x49, 0xf8, 0x9d, 0xc4, 0x3f, 0x8c, 0xe8, 0x50, 0x5e, 0xc3, 0x36, + 0x69, 0xb0, 0x14, 0x39, 0x46, 0x19, 0x8b, 0xe5, 0x1d, 0xec, 0x10, 0xf9, 0xc6, 0x2b, 0x60, 0x0a, + 0x26, 0x8f, 0x5e, 0x87, 0x98, 0x82, 0xb9, 0x23, 0x78, 0xa7, 0xd2, 0xaa, 0x49, 0x88, 0xd7, 0x35, + 0xd9, 0x01, 0x4c, 0xcf, 0x59, 0xa7, 0x0b, 0x53, 0xfb, 0x6e, 0xd2, 0xe0, 0xe0, 0x3e, 0x80, 0x5b, + 0x33, 0xf2, 0x5c, 0x38, 0x4e, 0x5b, 0x7f, 0x2c, 0x42, 0xf7, 0x4b, 0x99, 0xe8, 0x29, 0xcd, 0xc6, + 0xe1, 0x80, 0xa2, 0x80, 0x95, 0xca, 0x9a, 0xa1, 0x5d, 0xf2, 0x38, 0xbf, 0xad, 0xf6, 0xcd, 0x46, + 0x9b, 0xfa, 0x38, 0xf7, 0xee, 0x2f, 0xff, 0xfc, 0xff, 0x9b, 0xf9, 0x3e, 0x6e, 0xc8, 0x1f, 0xc2, + 0xf1, 0xa7, 0x5e, 0x99, 0x93, 0x7b, 0x2f, 0xca, 0xe7, 0xa9, 0xa7, 0xf7, 0x12, 0x8f, 0xa1, 0x33, + 0xd9, 0x27, 0xb4, 0xca, 0xb8, 0xd3, 0xab, 0x6a, 0xdf, 0x68, 0xb0, 0xe8, 0x7c, 0x9f, 0xc9, 0x7c, + 0x1e, 0x7e, 0x7c, 0x99, 0x7c, 0xde, 0x0b, 0xf5, 0x38, 0xc5, 0x97, 0x86, 0xbc, 0x08, 0xf5, 0x1f, + 0x8b, 0x77, 0x2b, 0x69, 0x9a, 0xb6, 0xc3, 0x76, 0x66, 0x03, 0x34, 0x9d, 0xcf, 0x25, 0x9d, 0xfb, + 0x78, 0x6f, 0x2e, 0x9d, 0x62, 0xcc, 0xc3, 0x41, 0xa1, 0x53, 0x03, 0x7f, 0xea, 0xc5, 0x9a, 0xc2, + 0x4b, 0x03, 0xae, 0x37, 0x76, 0x15, 0x37, 0x2a, 0xb9, 0x67, 0x36, 0xdd, 0xbe, 0x73, 0x01, 0x4a, + 0xd3, 0xf4, 0x24, 0xcd, 0x0f, 0xf1, 0x83, 0xb9, 0x34, 0x2b, 0x8b, 0xf2, 0xab, 0x21, 0x2f, 0xdf, + 0xd4, 0xfd, 0x77, 0x1a, 0xb2, 0xd5, 0x6e, 0x9a, 0xfd, 0xde, 0x1c, 0x84, 0xe6, 0xf2, 0x91, 0xe4, + 0x72, 0x07, 0x6f, 0xcf, 0xe5, 0xa2, 0x4e, 0xd7, 0xf6, 0x17, 0x7f, 0x9d, 0xad, 0x1b, 0x7f, 0x9f, + 0xad, 0x1b, 0xff, 0x9d, 0xad, 0x1b, 0x3f, 0x6c, 0x05, 0xa1, 0x78, 0x9e, 0x1f, 0xf6, 0x07, 0x2c, + 0xf6, 0x92, 0x3c, 0xf6, 0xd3, 0x8c, 0xfd, 0x28, 0x1f, 0xa3, 0x88, 0x1d, 0x7b, 0x8d, 0xff, 0xbc, + 0xbd, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xc7, 0xe3, 0x7f, 0xc1, 0xd4, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1717,6 +1734,24 @@ func (m *EdgeWatermark) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.To == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("to") + } else { + i -= len(*m.To) + copy(dAtA[i:], *m.To) + i = encodeVarintDaemon(dAtA, i, uint64(len(*m.To))) + i-- + dAtA[i] = 0x32 + } + if m.From == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("from") + } else { + i -= len(*m.From) + copy(dAtA[i:], *m.From) + i = encodeVarintDaemon(dAtA, i, uint64(len(*m.From))) + i-- + dAtA[i] = 0x2a + } if m.IsWatermarkEnabled == nil { return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("isWatermarkEnabled") } else { @@ -2104,6 +2139,14 @@ func (m *EdgeWatermark) Size() (n int) { if m.IsWatermarkEnabled != nil { n += 2 } + if m.From != nil { + l = len(*m.From) + n += 1 + l + sovDaemon(uint64(l)) + } + if m.To != nil { + l = len(*m.To) + n += 1 + l + sovDaemon(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -3880,6 +3923,74 @@ func (m *EdgeWatermark) Unmarshal(dAtA []byte) error { b := bool(v != 0) m.IsWatermarkEnabled = &b hasFields[0] |= uint64(0x00000004) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field From", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDaemon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDaemon + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDaemon + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.From = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field To", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDaemon + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthDaemon + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthDaemon + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.To = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000010) default: iNdEx = preIndex skippy, err := skipDaemon(dAtA[iNdEx:]) @@ -3905,6 +4016,12 @@ func (m *EdgeWatermark) Unmarshal(dAtA []byte) error { if hasFields[0]&uint64(0x00000004) == 0 { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("isWatermarkEnabled") } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("from") + } + if hasFields[0]&uint64(0x00000010) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("to") + } if iNdEx > l { return io.ErrUnexpectedEOF diff --git a/pkg/apis/proto/daemon/daemon.proto b/pkg/apis/proto/daemon/daemon.proto index 6df50558bc..56c8191a67 100644 --- a/pkg/apis/proto/daemon/daemon.proto +++ b/pkg/apis/proto/daemon/daemon.proto @@ -92,6 +92,8 @@ message EdgeWatermark { required string edge = 2; repeated int64 watermarks = 3; required bool isWatermarkEnabled = 4; + required string from = 5; + required string to = 6; } message GetPipelineWatermarksResponse { diff --git a/pkg/daemon/server/service/pipeline_watermark_query.go b/pkg/daemon/server/service/pipeline_watermark_query.go index 7ce1b9b1b6..2112b2714b 100644 --- a/pkg/daemon/server/service/pipeline_watermark_query.go +++ b/pkg/daemon/server/service/pipeline_watermark_query.go @@ -86,11 +86,17 @@ func (ps *pipelineMetadataQuery) GetPipelineWatermarks(ctx context.Context, requ for idx := range watermarks { watermarks[idx] = timeZero } + var ( + from = k.From + to = k.To + ) watermarkArr[i] = &daemon.EdgeWatermark{ Pipeline: &ps.pipeline.Name, Edge: &edgeName, Watermarks: watermarks, IsWatermarkEnabled: &isWatermarkEnabled, + From: &from, + To: &to, } i++ } @@ -115,12 +121,18 @@ func (ps *pipelineMetadataQuery) GetPipelineWatermarks(ctx context.Context, requ } } + var ( + from = k.From + to = k.To + ) edgeName := k.GetEdgeName() watermarkArr[i] = &daemon.EdgeWatermark{ Pipeline: &ps.pipeline.Name, Edge: &edgeName, Watermarks: latestWatermarks, IsWatermarkEnabled: &isWatermarkEnabled, + From: &from, + To: &to, } i++ } diff --git a/pkg/reconciler/isbsvc/validate.go b/pkg/reconciler/isbsvc/validate.go index 6f35f6082e..98759b0154 100644 --- a/pkg/reconciler/isbsvc/validate.go +++ b/pkg/reconciler/isbsvc/validate.go @@ -47,6 +47,9 @@ func ValidateInterStepBufferService(isbs *dfv1.InterStepBufferService) error { if x.Version == "" { return fmt.Errorf(`invalid spec: "spec.jetstream.version" is not defined`) } + if x.Replicas != nil && *(x.Replicas) < 3 { + return fmt.Errorf(`invalid spec: min value for "spec.jetstream.replicas" is 3`) + } } return nil } diff --git a/pkg/watermark/entity/entity.go b/pkg/watermark/entity/entity.go index ad9286c8eb..0deb080c6a 100644 --- a/pkg/watermark/entity/entity.go +++ b/pkg/watermark/entity/entity.go @@ -15,7 +15,7 @@ limitations under the License. */ /* -Package processor is the smallest processor entity for which the watermark will strictly monotonically increase. +Package entity is the smallest processor entity for which the watermark will strictly monotonically increase. */ package entity diff --git a/server/apis/interface.go b/server/apis/interface.go index da54d8635a..e8f8298085 100644 --- a/server/apis/interface.go +++ b/server/apis/interface.go @@ -19,20 +19,26 @@ package apis import "github.com/gin-gonic/gin" type Handler interface { + ListNamespaces(c *gin.Context) + GetClusterSummary(c *gin.Context) + CreatePipeline(c *gin.Context) ListPipelines(c *gin.Context) GetPipeline(c *gin.Context) + UpdatePipeline(c *gin.Context) + DeletePipeline(c *gin.Context) + PatchPipeline(c *gin.Context) + CreateInterStepBufferService(c *gin.Context) ListInterStepBufferServices(c *gin.Context) GetInterStepBufferService(c *gin.Context) - ListVertices(c *gin.Context) - GetVertex(c *gin.Context) - GetVertexMetrics(c *gin.Context) - ListVertexPods(c *gin.Context) - PodLogs(c *gin.Context) - ListPodsMetrics(c *gin.Context) - GetPodMetrics(c *gin.Context) + UpdateInterStepBufferService(c *gin.Context) + DeleteInterStepBufferService(c *gin.Context) ListPipelineBuffers(c *gin.Context) - GetVertexBuffers(c *gin.Context) GetPipelineWatermarks(c *gin.Context) + UpdateVertex(c *gin.Context) + GetVerticesMetrics(c *gin.Context) + ListVertexPods(c *gin.Context) + ListPodsMetrics(c *gin.Context) + PodLogs(c *gin.Context) + GetNamespaceEvents(c *gin.Context) GetPipelineStatus(c *gin.Context) - ListNamespaces(c *gin.Context) } diff --git a/server/apis/v1/handler.go b/server/apis/v1/handler.go index 5408f69ba8..7628ba7ad6 100644 --- a/server/apis/v1/handler.go +++ b/server/apis/v1/handler.go @@ -20,22 +20,37 @@ import ( "bufio" "context" "fmt" + "io" + "math" "net/http" + "sort" "strconv" + "strings" + "time" "github.com/gin-gonic/gin" - + admissionv1 "k8s.io/api/admission/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" metricsversiond "k8s.io/metrics/pkg/client/clientset/versioned" "k8s.io/utils/pointer" dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + "github.com/numaproj/numaflow/pkg/apis/proto/daemon" dfv1versiond "github.com/numaproj/numaflow/pkg/client/clientset/versioned" dfv1clients "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1" daemonclient "github.com/numaproj/numaflow/pkg/daemon/client" - sharedutil "github.com/numaproj/numaflow/pkg/shared/util" + "github.com/numaproj/numaflow/pkg/shared/util" + "github.com/numaproj/numaflow/webhook/validator" +) + +// Constants for the validation of the pipeline +const ( + ValidTypeCreate = "valid-create" + ValidTypeUpdate = "valid-update" ) type handler struct { @@ -46,16 +61,20 @@ type handler struct { // NewHandler is used to provide a new instance of the handler type func NewHandler() (*handler, error) { - restConfig, err := sharedutil.K8sRestConfig() + var ( + k8sRestConfig *rest.Config + err error + ) + k8sRestConfig, err = util.K8sRestConfig() if err != nil { - return nil, fmt.Errorf("failed to get kubeconfig, %w", err) + return nil, fmt.Errorf("failed to get kubeRestConfig, %w", err) } - kubeClient, err := kubernetes.NewForConfig(restConfig) + kubeClient, err := kubernetes.NewForConfig(k8sRestConfig) if err != nil { return nil, fmt.Errorf("failed to get kubeclient, %w", err) } - metricsClient := metricsversiond.NewForConfigOrDie(restConfig) - numaflowClient := dfv1versiond.NewForConfigOrDie(restConfig).NumaflowV1alpha1() + metricsClient := metricsversiond.NewForConfigOrDie(k8sRestConfig) + numaflowClient := dfv1versiond.NewForConfigOrDie(k8sRestConfig).NumaflowV1alpha1() return &handler{ kubeClient: kubeClient, metricsClient: metricsClient, @@ -63,265 +82,777 @@ func NewHandler() (*handler, error) { }, nil } +// ListNamespaces is used to provide all the namespaces that have numaflow pipelines running +func (h *handler) ListNamespaces(c *gin.Context) { + namespaces, err := getAllNamespaces(h) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to fetch all namespaces, %s", err.Error())) + return + } + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, namespaces)) +} + +// GetClusterSummary summarizes information of all the namespaces in a cluster and wrapped the result in a list. +func (h *handler) GetClusterSummary(c *gin.Context) { + namespaces, err := getAllNamespaces(h) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to fetch cluster summary, %s", err.Error())) + return + } + var clusterSummary ClusterSummaryResponse + // TODO(API): need a more efficient solution + // Loop over the namespaces to get status + for _, ns := range namespaces { + // Fetch pipeline summary + pipelines, err := getPipelines(h, ns) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to fetch cluster summary, %s", err.Error())) + return + } + + var pipeSummary PipelineSummary + var pipeActiveSummary ActiveStatus + // Loop over the pipelines and get the status + for _, pl := range pipelines { + if pl.Status == PipelineStatusInactive { + pipeSummary.Inactive++ + } else { + pipeActiveSummary.increment(pl.Status) + + } + } + pipeSummary.Active = pipeActiveSummary + + // Fetch ISB service summary + isbSvcs, err := getIsbServices(h, ns) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to fetch cluster summary, %s", err.Error())) + return + } + + var isbSummary IsbServiceSummary + var isbActiveSummary ActiveStatus + // loop over the ISB services and get the status + for _, isb := range isbSvcs { + if isb.Status == ISBServiceStatusInactive { + isbSummary.Inactive++ + } else { + isbActiveSummary.increment(isb.Status) + } + } + isbSummary.Active = isbActiveSummary + clusterSummary = append(clusterSummary, NewClusterSummary(ns, pipeSummary, isbSummary)) + } + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, clusterSummary)) + +} + +// CreatePipeline is used to create a given pipeline +func (h *handler) CreatePipeline(c *gin.Context) { + ns := c.Param("namespace") + // dryRun is used to check if the operation is just a validation or an actual create + dryRun := strings.EqualFold("true", c.DefaultQuery("dry-run", "false")) + + var pipelineSpec dfv1.Pipeline + err := c.ShouldBindJSON(&pipelineSpec) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to get JSON request body, %s", err.Error())) + return + } + + err = validateNamespace(h, &pipelineSpec, ns) + if err != nil { + h.respondWithError(c, err.Error()) + return + } + pipelineSpec.Namespace = ns + err = validatePipelineSpec(h, nil, &pipelineSpec, ValidTypeCreate) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to validate pipeline spec, %s", err.Error())) + return + } + // if Validation flag "dryRun" is set to true, return without creating the pipeline + if dryRun { + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) + return + } + + if _, err := h.numaflowClient.Pipelines(ns).Create(context.Background(), &pipelineSpec, metav1.CreateOptions{}); err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to create pipeline %q, %s", pipelineSpec.Name, err.Error())) + return + } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) +} + // ListPipelines is used to provide all the numaflow pipelines in a given namespace func (h *handler) ListPipelines(c *gin.Context) { - plList, err := h.numaflowClient.Pipelines(c.Param("namespace")).List(context.Background(), metav1.ListOptions{}) + ns := c.Param("namespace") + plList, err := getPipelines(h, ns) + if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to fetch all pipelines for namespace %q, %s", ns, err.Error())) return } - c.JSON(http.StatusOK, plList.Items) + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, plList)) } // GetPipeline is used to provide the spec of a given numaflow pipeline func (h *handler) GetPipeline(c *gin.Context) { - pl, err := h.numaflowClient.Pipelines(c.Param("namespace")).Get(context.Background(), c.Param("pipeline"), metav1.GetOptions{}) + var lag int64 + ns, pipeline := c.Param("namespace"), c.Param("pipeline") + + // get general pipeline info + pl, err := h.numaflowClient.Pipelines(ns).Get(context.Background(), pipeline, metav1.GetOptions{}) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to fetch pipeline %q namespace %q, %s", pipeline, ns, err.Error())) return } - c.JSON(http.StatusOK, pl) -} -// ListInterStepBufferServices is used to provide all the interstepbuffer services in a namespace -func (h *handler) ListInterStepBufferServices(c *gin.Context) { - limit, _ := strconv.ParseInt(c.Query("limit"), 10, 64) - isbSvcs, err := h.numaflowClient.InterStepBufferServices(c.Param("namespace")).List(context.Background(), metav1.ListOptions{ - Limit: limit, - Continue: c.Query("continue"), - }) + // get pipeline source and sink vertex + var ( + source = make(map[string]bool) + sink = make(map[string]bool) + ) + for _, vertex := range pl.Spec.Vertices { + if vertex.IsASource() { + source[vertex.Name] = true + } else if vertex.IsASink() { + sink[vertex.Name] = true + } + } + + // get pipeline status + status, err := getPipelineStatus(pl) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to fetch pipeline %q namespace %q, %s", pipeline, ns, err.Error())) return } - c.JSON(http.StatusOK, isbSvcs.Items) -} -// GetInterStepBufferService is used to provide the spec of the interstep buffer service -func (h *handler) GetInterStepBufferService(c *gin.Context) { - isbsvc, err := h.numaflowClient.InterStepBufferServices(c.Param("namespace")).Get(context.Background(), c.Param("isbsvc"), metav1.GetOptions{}) + // get pipeline lag + // TODO: the client should be cached. + client, err := daemonclient.NewDaemonServiceClient(daemonSvcAddress(ns, pipeline)) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to fetch pipeline: failed to calculate lag for pipeline %q: %s", pipeline, err.Error())) return } - c.JSON(http.StatusOK, isbsvc) + defer client.Close() + + var ( + minWM int64 = math.MaxInt64 + maxWM int64 = math.MinInt64 + ) + watermarks, err := client.GetPipelineWatermarks(context.Background(), pipeline) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to fetch pipeline: failed to calculate lag for pipeline %q: %s", pipeline, err.Error())) + return + } + for _, watermark := range watermarks { + // find the largest source vertex watermark + if _, ok := source[*watermark.From]; ok { + for _, wm := range watermark.Watermarks { + if wm > maxWM { + maxWM = wm + } + } + } + // find the smallest sink vertex watermark + if _, ok := sink[*watermark.To]; ok { + for _, wm := range watermark.Watermarks { + if wm < minWM { + minWM = wm + } + } + } + } + // if the data hasn't arrived the sink vertex + // use 0 instead of the initial watermark value -1 + if minWM == -1 { + minWM = 0 + } + lag = maxWM - minWM + + pipelineResp := NewPipelineInfo(status, &lag, pl) + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, pipelineResp)) } -// ListVertices is used to provide all the vertices of a pipeline -func (h *handler) ListVertices(c *gin.Context) { - limit, _ := strconv.ParseInt(c.Query("limit"), 10, 64) - vertices, err := h.numaflowClient.Vertices(c.Param("namespace")).List(context.Background(), metav1.ListOptions{ - LabelSelector: fmt.Sprintf("%s=%s", dfv1.KeyPipelineName, c.Param("pipeline")), - Limit: limit, - Continue: c.Query("continue"), - }) +// UpdatePipeline is used to update a given pipeline +func (h *handler) UpdatePipeline(c *gin.Context) { + ns, pipeline := c.Param("namespace"), c.Param("pipeline") + // dryRun is used to check if the operation is just a validation or an actual update + dryRun := strings.EqualFold("true", c.DefaultQuery("dry-run", "false")) + + oldSpec, err := h.numaflowClient.Pipelines(ns).Get(context.Background(), pipeline, metav1.GetOptions{}) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to fetch pipeline %q namespace %q, %s", pipeline, ns, err.Error())) return } - c.JSON(http.StatusOK, vertices.Items) + + var updatedSpec dfv1.Pipeline + err = c.ShouldBindJSON(&updatedSpec) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to get JSON request body, %s", err.Error())) + return + } + + // Validate the namespace of the request + err = validateNamespace(h, &updatedSpec, ns) + if err != nil { + h.respondWithError(c, err.Error()) + return + } + + // pipeline name in the URL should be same as spec name + if pipeline != updatedSpec.Name { + h.respondWithError(c, fmt.Sprintf("pipeline name %q is immutable", pipeline)) + return + } + + updatedSpec.Namespace = ns + isValid := validatePipelineSpec(h, oldSpec, &updatedSpec, ValidTypeUpdate) + if isValid != nil { + h.respondWithError(c, fmt.Sprintf("Failed to update pipeline %q, %s", pipeline, isValid.Error())) + return + } + // If Validation flag is set to true, return without updating the pipeline + if dryRun { + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) + return + } + + oldSpec.Spec = updatedSpec.Spec + if _, err := h.numaflowClient.Pipelines(ns).Update(context.Background(), oldSpec, metav1.UpdateOptions{}); err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to update pipeline %q, %s", pipeline, err.Error())) + return + } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) } -// GetVertex is used to provide the vertex spec -func (h *handler) GetVertex(c *gin.Context) { - vertices, err := h.numaflowClient.Vertices(c.Param("namespace")).List(context.Background(), metav1.ListOptions{ - LabelSelector: fmt.Sprintf("%s=%s,%s=%s", dfv1.KeyPipelineName, c.Param("pipeline"), dfv1.KeyVertexName, c.Param("vertex")), - }) +// DeletePipeline is used to delete a given pipeline +func (h *handler) DeletePipeline(c *gin.Context) { + ns, pipeline := c.Param("namespace"), c.Param("pipeline") + + if err := h.numaflowClient.Pipelines(ns).Delete(context.Background(), pipeline, metav1.DeleteOptions{}); err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to delete pipeline %q, %s", pipeline, err.Error())) + return + } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) +} + +// PatchPipeline is used to patch the pipeline spec to achieve operations such as "pause" and "resume" +func (h *handler) PatchPipeline(c *gin.Context) { + ns, pipeline := c.Param("namespace"), c.Param("pipeline") + + patchSpec, err := io.ReadAll(c.Request.Body) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to parse request body, %s", err.Error())) return } - if len(vertices.Items) == 0 { - c.JSON(http.StatusNotFound, fmt.Sprintf("Vertex %q not found", c.Param("vertex"))) + + // TODO: validate the patched data as well, e.g. only allow lifecycle to be patched + if _, err := h.numaflowClient.Pipelines(ns).Patch(context.Background(), pipeline, types.MergePatchType, patchSpec, metav1.PatchOptions{}); err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to patch pipeline %q, %s", pipeline, err.Error())) return } - c.JSON(http.StatusOK, vertices.Items[0]) + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) } -// ListVertexPods is used to provide all the pods of a vertex -func (h *handler) ListVertexPods(c *gin.Context) { - limit, _ := strconv.ParseInt(c.Query("limit"), 10, 64) - pods, err := h.kubeClient.CoreV1().Pods(c.Param("namespace")).List(context.Background(), metav1.ListOptions{ - LabelSelector: fmt.Sprintf("%s=%s,%s=%s", dfv1.KeyPipelineName, c.Param("pipeline"), dfv1.KeyVertexName, c.Param("vertex")), - Limit: limit, - Continue: c.Query("continue"), - }) +// CreateInterStepBufferService is used to create a given interstep buffer service +func (h *handler) CreateInterStepBufferService(c *gin.Context) { + ns := c.Param("namespace") + // dryRun is used to check if the operation is just a validation or an actual update + dryRun := strings.EqualFold("true", c.DefaultQuery("dry-run", "false")) + + var isbsvcSpec dfv1.InterStepBufferService + err := c.ShouldBindJSON(&isbsvcSpec) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get JSON request body, %s", err.Error())) + return + } + + isValid := validateISBSVCSpec(h, nil, &isbsvcSpec, ValidTypeCreate) + if isValid != nil { + h.respondWithError(c, fmt.Sprintf("Failed to create interstepbuffer service spec, %s", isValid.Error())) return } - c.JSON(http.StatusOK, pods.Items) + // If Validation flag is set to true, return without creating the ISB + if dryRun { + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) + return + } + + if _, err := h.numaflowClient.InterStepBufferServices(ns).Create(context.Background(), &isbsvcSpec, metav1.CreateOptions{}); err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to create interstepbuffer service %q, %s", isbsvcSpec.Name, err.Error())) + return + } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) } -// ListPodsMetrics is used to provide a list of all metrics in all the pods -func (h *handler) ListPodsMetrics(c *gin.Context) { - limit, _ := strconv.ParseInt(c.Query("limit"), 10, 64) - l, err := h.metricsClient.MetricsV1beta1().PodMetricses(c.Param("namespace")).List(context.Background(), metav1.ListOptions{ - Limit: limit, - Continue: c.Query("continue"), - }) +// ListInterStepBufferServices is used to provide all the interstepbuffer services in a namespace +func (h *handler) ListInterStepBufferServices(c *gin.Context) { + ns := c.Param("namespace") + isbList, err := getIsbServices(h, ns) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to fetch all interstepbuffer services for namespace %q, %s", ns, err.Error())) return } - c.JSON(http.StatusOK, l.Items) + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, isbList)) } -// GetPodMetrics is used to provide the metrics like CPU/Memory utilization for a pod -func (h *handler) GetPodMetrics(c *gin.Context) { - m, err := h.metricsClient.MetricsV1beta1().PodMetricses(c.Param("namespace")).Get(context.Background(), c.Param("pod"), metav1.GetOptions{}) +// GetInterStepBufferService is used to provide the spec of the interstep buffer service +func (h *handler) GetInterStepBufferService(c *gin.Context) { + ns, isbName := c.Param("namespace"), c.Param("isb-services") + + isbsvc, err := h.numaflowClient.InterStepBufferServices(ns).Get(context.Background(), isbName, metav1.GetOptions{}) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to fetch interstepbuffer service %q namespace %q, %s", isbName, ns, err.Error())) return } - c.JSON(http.StatusOK, m) + + status := ISBServiceStatusHealthy + // TODO(API) : Get the current status of the ISB service + + resp := NewISBService(status, isbsvc) + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, resp)) } -// PodLogs is used to provide the logs of a given container in pod -func (h *handler) PodLogs(c *gin.Context) { - var tailLines *int64 - if v := c.Query("tailLines"); v != "" { - x, _ := strconv.ParseInt(v, 10, 64) - tailLines = pointer.Int64(x) +// UpdateInterStepBufferService is used to update the spec of the interstep buffer service +func (h *handler) UpdateInterStepBufferService(c *gin.Context) { + ns, isbServices := c.Param("namespace"), c.Param("isb-services") + // dryRun is used to check if the operation is just a validation or an actual update + dryRun := strings.EqualFold("true", c.DefaultQuery("dry-run", "false")) + + isbSVC, err := h.numaflowClient.InterStepBufferServices(ns).Get(context.Background(), isbServices, metav1.GetOptions{}) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to get the interstep buffer service: namespace %q isb-services %q: %s", ns, isbServices, err.Error())) + return } - stream, err := h.kubeClient.CoreV1(). - Pods(c.Param("namespace")). - GetLogs(c.Param("pod"), &corev1.PodLogOptions{ - Container: c.Query("container"), - Follow: c.Query("follow") == "true", - TailLines: tailLines, - }).Stream(c) + + var updatedSpec dfv1.InterStepBufferService + err = c.ShouldBindJSON(&updatedSpec) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get JSON request body, %s", err.Error())) return } - defer stream.Close() - scanner := bufio.NewScanner(stream) - for scanner.Scan() { - _, _ = c.Writer.Write(scanner.Bytes()) - _, _ = c.Writer.WriteString("\n") - c.Writer.Flush() + + err = validateISBSVCSpec(h, isbSVC, &updatedSpec, ValidTypeUpdate) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to validate interstepbuffer service spec, %s", err.Error())) + return + } + + // If Validation flag is set to true, return without updating the ISB service + if dryRun { + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) + return + } + isbSVC.Spec = updatedSpec.Spec + updatedISBSvc, err := h.numaflowClient.InterStepBufferServices(ns).Update(context.Background(), isbSVC, metav1.UpdateOptions{}) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to update the interstep buffer service: namespace %q isb-services %q: %s", ns, isbServices, err.Error())) + return + } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, updatedISBSvc)) +} + +// DeleteInterStepBufferService is used to update the spec of the inter step buffer service +func (h *handler) DeleteInterStepBufferService(c *gin.Context) { + ns, isbServices := c.Param("namespace"), c.Param("isb-services") + + // TODO: validate if it's being used by any pipelines + err := h.numaflowClient.InterStepBufferServices(ns).Delete(context.Background(), isbServices, metav1.DeleteOptions{}) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to delete the interstep buffer service: namespace %q isb-services %q: %s", + ns, isbServices, err.Error())) + return } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, nil)) } // ListPipelineBuffers is used to provide buffer information about all the pipeline vertices func (h *handler) ListPipelineBuffers(c *gin.Context) { - ns := c.Param("namespace") - pipeline := c.Param("pipeline") + ns, pipeline := c.Param("namespace"), c.Param("pipeline") + + // TODO: the client should be cached. client, err := daemonclient.NewDaemonServiceClient(daemonSvcAddress(ns, pipeline)) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get the Inter-Step buffers for pipeline %q: %s", pipeline, err.Error())) return } - defer func() { - _ = client.Close() - }() - l, err := client.ListPipelineBuffers(context.Background(), pipeline) + defer client.Close() + + buffers, err := client.ListPipelineBuffers(context.Background(), pipeline) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get the Inter-Step buffers for pipeline %q: %s", pipeline, err.Error())) return } - c.JSON(http.StatusOK, l) + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, buffers)) } -// GetVertexBuffers is used to provide buffer information about a single pipeline vertex -func (h *handler) GetVertexBuffers(c *gin.Context) { - ns := c.Param("namespace") - pipeline := c.Param("pipeline") +// GetPipelineWatermarks is used to provide the head watermarks for a given pipeline +func (h *handler) GetPipelineWatermarks(c *gin.Context) { + ns, pipeline := c.Param("namespace"), c.Param("pipeline") + + // TODO: the client should be cached. client, err := daemonclient.NewDaemonServiceClient(daemonSvcAddress(ns, pipeline)) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get the watermarks for pipeline %q: %s", pipeline, err.Error())) return } - defer func() { - _ = client.Close() - }() - // Assume edge is the buffer name - i, err := client.GetPipelineBuffer(context.Background(), pipeline, c.Param("vertex")) + defer client.Close() + + watermarks, err := client.GetPipelineWatermarks(context.Background(), pipeline) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get the watermarks for pipeline %q: %s", pipeline, err.Error())) return } - c.JSON(http.StatusOK, i) + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, watermarks)) } -// GetVertexMetrics is used to provide information about the vertex including processing rates. -func (h *handler) GetVertexMetrics(c *gin.Context) { - ns := c.Param("namespace") - pipeline := c.Param("pipeline") - vertex := c.Param("vertex") - client, err := daemonclient.NewDaemonServiceClient(daemonSvcAddress(ns, pipeline)) +func (h *handler) respondWithError(c *gin.Context, message string) { + c.JSON(http.StatusOK, NewNumaflowAPIResponse(&message, nil)) +} + +// UpdateVertex is used to update the vertex spec +func (h *handler) UpdateVertex(c *gin.Context) { + var ( + requestBody dfv1.AbstractVertex + inputVertexName = c.Param("vertex") + pipeline = c.Param("pipeline") + ns = c.Param("namespace") + ) + + pl, err := h.numaflowClient.Pipelines(ns).Get(context.Background(), pipeline, metav1.GetOptions{}) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to update the vertex: namespace %q pipeline %q vertex %q: %s", ns, + pipeline, inputVertexName, err.Error())) return } - defer func() { - _ = client.Close() - }() - l, err := client.GetVertexMetrics(context.Background(), pipeline, vertex) - if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + + if err = c.ShouldBindJSON(&requestBody); err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to update the vertex: namespace %q pipeline %q vertex %q: %s", ns, + pipeline, inputVertexName, err.Error())) + return + } + + if requestBody.Name != inputVertexName { + h.respondWithError(c, fmt.Sprintf("Failed to update the vertex: namespace %q pipeline %q vertex %q: vertex name %q is immutable", + ns, pipeline, inputVertexName, requestBody.Name)) + return + } + + for index, vertex := range pl.Spec.Vertices { + if vertex.Name == inputVertexName { + if vertex.GetVertexType() != requestBody.GetVertexType() { + h.respondWithError(c, fmt.Sprintf("Failed to update the vertex: namespace %q pipeline %q vertex %q: vertex type is immutable", + ns, pipeline, inputVertexName)) + return + } + pl.Spec.Vertices[index] = requestBody + break + } + } + + if _, err := h.numaflowClient.Pipelines(ns).Update(context.Background(), pl, metav1.UpdateOptions{}); err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to update the vertex: namespace %q pipeline %q vertex %q: %s", + ns, pipeline, inputVertexName, err.Error())) return } - c.JSON(http.StatusOK, l) + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, pl.Spec)) } -// GetPipelineWatermarks is used to provide the head watermarks for a given pipeline -func (h *handler) GetPipelineWatermarks(c *gin.Context) { - ns := c.Param("namespace") - pipeline := c.Param("pipeline") +// GetVerticesMetrics is used to provide information about all the vertices for the given pipeline including processing rates. +func (h *handler) GetVerticesMetrics(c *gin.Context) { + ns, pipeline := c.Param("namespace"), c.Param("pipeline") + + pl, err := h.numaflowClient.Pipelines(ns).Get(context.Background(), pipeline, metav1.GetOptions{}) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to get the vertices metrics: namespace %q pipeline %q: %s", ns, pipeline, err.Error())) + return + } + + // TODO: the client should be cached. client, err := daemonclient.NewDaemonServiceClient(daemonSvcAddress(ns, pipeline)) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get the vertices metrics: failed to get demon service client for namespace %q pipeline %q: %s", ns, pipeline, err.Error())) return } - defer func() { - _ = client.Close() - }() - l, err := client.GetPipelineWatermarks(context.Background(), pipeline) + defer client.Close() + + var results = make(map[string][]*daemon.VertexMetrics) + for _, vertex := range pl.Spec.Vertices { + metrics, err := client.GetVertexMetrics(context.Background(), pipeline, vertex.Name) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to get the vertices metrics: namespace %q pipeline %q vertex %q: %s", ns, pipeline, vertex.Name, err.Error())) + return + } + results[vertex.Name] = metrics + } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, results)) +} + +// ListVertexPods is used to provide all the pods of a vertex +func (h *handler) ListVertexPods(c *gin.Context) { + ns, pipeline, vertex := c.Param("namespace"), c.Param("pipeline"), c.Param("vertex") + + limit, _ := strconv.ParseInt(c.Query("limit"), 10, 64) + pods, err := h.kubeClient.CoreV1().Pods(ns).List(context.Background(), metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s,%s=%s", dfv1.KeyPipelineName, pipeline, dfv1.KeyVertexName, vertex), + Limit: limit, + Continue: c.Query("continue"), + }) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get a list of pods: namespace %q pipeline %q vertex %q: %s", + ns, pipeline, vertex, err.Error())) return } - c.JSON(http.StatusOK, l) + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, pods.Items)) } -// GetPipelineStatus is used to provide status check for a given pipeline -func (h *handler) GetPipelineStatus(c *gin.Context) { +// ListPodsMetrics is used to provide a list of all metrics in all the pods +func (h *handler) ListPodsMetrics(c *gin.Context) { ns := c.Param("namespace") - pipeline := c.Param("pipeline") - client, err := daemonclient.NewDaemonServiceClient(daemonSvcAddress(ns, pipeline)) + + limit, _ := strconv.ParseInt(c.Query("limit"), 10, 64) + metrics, err := h.metricsClient.MetricsV1beta1().PodMetricses(ns).List(context.Background(), metav1.ListOptions{ + Limit: limit, + Continue: c.Query("continue"), + }) + if err != nil { + h.respondWithError(c, fmt.Sprintf("Failed to get a list of pod metrics in namespace %q: %s", ns, err.Error())) + return + } + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, metrics.Items)) +} + +// PodLogs is used to provide the logs of a given container in pod +func (h *handler) PodLogs(c *gin.Context) { + ns, pod := c.Param("namespace"), c.Param("pod") + + // parse the query parameters + tailLines := h.parseTailLines(c.Query("tailLines")) + logOptions := &corev1.PodLogOptions{ + Container: c.Query("container"), + Follow: c.Query("follow") == "true", + TailLines: tailLines, + } + + stream, err := h.kubeClient.CoreV1().Pods(ns).GetLogs(pod, logOptions).Stream(c) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get pod logs: %s", err.Error())) return } - defer func() { - _ = client.Close() - }() - l, err := client.GetPipelineStatus(context.Background(), pipeline) + defer stream.Close() + + // Stream the logs back to the client + h.streamLogs(c, stream) +} + +func (h *handler) parseTailLines(query string) *int64 { + if query == "" { + return nil + } + + x, _ := strconv.ParseInt(query, 10, 64) + return pointer.Int64(x) +} + +func (h *handler) streamLogs(c *gin.Context, stream io.ReadCloser) { + scanner := bufio.NewScanner(stream) + for scanner.Scan() { + _, _ = c.Writer.Write(scanner.Bytes()) + _, _ = c.Writer.WriteString("\n") + c.Writer.Flush() + } +} + +// GetNamespaceEvents gets a list of events for the given namespace. +func (h *handler) GetNamespaceEvents(c *gin.Context) { + ns := c.Param("namespace") + + limit, _ := strconv.ParseInt(c.Query("limit"), 10, 64) + events, err := h.kubeClient.CoreV1().Events(ns).List(context.Background(), metav1.ListOptions{ + Limit: limit, + Continue: c.Query("continue"), + }) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) + h.respondWithError(c, fmt.Sprintf("Failed to get a list of events: namespace %q: %s", ns, err.Error())) return } - c.JSON(http.StatusOK, l) + + var ( + response []K8sEventsResponse + defaultTimeObject time.Time + ) + + for _, event := range events.Items { + if event.LastTimestamp.Time == defaultTimeObject { + continue + } + var newEvent = NewK8sEventsResponse(event.LastTimestamp.UnixMilli(), event.Type, event.InvolvedObject.Kind, event.InvolvedObject.Name, event.Reason, event.Message) + response = append(response, newEvent) + } + + // sort the events by timestamp + // from most recent events to older events + sort.Slice(response, func(i int, j int) bool { + return response[i].TimeStamp >= response[j].TimeStamp + }) + + c.JSON(http.StatusOK, NewNumaflowAPIResponse(nil, response)) } -// ListNamespaces is used to provide all the namespaces that have numaflow pipelines running -func (h *handler) ListNamespaces(c *gin.Context) { +// GetPipelineStatus returns the pipeline status. It is based on Health and Criticality. +// Health can be "healthy (0) | unhealthy (1) | paused (3) | unknown (4)". +// Health here indicates pipeline's ability to process messages. +// A backlogged pipeline can be healthy even though it has an increasing back-pressure. Health purely means it is up and running. +// Pipelines health will be the max(health) based of each vertex's health +// Criticality on the other end shows whether the pipeline is working as expected. +// It represents the pending messages, lags, etc. +// Criticality can be "ok (0) | warning (1) | critical (2)". +// Health and Criticality are different because ...? +func (h *handler) GetPipelineStatus(c *gin.Context) { + c.JSON(http.StatusNotImplemented, "working on it") +} + +// getAllNamespaces is a utility used to fetch all the namespaces in the cluster +func getAllNamespaces(h *handler) ([]string, error) { l, err := h.numaflowClient.Pipelines("").List(context.Background(), metav1.ListOptions{}) if err != nil { - c.JSON(http.StatusInternalServerError, err.Error()) - return + return nil, err } m := make(map[string]bool) for _, pl := range l.Items { m[pl.Namespace] = true } + + isbsvc, err := h.numaflowClient.InterStepBufferServices("").List(context.Background(), metav1.ListOptions{}) + if err != nil { + return nil, err + } + for _, isb := range isbsvc.Items { + m[isb.Namespace] = true + } var namespaces []string for k := range m { namespaces = append(namespaces, k) } - c.JSON(http.StatusOK, namespaces) + return namespaces, nil +} + +// getPipelines is a utility used to fetch all the pipelines in a given namespace +func getPipelines(h *handler, namespace string) (Pipelines, error) { + plList, err := h.numaflowClient.Pipelines(namespace).List(context.Background(), metav1.ListOptions{}) + if err != nil { + return nil, err + } + var pipelineList Pipelines + for _, pl := range plList.Items { + status, err := getPipelineStatus(&pl) + if err != nil { + return nil, err + } + // NOTE: we only calculate pipeline lag for get single pipeline API + // to avoid massive gRPC calls + resp := NewPipelineInfo(status, nil, &pl) + pipelineList = append(pipelineList, resp) + } + return pipelineList, nil +} + +// getIsbServices is used to fetch all the interstepbuffer services in a given namespace +func getIsbServices(h *handler, namespace string) (ISBServices, error) { + isbSvcs, err := h.numaflowClient.InterStepBufferServices(namespace).List(context.Background(), metav1.ListOptions{}) + if err != nil { + return nil, err + } + var isbList ISBServices + for _, isb := range isbSvcs.Items { + status := ISBServiceStatusHealthy + // TODO(API) : Get the current status of the ISB service + resp := NewISBService(status, &isb) + isbList = append(isbList, resp) + } + return isbList, nil +} + +// GetPipelineStatus is used to provide the status of a given pipeline +// TODO(API): Change the Daemon service to return the consolidated status of the pipeline +// to save on multiple calls to the daemon service +func getPipelineStatus(pipeline *dfv1.Pipeline) (string, error) { + retStatus := PipelineStatusHealthy + // Check if the pipeline is paused, if so, return inactive status + if pipeline.Spec.Lifecycle.GetDesiredPhase() == dfv1.PipelinePhasePaused { + retStatus = PipelineStatusInactive + } else if pipeline.Spec.Lifecycle.GetDesiredPhase() == dfv1.PipelinePhaseRunning { + retStatus = PipelineStatusHealthy + } else if pipeline.Spec.Lifecycle.GetDesiredPhase() == dfv1.PipelinePhaseFailed { + retStatus = PipelineStatusCritical + } + return retStatus, nil +} + +// validatePipelineSpec is used to validate the pipeline spec during create and update +func validatePipelineSpec(h *handler, oldPipeline *dfv1.Pipeline, newPipeline *dfv1.Pipeline, validType string) error { + ns := newPipeline.Namespace + pipeClient := h.numaflowClient.Pipelines(ns) + isbClient := h.numaflowClient.InterStepBufferServices(ns) + valid := validator.NewPipelineValidator(h.kubeClient, pipeClient, isbClient, oldPipeline, newPipeline) + var resp *admissionv1.AdmissionResponse + switch validType { + case ValidTypeCreate: + resp = valid.ValidateCreate(context.Background()) + case ValidTypeUpdate: + resp = valid.ValidateUpdate(context.Background()) + } + if !resp.Allowed { + errMsg := fmt.Errorf("%s", resp.Result.Message) + return errMsg + } + return nil +} + +// validateISBSVCSpec is used to validate the ISB service spec +func validateISBSVCSpec(h *handler, prevSpec *dfv1.InterStepBufferService, + newSpec *dfv1.InterStepBufferService, validType string) error { + ns := newSpec.Namespace + isbClient := h.numaflowClient.InterStepBufferServices(ns) + valid := validator.NewISBServiceValidator(h.kubeClient, isbClient, prevSpec, newSpec) + var resp *admissionv1.AdmissionResponse + switch validType { + case ValidTypeCreate: + resp = valid.ValidateCreate(context.Background()) + case ValidTypeUpdate: + resp = valid.ValidateUpdate(context.Background()) + } + if !resp.Allowed { + errMsg := fmt.Errorf("%s", resp.Result.Message) + return errMsg + } + return nil +} + +// validateNamespace is used to validate the namespace for a pipeline spec +// For a request, the namespace provided as parameter should be same as the namespace in the pipeline spec +func validateNamespace(h *handler, pipeline *dfv1.Pipeline, ns string) error { + if pipeline.Namespace != "" && pipeline.Namespace != ns { + errMsg := fmt.Errorf("namespace mismatch, expected %s", ns) + return errMsg + } + return nil } func daemonSvcAddress(ns, pipeline string) string { diff --git a/server/apis/v1/response.go b/server/apis/v1/response.go new file mode 100644 index 0000000000..6147cba7ff --- /dev/null +++ b/server/apis/v1/response.go @@ -0,0 +1,16 @@ +package v1 + +type NumaflowAPIResponse struct { + // ErrMsg provides more detailed error information. If API call succeeds, the ErrMsg is nil. + ErrMsg *string `json:"errMsg,omitempty"` + // Data is the response body. + Data interface{} `json:"data"` +} + +// NewNumaflowAPIResponse creates a new NumaflowAPIResponse. +func NewNumaflowAPIResponse(errMsg *string, data interface{}) NumaflowAPIResponse { + return NumaflowAPIResponse{ + ErrMsg: errMsg, + Data: data, + } +} diff --git a/server/apis/v1/response_cluster_summary.go b/server/apis/v1/response_cluster_summary.go new file mode 100644 index 0000000000..17ffe57c34 --- /dev/null +++ b/server/apis/v1/response_cluster_summary.go @@ -0,0 +1,51 @@ +package v1 + +// ActiveStatus contains the number of objects in healthy, warning, and critical status. +type ActiveStatus struct { + Healthy int `json:"Healthy"` + Warning int `json:"Warning"` + Critical int `json:"Critical"` +} + +func (as *ActiveStatus) increment(status string) { + if status == PipelineStatusHealthy { + as.Healthy++ + } else if status == PipelineStatusWarning { + as.Warning++ + } else if status == PipelineStatusCritical { + as.Critical++ + } +} + +// PipelineSummary summarizes the number of active and inactive pipelines. +type PipelineSummary struct { + Active ActiveStatus `json:"active"` + Inactive int `json:"inactive"` +} + +// IsbServiceSummary summarizes the number of active and inactive ISB Service. +type IsbServiceSummary struct { + Active ActiveStatus `json:"active"` + Inactive int `json:"inactive"` +} + +// ClusterSummaryResponse is a list of ClusterSummary +// of all the namespaces in a cluster wrapped in a list. +type ClusterSummaryResponse []ClusterSummary + +// ClusterSummary summarizes information for a given namespace. +type ClusterSummary struct { + Namespace string `json:"namespace"` + PipelineSummary PipelineSummary `json:"pipelineSummary"` + IsbServiceSummary IsbServiceSummary `json:"isbServiceSummary"` +} + +// NewClusterSummary creates a new ClusterSummary object with the given specifications. +func NewClusterSummary(namespace string, pipelineSummary PipelineSummary, + isbSummary IsbServiceSummary) ClusterSummary { + return ClusterSummary{ + Namespace: namespace, + PipelineSummary: pipelineSummary, + IsbServiceSummary: isbSummary, + } +} diff --git a/server/apis/v1/response_isb_services.go b/server/apis/v1/response_isb_services.go new file mode 100644 index 0000000000..45f6c0e284 --- /dev/null +++ b/server/apis/v1/response_isb_services.go @@ -0,0 +1,29 @@ +package v1 + +import "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + +const ( + ISBServiceStatusHealthy = "healthy" + ISBServiceStatusCritical = "critical" + ISBServiceStatusWarning = "warning" + ISBServiceStatusInactive = "inactive" +) + +// ISBServices is a list of InterStepBufferServices +type ISBServices []ISBService + +// ISBService gives the summarized information of an InterStepBufferService +type ISBService struct { + Name string `json:"name"` + Status string `json:"status"` + ISBService v1alpha1.InterStepBufferService `json:"isbService"` +} + +// NewISBService creates a new ISBService object with the given specifications +func NewISBService(status string, isb *v1alpha1.InterStepBufferService) ISBService { + return ISBService{ + Name: isb.Name, + Status: status, + ISBService: *isb, + } +} diff --git a/server/apis/v1/response_k8s_events.go b/server/apis/v1/response_k8s_events.go new file mode 100644 index 0000000000..20e6ef6e13 --- /dev/null +++ b/server/apis/v1/response_k8s_events.go @@ -0,0 +1,23 @@ +package v1 + +import "fmt" + +type K8sEventsResponse struct { + TimeStamp int64 `json:"timestamp"` + Type string `json:"type"` + Object string `json:"object"` + Reason string `json:"reason"` + Message string `json:"message"` +} + +// NewK8sEventsResponse creates a new K8sEventsResponse object with the given inputs. +func NewK8sEventsResponse(timestamp int64, eventType, objectKind, objectName, reason, message string) K8sEventsResponse { + + return K8sEventsResponse{ + TimeStamp: timestamp, + Type: eventType, + Object: fmt.Sprintf("%s/%s", objectKind, objectName), + Reason: reason, + Message: message, + } +} diff --git a/server/apis/v1/response_pipeline.go b/server/apis/v1/response_pipeline.go new file mode 100644 index 0000000000..cd8481aa75 --- /dev/null +++ b/server/apis/v1/response_pipeline.go @@ -0,0 +1,33 @@ +package v1 + +import "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + +const ( + PipelineStatusHealthy = "healthy" + PipelineStatusCritical = "critical" + PipelineStatusWarning = "warning" + PipelineStatusInactive = "inactive" +) + +// Pipelines is a list of pipelines +type Pipelines []PipelineInfo + +type PipelineInfo struct { + Name string `json:"name"` + // Status shows whether the pipeline is healthy, warning, critical or inactive. + Status string `json:"status"` + // Lag shows the pipeline lag. + Lag *int64 `json:"lag,omitempty"` + // Pipeline contains the detailed pipeline spec. + Pipeline v1alpha1.Pipeline `json:"pipeline"` +} + +// NewPipelineInfo creates a new PipelineInfo object with the given status +func NewPipelineInfo(status string, lag *int64, pl *v1alpha1.Pipeline) PipelineInfo { + return PipelineInfo{ + Name: pl.Name, + Status: status, + Lag: lag, + Pipeline: *pl, + } +} diff --git a/server/cmd/start.go b/server/cmd/start.go index c826f58f86..c1a19a8866 100644 --- a/server/cmd/start.go +++ b/server/cmd/start.go @@ -34,6 +34,7 @@ import ( var ( rewritePathPrefixes = []string{ "/namespaces", + "/pipelines", } ) diff --git a/server/routes/routes.go b/server/routes/routes.go index a0cbebcc77..cdc1103aac 100644 --- a/server/routes/routes.go +++ b/server/routes/routes.go @@ -21,22 +21,25 @@ import ( "github.com/gin-gonic/gin" - v1 "github.com/numaproj/numaflow/server/apis/v1" + "github.com/numaproj/numaflow/server/apis/v1" ) type SystemInfo struct { ManagedNamespace string `json:"managedNamespace"` Namespaced bool `json:"namespaced"` + // TODO: Get the version of the current Numaflow + Version string `json:"version"` } func Routes(r *gin.Engine, sysinfo SystemInfo) { r.GET("/livez", func(c *gin.Context) { c.Status(http.StatusOK) }) - rGroup := r.Group("/api/v1") - v1Routes(rGroup) - rGroup.GET("/sysinfo", func(c *gin.Context) { - c.JSON(http.StatusOK, sysinfo) + + r1Group := r.Group("/api/v1") + v1Routes(r1Group) + r1Group.GET("/sysinfo", func(c *gin.Context) { + c.JSON(http.StatusOK, v1.NewNumaflowAPIResponse(nil, sysinfo)) }) } @@ -45,20 +48,48 @@ func v1Routes(r gin.IRouter) { if err != nil { panic(err) } + // List all namespaces that have Pipeline or InterStepBufferService objects. + r.GET("/namespaces", handler.ListNamespaces) + // Summarized information of all the namespaces in a cluster wrapped in a list. + r.GET("/cluster-summary", handler.GetClusterSummary) + // Create a Pipeline. + r.POST("/namespaces/:namespace/pipelines", handler.CreatePipeline) + // All pipelines for a given namespace. r.GET("/namespaces/:namespace/pipelines", handler.ListPipelines) - r.GET("/namespaces/:namespace/isbsvcs", handler.ListInterStepBufferServices) - r.GET("/namespaces/:namespace/isbsvcs/:isbsvc", handler.GetInterStepBufferService) + // Get a Pipeline information. r.GET("/namespaces/:namespace/pipelines/:pipeline", handler.GetPipeline) - r.GET("/namespaces/:namespace/pipelines/:pipeline/vertices", handler.ListVertices) - r.GET("/namespaces/:namespace/pipelines/:pipeline/vertices/:vertex", handler.GetVertex) + // Get a Pipeline health information. + r.GET("/namespaces/:namespace/pipelines/:pipeline/health", handler.GetPipelineStatus) + // Update a Pipeline. + r.PUT("/namespaces/:namespace/pipelines/:pipeline", handler.UpdatePipeline) + // Delete a Pipeline. + r.DELETE("/namespaces/:namespace/pipelines/:pipeline", handler.DeletePipeline) + // Patch the pipeline spec to achieve operations such as "pause" and "resume". + r.PATCH("/namespaces/:namespace/pipelines/:pipeline", handler.PatchPipeline) + // Create an InterStepBufferService object. + r.POST("/namespaces/:namespace/isb-services", handler.CreateInterStepBufferService) + // List all the InterStepBufferService objects for a given namespace. + r.GET("/namespaces/:namespace/isb-services", handler.ListInterStepBufferServices) + // Get an InterStepBufferService object. + r.GET("/namespaces/:namespace/isb-services/:isb-services", handler.GetInterStepBufferService) + // Update an InterStepBufferService object. + r.PUT("/namespaces/:namespace/isb-services/:isb-services", handler.UpdateInterStepBufferService) + // Delete an InterStepBufferService object. + r.DELETE("/namespaces/:namespace/isb-services/:isb-services", handler.DeleteInterStepBufferService) + // Get all the Inter-Step Buffers of a pipeline. + r.GET("/namespaces/:namespace/pipelines/:pipeline/isbs", handler.ListPipelineBuffers) + // Get all the watermarks information of a pipeline. + r.GET("/namespaces/:namespace/pipelines/:pipeline/watermarks", handler.GetPipelineWatermarks) + // Update a vertex spec. + r.PUT("/namespaces/:namespace/pipelines/:pipeline/vertices/:vertex", handler.UpdateVertex) + // Get all the vertex metrics of a pipeline. + r.GET("/namespaces/:namespace/pipelines/:pipeline/vertices/metrics", handler.GetVerticesMetrics) + // Get all the pods of a vertex. r.GET("/namespaces/:namespace/pipelines/:pipeline/vertices/:vertex/pods", handler.ListVertexPods) - r.GET("/namespaces/:namespace/pods/:pod/log", handler.PodLogs) + // Get the metrics such as cpu, memory usage for a pod. r.GET("/metrics/namespaces/:namespace/pods", handler.ListPodsMetrics) - r.GET("/metrics/namespaces/:namespace/pods/:pod", handler.GetPodMetrics) - r.GET("/namespaces/:namespace/pipelines/:pipeline/buffers", handler.ListPipelineBuffers) - r.GET("/namespaces/:namespace/pipelines/:pipeline/vertices/:vertex/buffers", handler.GetVertexBuffers) - r.GET("/namespaces/:namespace/pipelines/:pipeline/vertices/:vertex/metrics", handler.GetVertexMetrics) - r.GET("/namespaces/:namespace/pipelines/:pipeline/watermarks", handler.GetPipelineWatermarks) - r.GET("/namespaces/:namespace/pipelines/:pipeline/status", handler.GetPipelineStatus) - r.GET("/namespaces", handler.ListNamespaces) + // Get pod logs. + r.GET("/namespaces/:namespace/pods/:pod/logs", handler.PodLogs) + // List of the Kubernetes events of a namespace. + r.GET("/namespaces/:namespace/events", handler.GetNamespaceEvents) } diff --git a/test/api-e2e/api_test.go b/test/api-e2e/api_test.go new file mode 100644 index 0000000000..616d950184 --- /dev/null +++ b/test/api-e2e/api_test.go @@ -0,0 +1,202 @@ +package api_e2e + +import ( + "context" + "encoding/json" + "fmt" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + . "github.com/numaproj/numaflow/test/fixtures" +) + +type APISuite struct { + E2ESuite +} + +func (s *APISuite) TestGetSysInfo() { + numaflowServerPodName := s.GetNumaflowServerPodName() + if numaflowServerPodName == "" { + panic("failed to find the nuamflow-server pod") + } + stopPortForward := s.StartPortForward(numaflowServerPodName, 8443) + + sysinfoBody := HTTPExpect(s.T(), "https://localhost:8443").GET("/api/v1/sysinfo"). + Expect(). + Status(200).Body().Raw() + var sysinfoExpect = `{"data":{"managedNamespace":"numaflow-system","namespaced":false,"version":""}}` + assert.Contains(s.T(), sysinfoBody, sysinfoExpect) + stopPortForward() +} + +func (s *APISuite) TestISBSVC() { + var err error + numaflowServerPodName := s.GetNumaflowServerPodName() + if numaflowServerPodName == "" { + panic("failed to find the nuamflow-server pod") + } + stopPortForward := s.StartPortForward(numaflowServerPodName, 8443) + + var testISBSVC v1alpha1.InterStepBufferService + err = json.Unmarshal(testISBSVCSpec, &testISBSVC) + assert.NoError(s.T(), err) + createISBSVCBody := HTTPExpect(s.T(), "https://localhost:8443").POST(fmt.Sprintf("/api/v1/namespaces/%s/isb-services", Namespace)).WithJSON(testISBSVC). + Expect(). + Status(200).Body().Raw() + var createISBSVCSuccessExpect = `{"data":null}` + assert.Contains(s.T(), createISBSVCBody, createISBSVCSuccessExpect) + + listISBSVCBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/isb-services", Namespace)). + Expect(). + Status(200).Body().Raw() + assert.Contains(s.T(), listISBSVCBody, testISBSVCName) + + getISBSVCBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/isb-services/%s", Namespace, testISBSVCName)). + Expect(). + Status(200).Body().Raw() + assert.Contains(s.T(), getISBSVCBody, fmt.Sprintf(`"name":"%s"`, testISBSVCName)) + assert.Contains(s.T(), getISBSVCBody, `"status":"healthy"`) + + deleteISBSVC := HTTPExpect(s.T(), "https://localhost:8443").DELETE(fmt.Sprintf("/api/v1/namespaces/%s/isb-services/%s", Namespace, testISBSVCName)). + Expect(). + Status(200).Body().Raw() + var deleteISBSVCSuccessExpect = `{"data":null}` + assert.Contains(s.T(), deleteISBSVC, deleteISBSVCSuccessExpect) + + stopPortForward() +} + +func (s *APISuite) TestPipeline0() { + var err error + numaflowServerPodName := s.GetNumaflowServerPodName() + if numaflowServerPodName == "" { + panic("failed to find the nuamflow-server pod") + } + stopPortForward := s.StartPortForward(numaflowServerPodName, 8443) + + namespaceBody := HTTPExpect(s.T(), "https://localhost:8443").GET("/api/v1/namespaces"). + Expect(). + Status(200).Body().Raw() + var namespaceExpect = `numaflow-system` + assert.Contains(s.T(), namespaceBody, namespaceExpect) + + var pl1 v1alpha1.Pipeline + err = json.Unmarshal(testPipeline1, &pl1) + assert.NoError(s.T(), err) + createPipeline1 := HTTPExpect(s.T(), "https://localhost:8443").POST(fmt.Sprintf("/api/v1/namespaces/%s/pipelines", Namespace)).WithJSON(pl1). + Expect(). + Status(200).Body().Raw() + var pl2 v1alpha1.Pipeline + err = json.Unmarshal(testPipeline2, &pl2) + assert.NoError(s.T(), err) + createPipeline2 := HTTPExpect(s.T(), "https://localhost:8443").POST(fmt.Sprintf("/api/v1/namespaces/%s/pipelines", Namespace)).WithJSON(pl2). + Expect(). + Status(200).Body().Raw() + var createPipelineSuccessExpect = `{"data":null}` + assert.Contains(s.T(), createPipeline1, createPipelineSuccessExpect) + assert.Contains(s.T(), createPipeline2, createPipelineSuccessExpect) + + clusterSummaryBody := HTTPExpect(s.T(), "https://localhost:8443").GET("/api/v1/cluster-summary"). + Expect(). + Status(200).Body().Raw() + var clusterSummaryExpect = `{"namespace":"numaflow-system","pipelineSummary":{"active":{"Healthy":2,"Warning":0,"Critical":0},"inactive":0},"isbServiceSummary":{"active":{"Healthy":1,"Warning":0,"Critical":0},"inactive":0}}` + assert.Contains(s.T(), clusterSummaryBody, clusterSummaryExpect) + + listPipelineBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/pipelines", Namespace)). + Expect(). + Status(200).Body().Raw() + assert.Contains(s.T(), listPipelineBody, testPipeline1Name) + assert.Contains(s.T(), listPipelineBody, testPipeline2Name) + + deletePipeline1 := HTTPExpect(s.T(), "https://localhost:8443").DELETE(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s", Namespace, testPipeline1Name)). + Expect(). + Status(200).Body().Raw() + deletePipeline2 := HTTPExpect(s.T(), "https://localhost:8443").DELETE(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s", Namespace, testPipeline2Name)). + Expect(). + Status(200).Body().Raw() + var deletePipelineSuccessExpect = `{"data":null}` + assert.Contains(s.T(), deletePipeline1, deletePipelineSuccessExpect) + assert.Contains(s.T(), deletePipeline2, deletePipelineSuccessExpect) + + stopPortForward() +} + +func (s *APISuite) TestPipeline1() { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + numaflowServerPodName := s.GetNumaflowServerPodName() + if numaflowServerPodName == "" { + panic("failed to find the nuamflow-server pod") + } + stopPortForward := s.StartPortForward(numaflowServerPodName, 8443) + + w := s.Given().Pipeline("@testdata/simple-pipeline.yaml"). + When(). + CreatePipelineAndWait() + defer w.DeletePipelineAndWait() + pipelineName := "simple-pipeline" + + w.Expect(). + VertexPodsRunning().DaemonPodsRunning(). + VertexPodLogContains("input", LogSourceVertexStarted). + VertexPodLogContains("p1", LogUDFVertexStarted, PodLogCheckOptionWithContainer("numa")). + VertexPodLogContains("output", SinkVertexStarted). + DaemonPodLogContains(pipelineName, LogDaemonStarted). + VertexPodLogContains("output", `"Data":.*,"Createdts":.*`) + + getPipelineISBsBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s/isbs", Namespace, pipelineName)). + Expect(). + Status(200).Body().Raw() + for strings.Contains(getPipelineISBsBody, "errMsg") { + select { + case <-ctx.Done(): + if ctx.Err() == context.DeadlineExceeded { + s.T().Fatalf("failed to get piplines/isbs: %v", ctx.Err()) + } + default: + time.Sleep(100 * time.Millisecond) + getPipelineISBsBody = HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s/isbs", Namespace, pipelineName)). + Expect(). + Status(200).Body().Raw() + } + } + + assert.Contains(s.T(), getPipelineISBsBody, `"bufferName":"numaflow-system-simple-pipeline-p1-0"`) + assert.Contains(s.T(), getPipelineISBsBody, `"bufferName":"numaflow-system-simple-pipeline-output-0"`) + + getPipelineBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s", Namespace, pipelineName)). + Expect(). + Status(200).Body().Raw() + assert.Contains(s.T(), getPipelineBody, `"name":"simple-pipeline"`) + assert.Contains(s.T(), getPipelineBody, `"status":"healthy"`) + + getPipelineWatermarksBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s/watermarks", Namespace, pipelineName)). + Expect(). + Status(200).Body().Raw() + assert.Contains(s.T(), getPipelineWatermarksBody, `watermarks`) + assert.Contains(s.T(), getPipelineWatermarksBody, `"edge":"input-p1"`) + assert.Contains(s.T(), getPipelineWatermarksBody, `"edge":"p1-output"`) + + getVerticesMetricsBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s/vertices/metrics", Namespace, pipelineName)). + Expect(). + Status(200).Body().Raw() + assert.Contains(s.T(), getVerticesMetricsBody, `"vertex":"input","processingRates"`) + assert.Contains(s.T(), getVerticesMetricsBody, `"vertex":"p1","processingRates"`) + assert.Contains(s.T(), getVerticesMetricsBody, `"vertex":"output","processingRates"`) + + getVerticesPodsBody := HTTPExpect(s.T(), "https://localhost:8443").GET(fmt.Sprintf("/api/v1/namespaces/%s/pipelines/%s/vertices/input/pods", Namespace, pipelineName)). + Expect(). + Status(200).Body().Raw() + assert.Contains(s.T(), getVerticesPodsBody, `simple-pipeline-input-0`) + + stopPortForward() +} + +func TestAPISuite(t *testing.T) { + suite.Run(t, new(APISuite)) +} diff --git a/test/api-e2e/testdata.go b/test/api-e2e/testdata.go new file mode 100644 index 0000000000..d3f1c1b0ab --- /dev/null +++ b/test/api-e2e/testdata.go @@ -0,0 +1,123 @@ +package api_e2e + +var ( + testPipeline1Name = "test-pipeline-1" + testPipeline1 = []byte(` +{ + "apiVersion": "numaflow.numaproj.io/v1alpha1", + "kind": "Pipeline", + "metadata": { + "name": "test-pipeline-1" + }, + "spec": { + "interStepBufferServiceName": "numaflow-e2e", + "vertices": [ + { + "name": "in", + "source": { + "generator": { + "rpu": 5, + "duration": "1s" + } + }, + "scale": { + "min": 1 + } + }, + { + "name": "cat", + "udf": { + "builtin": { + "name": "cat" + } + } + }, + { + "name": "out", + "sink": { + "log": {} + } + } + ], + "edges": [ + { + "from": "in", + "to": "cat" + }, + { + "from": "cat", + "to": "out" + } + ] + } +}`) + testPipeline2Name = "test-pipeline-2" + testPipeline2 = []byte(` +{ + "apiVersion": "numaflow.numaproj.io/v1alpha1", + "kind": "Pipeline", + "metadata": { + "name": "test-pipeline-2" + }, + "spec": { + "interStepBufferServiceName": "numaflow-e2e", + "vertices": [ + { + "name": "in", + "source": { + "generator": { + "rpu": 5, + "duration": "1s" + } + }, + "scale": { + "min": 1 + } + }, + { + "name": "cat", + "udf": { + "builtin": { + "name": "cat" + } + } + }, + { + "name": "out", + "sink": { + "log": {} + } + } + ], + "edges": [ + { + "from": "in", + "to": "cat" + }, + { + "from": "cat", + "to": "out" + } + ] + } +}`) + testISBSVCName = "test-isbsvc" + testISBSVCSpec = []byte(` +{ + "apiVersion": "numaflow.numaproj.io/v1alpha1", + "kind": "InterStepBufferService", + "metadata": { + "name": "test-isbsvc" + }, + "spec": { + "jetstream": { + "persistence": { + "volumeSize": "3Gi" + }, + "replicas": 3, + "version": "latest" + } + } +} +`) +) diff --git a/test/api-e2e/testdata/simple-pipeline.yaml b/test/api-e2e/testdata/simple-pipeline.yaml new file mode 100644 index 0000000000..efc85c5ae0 --- /dev/null +++ b/test/api-e2e/testdata/simple-pipeline.yaml @@ -0,0 +1,23 @@ +apiVersion: numaflow.numaproj.io/v1alpha1 +kind: Pipeline +metadata: + name: simple-pipeline +spec: + vertices: + - name: input + source: + generator: + rpu: 10 + duration: 1s + - name: p1 + udf: + builtin: + name: cat + - name: output + sink: + log: {} + edges: + - from: input + to: p1 + - from: p1 + to: output diff --git a/test/fixtures/e2e_suite.go b/test/fixtures/e2e_suite.go index 2bc2de86d5..0c1756580d 100644 --- a/test/fixtures/e2e_suite.go +++ b/test/fixtures/e2e_suite.go @@ -192,6 +192,20 @@ func (s *E2ESuite) Given() *Given { } } +func (s *E2ESuite) GetNumaflowServerPodName() string { + s.T().Log("Get numaflow server pod name") + podList, err := s.kubeClient.CoreV1().Pods(Namespace).List(context.Background(), metav1.ListOptions{}) + if err != nil { + panic(err) + } + for _, pod := range podList.Items { + if strings.Contains(pod.Name, "numaflow-server") { + return pod.Name + } + } + return "" +} + func (s *E2ESuite) StartPortForward(podName string, port int) (stopPortForward func()) { s.T().Log("Starting port-forward to pod :", podName, port) diff --git a/ui/package.json b/ui/package.json index 980715d352..2b1155c569 100644 --- a/ui/package.json +++ b/ui/package.json @@ -7,6 +7,7 @@ "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", "@material-ui/core": "^4.12.4", + "@monaco-editor/react": "^4.5.2", "@mui/icons-material": "^5.6.2", "@mui/material": "^5.6.3", "@stardazed/streams-polyfill": "^2.4.0", @@ -42,7 +43,8 @@ "reactflow": "^11.5.5", "resize-observer-polyfill": "^1.5.1", "typescript": "^4.4.2", - "web-vitals": "^2.1.0" + "web-vitals": "^2.1.0", + "yaml": "^2.3.2" }, "scripts": { "start": "react-scripts start", @@ -71,7 +73,8 @@ "eslint-plugin-prettier": "3.3.1", "jest-junit": "^12.0.0", "prettier": "2.5.1", - "react-scripts": "5.0.1" + "react-scripts": "5.0.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2" }, "resolutions": { "nth-check": "^2.0.1" diff --git a/ui/src/App.css b/ui/src/App.css index f398015640..3efacd0ace 100644 --- a/ui/src/App.css +++ b/ui/src/App.css @@ -3,6 +3,7 @@ body, #root, .MuiScopedCssBaseline-root { height: 100%; + font-family: Avenir !important; } .App-side-nav-link { @@ -15,6 +16,28 @@ body, } .logo { - margin-left: -15px; - margin-top: 5px; + width: 2.6875rem; +} + +.text-logo { + margin-left: 0.81rem; + width: 9.125rem; +} + +.app-container { + height: 100%; +} + +.MuiAppBar-root { + height: 3.75rem; + background: linear-gradient(90deg, #00254A 2.77%, #3492EF 105.54%) !important; +} + +.MuiToolbar-root { + padding-left: 1.25rem !important; + min-height: 3.75rem !important; +} + +.MuiBackdrop-root { + opacity: 0 !important; } diff --git a/ui/src/App.tsx b/ui/src/App.tsx index a1a80665ee..e037eda398 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -1,98 +1,225 @@ +import React, { + useCallback, + useEffect, + useMemo, + useState, + useRef, +} from "react"; import ScopedCssBaseline from "@mui/material/ScopedCssBaseline"; import Box from "@mui/material/Box"; +import Drawer from "@mui/material/Drawer"; import AppBar from "@mui/material/AppBar"; import Toolbar from "@mui/material/Toolbar"; -import Typography from "@mui/material/Typography"; -import { Slide, ToastContainer } from "react-toastify"; +import CircularProgress from "@mui/material/CircularProgress"; import { Routes, Route } from "react-router-dom"; import { Breadcrumbs } from "./components/common/Breadcrumbs"; +import { Cluster } from "./components/pages/Cluster"; import { Namespaces } from "./components/pages/Namespace"; import { Pipeline } from "./components/pages/Pipeline"; -import logo from "./images/icon-on-blue-bg.png"; +import { useSystemInfoFetch } from "./utils/fetchWrappers/systemInfoFetch"; +import { notifyError } from "./utils/error"; +import { toast } from "react-toastify"; +import { + SlidingSidebar, + SlidingSidebarProps, +} from "./components/common/SlidingSidebar"; +import { AppContextProps } from "./types/declarations/app"; +import logo from "./images/icon.png"; +import textLogo from "./images/text-icon.png"; import "./App.css"; import "react-toastify/dist/ReactToastify.css"; +export const AppContext = React.createContext({ + systemInfo: undefined, + systemInfoError: undefined, +}); + function App() { + // TODO remove, used for testing ns only installation + // const { systemInfo, error: systemInfoError } = { + // systemInfo: { + // namespaced: true, + // managedNamespace: "test", + // }, + // error: undefined, + // }; + const pageRef = useRef(); + const [pageWidth, setPageWidth] = useState(0); + const [sidebarProps, setSidebarProps] = useState< + SlidingSidebarProps | undefined + >(); + const { systemInfo, error: systemInfoError, loading } = useSystemInfoFetch(); + + // Resize observer to keep page width in state. To be used by other dependent components. + useEffect(() => { + if (!pageRef.current) { + return; + } + const resizeObserver = new ResizeObserver(() => { + setPageWidth(pageRef.current.offsetWidth); + }); + resizeObserver.observe(pageRef.current); + return function cleanup() { + resizeObserver.disconnect(); + }; + }, [pageRef.current]); + + // Notify if error loading system info + useEffect(() => { + if (systemInfoError) { + notifyError([ + { + error: systemInfoError, + options: { toastId: "system-info-fetch", autoClose: 5000 }, + }, + ]); + } + }, [systemInfoError]); + + const handleSideBarClose = useCallback(() => { + setSidebarProps(undefined); + // remove all toast when sidebar is closed + toast.dismiss(); + }, []); + + const routes = useMemo(() => { + if (loading) { + // System info loading + return ( + + + + ); + } + if (systemInfoError) { + // System info load error + return ( + + {`Error loading System Info: ${systemInfoError}`} + + ); + } + if (systemInfo && systemInfo?.namespaced) { + // Namespaced installation routing + return ( + + } /> + } /> + +

There's nothing here!

+ + } + /> +
+ ); + } + // Cluster installation routing + return ( + + } /> + } /> + } + /> + +

There's nothing here!

+ + } + /> +
+ ); + }, [systemInfo, systemInfoError, loading]); + return ( - <> - - +
+ + - theme.zIndex.drawer + 1, + height: "4rem", }} > - - logo - - Numaflow - - - - - - - - } /> - } - /> - -

There's nothing here!

- - } - /> -
+ theme.zIndex.drawer + 1, + }} + > + + logo + text-logo + + +
+ theme.zIndex.drawer - 1, + position: "fixed", + top: "3.75rem", + }} + > + + + + {routes} + - -
- - + + + + {sidebarProps && ( + + )} + +
+
); } diff --git a/ui/src/components/common/Breadcrumbs/index.tsx b/ui/src/components/common/Breadcrumbs/index.tsx index ff15621a6e..06d1b007df 100644 --- a/ui/src/components/common/Breadcrumbs/index.tsx +++ b/ui/src/components/common/Breadcrumbs/index.tsx @@ -1,61 +1,123 @@ -import React, { useMemo } from "react"; +import React, { useMemo, useContext } from "react"; import { Link, useLocation } from "react-router-dom"; import MUIBreadcrumbs from "@mui/material/Breadcrumbs"; import Typography from "@mui/material/Typography"; +import { AppContext } from "../../../App"; +import { AppContextProps } from "../../../types/declarations/app"; +import chevron from "../../../images/chevron-sm-right.png"; import "./style.css"; export function Breadcrumbs() { const location = useLocation(); + const { systemInfo } = useContext(AppContext); const crumbs = useMemo(() => { - const { pathname } = location; - if (pathname === "/") { - // Namespaces (home) - return ( - - Namespaces - - ); + if (!systemInfo) { + // Wait for sysinfo before building crumbs + return
; } + const isNamespaced = systemInfo.namespaced; + const { pathname } = location; const pathParts = pathname.split("/"); // safety check for trailing slash if (pathname.charAt(pathname.length - 1) === "/") pathParts.pop(); - switch (pathParts.length) { - case 5: // pipeline view - return [ - - Namespaces - , - - {`${pathParts[2]} (${pathParts[4]})`} - , - ]; - default: - // Unsupported path - return ( - - Unknown - - ); + if (isNamespaced) { + // Namespace installation + switch (pathParts.length) { + case 1: // Namespace summary view + return ( + + Namespace + + ); + case 3: // Pipeline summary view + return [ + + Namespace + , + + {pathParts[2]} + , + ]; + default: + break; + } + } else { + // Cluster installation + switch (pathParts.length) { + case 1: // Cluster summary view + return ( + + Namespaces + + ); + case 3: // Namespace summary view + return [ + + Namespaces + , + + {pathParts[2]} + , + ]; + case 5: // Pipeline summary view + return [ + + Namespaces + , + + {pathParts[2]} + , + + {pathParts[4]} + , + ]; + default: + break; + } } - }, [location]); + // Unsupported path + return ( + + Unknown + + ); + }, [location, systemInfo]); return ( + } aria-label="breadcrumb" > {crumbs} diff --git a/ui/src/components/common/Breadcrumbs/style.css b/ui/src/components/common/Breadcrumbs/style.css index 4342cc8653..cec3cff840 100644 --- a/ui/src/components/common/Breadcrumbs/style.css +++ b/ui/src/components/common/Breadcrumbs/style.css @@ -1,17 +1,41 @@ .Breadcrumbs { - margin-bottom: 1rem !important; + margin: 0.5rem 1.25rem !important; + overflow: hidden !important; } .Breadcrumbs-typ { - color: slategray; - font-weight: 600 !important; + color: var(--badge-pending, #6B6C72); + font-size: 0.75rem !important; + font-style: normal !important; + font-weight: 400 !important; + line-height: 1rem !important; } .Breadcrumbs-link { text-decoration: none; - color: inherit; + font-size: 0.75rem !important; + font-style: normal !important; + font-weight: 400 !important; + line-height: 1rem !important; + color: #0077C5; } .Breadcrumbs-link:hover { text-decoration: underline; } + +.MuiBreadcrumbs-li { + display: flex !important; +} + +.MuiBreadcrumbs-separator { + margin: 0 0.3125rem !important; + font-size: 1rem !important; +} + +.crumb-separator { + width: 1.875rem; + height: 1.8125rem; + margin: -0.3125rem; + margin-top: -0.25rem; +} diff --git a/ui/src/components/common/DebouncedSearchInput/index.tsx b/ui/src/components/common/DebouncedSearchInput/index.tsx new file mode 100644 index 0000000000..a4111e9058 --- /dev/null +++ b/ui/src/components/common/DebouncedSearchInput/index.tsx @@ -0,0 +1,91 @@ +import React, { useCallback, useState, useEffect } from "react"; +import TextField from "@mui/material/TextField"; +import { styled } from "@mui/material/styles"; +import InputAdornment from "@mui/material/InputAdornment"; +import SearchIcon from "@mui/icons-material/Search"; + +import "./style.css"; + +export interface DebouncedSearchInputProps { + disabled?: boolean; + placeHolder?: string; + onChange: (value: string) => void; +} + +const CssTextField = styled(TextField)({ + background: "#FFFFFF !important", + border: + "1px solid var(--neutral-peppercorn-a-30, rgba(36, 28, 21, 0.30)) !important", + "& label.Mui-focused": { + border: 0, + }, + "& .MuiInput-underline:after": { + border: 0, + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + border: 0, + }, + "&:hover fieldset": { + border: 0, + }, + "&.Mui-focused fieldset": { + border: 0, + }, + }, +}); + +export function DebouncedSearchInput({ + disabled = false, + placeHolder, + onChange, +}: DebouncedSearchInputProps) { + const [timerId, setTimerId] = useState(); + + const debounceValue = useCallback( + (updatedValue: string) => { + if (timerId) { + clearTimeout(timerId); + } + setTimerId(setTimeout(() => onChange(updatedValue), 500)); + }, + [onChange, timerId] + ); + + const handleInputChange = useCallback( + (event: { target: { value: string } }) => { + debounceValue(event.target.value); + }, + [debounceValue] + ); + + useEffect(() => { + // Clear timer on dismount + return () => { + if (timerId) { + clearTimeout(timerId); + } + }; + }, [timerId]); + + return ( + + + + ), + }} + onChange={handleInputChange} + /> + ); +} diff --git a/ui/src/components/common/DebouncedSearchInput/style.css b/ui/src/components/common/DebouncedSearchInput/style.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/src/components/common/SlidingSidebar/index.tsx b/ui/src/components/common/SlidingSidebar/index.tsx new file mode 100644 index 0000000000..051c66b889 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/index.tsx @@ -0,0 +1,199 @@ +import React, { useState, useEffect, useCallback, useMemo } from "react"; +import Box from "@mui/material/Box"; +import { K8sEvents, K8sEventsProps } from "./partials/K8sEvents"; +import { VertexDetails, VertexDetailsProps } from "./partials/VertexDetails"; +import { PiplineSpec, PiplineSpecProps } from "./partials/PipelineSpec"; +import { EdgeDetails, EdgeDetailsProps } from "./partials/EdgeDetails"; +import { + GeneratorDetails, + GeneratorDetailsProps, +} from "./partials/GeneratorDetails"; +import { Errors, ErrorsProps } from "./partials/Errors"; +import IconButton from "@mui/material/IconButton"; +import CloseIcon from "@mui/icons-material/Close"; +import slider from "../../../images/slider.png"; + +import "./style.css"; + +export enum SidebarType { + NAMESPACE_K8s, + PIPELINE_K8s, + VERTEX_DETAILS, + EDGE_DETAILS, + PIPELINE_SPEC, + GENERATOR_DETAILS, + ERRORS, +} + +const MIN_WIDTH_BY_TYPE = { + [SidebarType.NAMESPACE_K8s]: 750, + [SidebarType.PIPELINE_K8s]: 750, + [SidebarType.VERTEX_DETAILS]: 750, + [SidebarType.EDGE_DETAILS]: 750, + [SidebarType.PIPELINE_SPEC]: 750, + [SidebarType.GENERATOR_DETAILS]: 750, + [SidebarType.ERRORS]: 350, +}; + +export interface SlidingSidebarProps { + pageWidth: number; + slide?: boolean; + type: SidebarType; + k8sEventsProps?: K8sEventsProps; + vertexDetailsProps?: VertexDetailsProps; + edgeDetailsProps?: EdgeDetailsProps; + pipelineSpecProps?: PiplineSpecProps; + generatorDetailsProps?: GeneratorDetailsProps; + errorsProps?: ErrorsProps; + onClose: () => void; +} + +export function SlidingSidebar({ + pageWidth, + slide = true, + type, + k8sEventsProps, + vertexDetailsProps, + edgeDetailsProps, + pipelineSpecProps, + generatorDetailsProps, + errorsProps, + onClose, +}: SlidingSidebarProps) { + const [width, setWidth] = useState( + errorsProps + ? MIN_WIDTH_BY_TYPE[SidebarType.ERRORS] + : pageWidth + ? pageWidth / 2 + : 0 + ); + const [minWidth, setMinWidth] = useState(0); + + // Set min width by type + useEffect(() => { + setMinWidth(MIN_WIDTH_BY_TYPE[type] || 0); + }, [type]); + + // Don't allow width greater then pageWidth + useEffect(() => { + if (width > pageWidth) { + setWidth(pageWidth); + } + }, [width, pageWidth]); + + const dragHandler = useCallback( + (mouseDownEvent) => { + const startWidth = width; + const startPosition = mouseDownEvent.pageX; + const onMouseMove = (mouseMoveEvent) => { + const result = startWidth + startPosition - mouseMoveEvent.pageX; + if (!minWidth || result >= minWidth) { + setWidth(result); + } + }; + const onMouseUp = () => { + document.body.removeEventListener("mousemove", onMouseMove); + }; + document.body.addEventListener("mousemove", onMouseMove); + document.body.addEventListener("mouseup", onMouseUp, { once: true }); + }, + [width, minWidth] + ); + + const content = useMemo(() => { + switch (type) { + case SidebarType.NAMESPACE_K8s: + case SidebarType.PIPELINE_K8s: + if (!k8sEventsProps) { + break; + } + return ; + case SidebarType.VERTEX_DETAILS: + if (!vertexDetailsProps) { + break; + } + return ; + case SidebarType.EDGE_DETAILS: + if (!edgeDetailsProps) { + break; + } + return ; + case SidebarType.PIPELINE_SPEC: + if (!pipelineSpecProps) { + break; + } + return ; + case SidebarType.GENERATOR_DETAILS: + if (!generatorDetailsProps) { + break; + } + return ; + case SidebarType.ERRORS: + if (!errorsProps) { + break; + } + return ; + default: + break; + } + return
Missing Props
; + }, [type, k8sEventsProps, vertexDetailsProps]); + + return ( + + {slide && ( + + slider + + )} + + + + + + + {content} + + + ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/EdgeDetails/index.tsx b/ui/src/components/common/SlidingSidebar/partials/EdgeDetails/index.tsx new file mode 100644 index 0000000000..15cea7566d --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/EdgeDetails/index.tsx @@ -0,0 +1,73 @@ +import React from "react"; +import Box from "@mui/material/Box"; +import TableContainer from "@mui/material/TableContainer"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableHead from "@mui/material/TableHead"; +import TableRow from "@mui/material/TableRow"; + +import "./style.css"; + +export interface EdgeDetailsProps { + edgeId: string; + watermarks: number[]; +} + +export function EdgeDetails({ edgeId, watermarks }: EdgeDetailsProps) { + return ( + + + {`${edgeId} Edge`} + + + + + + Partition + Watermark + + + + {(!watermarks || !watermarks.length) && ( + + + No watermarks found + + + )} + {!!watermarks && + !!watermarks.length && + watermarks.map((watermark: number, index: number) => ( + + {index} + + {watermark < 0 + ? watermark + : `${watermark} (${new Date(watermark).toISOString()})`} + + + ))} + +
+
+
+ ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/EdgeDetails/style.css b/ui/src/components/common/SlidingSidebar/partials/EdgeDetails/style.css new file mode 100644 index 0000000000..2039ed9093 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/EdgeDetails/style.css @@ -0,0 +1,5 @@ +.edge-details-header-text { + font-size: 1.25rem; + font-style: normal; + font-weight: 500; +} \ No newline at end of file diff --git a/ui/src/components/common/SlidingSidebar/partials/Errors/index.tsx b/ui/src/components/common/SlidingSidebar/partials/Errors/index.tsx new file mode 100644 index 0000000000..4f1fa88b06 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/Errors/index.tsx @@ -0,0 +1,54 @@ +import React, { useMemo } from "react"; +import Box from "@mui/material/Box"; +import { Slide, ToastContainer } from "react-toastify"; + +import "./style.css"; + +export interface ErrorsProps { + errors: boolean; +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function Errors({ errors }: ErrorsProps) { + const header = useMemo(() => { + const headerContainerStyle = { + display: "flex", + flexDirection: "row", + }; + const textClass = "vertex-details-header-text"; + + return ( + + Errors + + ); + }, []); + + return ( + + + {header} + + + + ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/Errors/style.css b/ui/src/components/common/SlidingSidebar/partials/Errors/style.css new file mode 100644 index 0000000000..b46961c0c0 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/Errors/style.css @@ -0,0 +1,5 @@ +.vertex-details-header-text { + font-size: 1.25rem; + font-style: normal; + font-weight: 500; +} diff --git a/ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/index.tsx b/ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/index.tsx new file mode 100644 index 0000000000..baf9f50d52 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/index.tsx @@ -0,0 +1,103 @@ +import React, { useCallback, useEffect, useMemo, useState } from "react"; +import Tabs from "@mui/material/Tabs"; +import Tab from "@mui/material/Tab"; +import Box from "@mui/material/Box"; +import { SpecEditor } from "../VertexDetails/partials/SpecEditor"; + +import "./style.css"; + +const SPEC_TAB_INDEX = 0; + +export enum VertexType { + GENERATOR, +} + +export interface GeneratorDetailsProps { + namespaceId?: string; + pipelineId?: string; + vertexId: string; + generatorDetails: any; +} + +export function GeneratorDetails({ + vertexId, + generatorDetails, +}: GeneratorDetailsProps) { + const [generatorSpec, setGeneratorSpec] = useState(); + const [vertexType, setVertexType] = useState(); + const [tabValue, setTabValue] = useState(SPEC_TAB_INDEX); + + // Find the vertex spec by id + useEffect(() => { + setVertexType(VertexType.GENERATOR); + setGeneratorSpec(generatorDetails?.data?.nodeInfo); + }, [vertexId, generatorDetails]); + + const handleTabChange = useCallback( + (event: React.SyntheticEvent, newValue: number) => { + setTabValue(newValue); + }, + [] + ); + + const header = useMemo(() => { + const headerContainerStyle = { + display: "flex", + flexDirection: "row", + }; + const textClass = "vertex-details-header-text"; + switch (vertexType) { + case VertexType.GENERATOR: + return ( + + Generator Vertex + + ); + default: + return ( + + Vertex + + ); + } + }, [vertexType]); + + return ( + + {header} + + + + + + + + ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/style.css b/ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/style.css new file mode 100644 index 0000000000..e24dc694e6 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/GeneratorDetails/style.css @@ -0,0 +1,29 @@ +.vertex-details-header-text { + font-size: 1.25rem; + font-style: normal; + font-weight: 500; +} + +.vertex-details-tab-panel { + height: 100%; +} + +.vertex-details-tab.MuiTab-root { + font-size: 14px !important; + font-style: normal !important; + font-weight: 600 !important; + color: #6B6C72 !important; + text-transform: none !important; +} + +.vertex-details-tab-selected.MuiTab-root { + font-size: 14px !important; + font-style: normal !important; + font-weight: 600 !important; + color: #393A3D !important; + text-transform: none !important; +} + +.vertex-details-tabs > .MuiTabs-scroller > .MuiTabs-indicator { + background-color: #037C8F !important; +} \ No newline at end of file diff --git a/ui/src/components/common/SlidingSidebar/partials/K8sEvents/index.tsx b/ui/src/components/common/SlidingSidebar/partials/K8sEvents/index.tsx new file mode 100644 index 0000000000..eed1d5343c --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/K8sEvents/index.tsx @@ -0,0 +1,230 @@ +import React, { useCallback, useMemo, useEffect, useState } from "react"; +import Box from "@mui/material/Box"; +import Paper from "@mui/material/Paper"; +import TableContainer from "@mui/material/TableContainer"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableHead from "@mui/material/TableHead"; +import TableRow from "@mui/material/TableRow"; +import Pagination from "@mui/material/Pagination"; +import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; +import ToggleButton from "@mui/material/ToggleButton"; +import CircularProgress from "@mui/material/CircularProgress"; +import { K8sEvent } from "../../../../../types/declarations/namespace"; +import { useNamespaceK8sEventsFetch } from "../../../../../utils/fetchWrappers/namespaceK8sEventsFetch"; + +import "./style.css"; + +const MAX_PAGE_SIZE = 6; + +export interface K8sEventsProps { + namespaceId: string; + excludeHeader?: boolean; + square?: boolean; +} + +export function K8sEvents({ + namespaceId, + excludeHeader = false, + square = false, +}: K8sEventsProps) { + const [page, setPage] = useState(1); + const [totalPages, setTotalPages] = useState(0); + const [typeFilter, setTypeFilter] = useState(); + const [filteredEvents, setFilteredEvents] = React.useState([]); + const { data, loading, error } = useNamespaceK8sEventsFetch({ + namespace: namespaceId, + }); + + // Update filtered events based on page selected and filter + useEffect(() => { + if (!data) { + setFilteredEvents([]); + setPage(1); + setTotalPages(0); + return; + } + let filtered: K8sEvent[] = data.events; + if (typeFilter) { + filtered = filtered.filter( + (event) => event.type.toLowerCase() === typeFilter + ); + } + + // Break list into pages + const pages = filtered.reduce((resultArray: any[], item, index) => { + const chunkIndex = Math.floor(index / MAX_PAGE_SIZE); + if (!resultArray[chunkIndex]) { + resultArray[chunkIndex] = []; + } + resultArray[chunkIndex].push(item); + return resultArray; + }, []); + + if (page > pages.length) { + // Reset to page 1 if current page is greater than total pages after filtering + setPage(1); + } + // Set filtered namespaces with current page + setFilteredEvents(pages[page - 1] || []); + setTotalPages(pages.length); + }, [data, page, typeFilter]); + + const handlePageChange = useCallback( + (event: React.ChangeEvent, value: number) => { + setPage(value); + }, + [] + ); + + const handleTypeFilterChange = useCallback( + (event: React.MouseEvent, value: string | undefined) => { + setTypeFilter(value); + }, + [] + ); + + const typeCounts = useMemo(() => { + if (!data) { + return undefined; + } + + return ( + + + + Normal +
+ {data.normalCount} +
+
+
+ + + Warning +
+ {data.warningCount} +
+
+
+
+ ); + }, [data, typeFilter, handleTypeFilterChange]); + + const table = useMemo(() => { + if (!data) { + return No Events; + } + return ( + + + + + + Timestamp + Type + Object + Reason + Message + + + + {!filteredEvents.length && ( + + + No events found + + + )} + {!!filteredEvents.length && + filteredEvents.map((event) => ( + + {event.timestamp} + {event.type} + {event.object} + {event.reason} + {event.message} + + ))} + +
+
+ + + +
+ ); + }, [data, page, totalPages, filteredEvents, handlePageChange]); + + return ( + + {!excludeHeader && ( + K8s Events + )} + + {loading && ( + + + + )} + {error && ( + {`Error loading events: ${error}`} + )} + {typeCounts} + {table} + + + ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/K8sEvents/style.css b/ui/src/components/common/SlidingSidebar/partials/K8sEvents/style.css new file mode 100644 index 0000000000..8676c82ae7 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/K8sEvents/style.css @@ -0,0 +1,35 @@ +.namespace-k8s-title { + font-size: 1.25rem; + font-style: normal; + font-weight: 500; +} + +.namespace-k8s-type-count-badge > .MuiBadge-badge { + color: #FFF !important; +} + +.namespace-k8s-type-count-badge { + padding: 0.125rem 0.375rem; + border-radius: 0.3125rem; + color: #FFF; + margin-left: 0.3125rem; +} + +.normal { + background-color: #00BB42; +} + +.warn { + background-color: #FB0; +} + +.namespace-k8s-type-count-text { + text-transform: none; + font-family: Avenir; +} + +.MuiTableCell-root { + background-color: #FFF !important; + border-bottom: 1px solid #DCDCDC !important; + padding: 1rem 0.5rem !important; +} \ No newline at end of file diff --git a/ui/src/components/common/SlidingSidebar/partials/PipelineSpec/index.tsx b/ui/src/components/common/SlidingSidebar/partials/PipelineSpec/index.tsx new file mode 100644 index 0000000000..0a4947e255 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/PipelineSpec/index.tsx @@ -0,0 +1,58 @@ +import React, { useMemo } from "react"; +import Box from "@mui/material/Box"; +import Paper from "@mui/material/Paper"; +import YAML from "yaml"; +import Editor from "@monaco-editor/react"; +import CircularProgress from "@mui/material/CircularProgress"; + +import "./style.css"; + +export interface PiplineSpecProps { + spec: any; + titleOverride?: string; +} + +export function PiplineSpec({ spec, titleOverride }: PiplineSpecProps) { + const editor = useMemo(() => { + if (!spec) { + return Pipeline spec not found; + } + return ( + + + + + } + /> + + ); + }, [spec]); + + return ( + + + {titleOverride || "Pipeline Spec"} + + {editor} + + ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/PipelineSpec/style.css b/ui/src/components/common/SlidingSidebar/partials/PipelineSpec/style.css new file mode 100644 index 0000000000..981c49b2a7 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/PipelineSpec/style.css @@ -0,0 +1,5 @@ +.pipeline-spec-header-text { + font-size: 1.25rem; + font-style: normal; + font-weight: 500; +} \ No newline at end of file diff --git a/ui/src/components/common/SlidingSidebar/partials/VertexDetails/index.tsx b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/index.tsx new file mode 100644 index 0000000000..fee20e01a7 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/index.tsx @@ -0,0 +1,251 @@ +import React, { useCallback, useEffect, useMemo, useState } from "react"; +import Tabs from "@mui/material/Tabs"; +import Tab from "@mui/material/Tab"; +import Box from "@mui/material/Box"; +import { SpecEditor } from "./partials/SpecEditor"; +import { ProcessingRates } from "./partials/ProcessingRates"; +import { K8sEvents } from "../K8sEvents"; +import { Buffers } from "./partials/Buffers"; +import { Pods } from "../../../../pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods"; +import sourceIcon from "../../../../../images/source_vertex.png"; +import sinkIcon from "../../../../../images/sink_vertex.png"; +import mapIcon from "../../../../../images/map_vertex.png"; +import reducIcon from "../../../../../images/reduce_vertex.png"; + +import "./style.css"; + +const PODS_VIEW_TAB_INDEX = 0; +const SPEC_TAB_INDEX = 1; +const PROCESSING_RATES_TAB_INDEX = 2; +const K8S_EVENTS_TAB_INDEX = 3; +const BUFFERS_TAB_INDEX = 4; + +export enum VertexType { + SOURCE, + SINK, + MAP, + REDUCE, +} + +export interface VertexDetailsProps { + namespaceId: string; + pipelineId: string; + vertexId: string; + vertexSpecs: any; + vertexMetrics: any; + buffers: any[]; + type: string; +} + +export function VertexDetails({ + namespaceId, + pipelineId, + vertexId, + vertexSpecs, + vertexMetrics, + buffers, + type, +}: VertexDetailsProps) { + const [vertexSpec, setVertexSpec] = useState(); + const [vertexType, setVertexType] = useState(); + const [tabValue, setTabValue] = useState(PODS_VIEW_TAB_INDEX); + + // Find the vertex spec by id + useEffect(() => { + if (type === "source") { + setVertexType(VertexType.SOURCE); + } else if (type === "udf" && vertexSpecs?.udf?.groupBy) { + setVertexType(VertexType.REDUCE); + } else if (type === "udf") { + setVertexType(VertexType.MAP); + } else if (type === "sink") { + setVertexType(VertexType.SINK); + } + setVertexSpec(vertexSpecs); + }, [vertexSpecs, type]); + + const handleTabChange = useCallback( + (event: React.SyntheticEvent, newValue: number) => { + setTabValue(newValue); + }, + [] + ); + + const header = useMemo(() => { + const headerContainerStyle = { + display: "flex", + flexDirection: "row", + alignItems: "center", + }; + const textClass = "vertex-details-header-text"; + switch (vertexType) { + case VertexType.SOURCE: + return ( + + source vertex + Input Vertex + + ); + case VertexType.REDUCE: + return ( + + reduce vertex + Processor Vertex + + ); + case VertexType.MAP: + return ( + + map vertex + Processor Vertex + + ); + case VertexType.SINK: + return ( + + sink vertex + Sink Vertex + + ); + default: + return ( + + Vertex + + ); + } + }, [vertexType]); + + return ( + + {header} + + + + + + + {buffers && ( + + )} + + + + + + + {buffers && ( + + )} + + ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/Buffers/index.tsx b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/Buffers/index.tsx new file mode 100644 index 0000000000..c734b9acd6 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/Buffers/index.tsx @@ -0,0 +1,85 @@ +import React from "react"; +import Box from "@mui/material/Box"; +import TableContainer from "@mui/material/TableContainer"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableHead from "@mui/material/TableHead"; +import TableRow from "@mui/material/TableRow"; + +export interface BuffersProps { + buffers: any[]; +} + +export function Buffers({ buffers }: BuffersProps) { + if (!buffers) { + return
{`No resources found.`}
; + } + + return ( + + + + + + Partition + isFull + AckPending + Pending + Buffer Length + Buffer Usage + Total Pending Messages + + + + {!buffers.length && ( + + + No buffer information found + + + )} + {!!buffers.length && + buffers.map((buffer, idx) => { + let isFull; + if (buffer?.isFull) { + isFull = "yes"; + } else { + isFull = "no"; + } + let bufferUsage = ""; + if (typeof buffer?.bufferUsage !== "undefined") { + bufferUsage = (buffer?.bufferUsage * 100).toFixed(2); + } + return ( + + {buffer?.bufferName} + {isFull} + + {buffer?.ackPendingCount} + + + {buffer?.pendingCount} + + + {buffer?.bufferLength} + + {bufferUsage}% + + {buffer?.totalMessages} + + + ); + })} + +
+
+
+ ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/ProcessingRates/index.tsx b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/ProcessingRates/index.tsx new file mode 100644 index 0000000000..4ff00b555e --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/ProcessingRates/index.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useState } from "react"; +import Box from "@mui/material/Box"; +import TableContainer from "@mui/material/TableContainer"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableHead from "@mui/material/TableHead"; +import TableRow from "@mui/material/TableRow"; +import { PipelineVertexMetric } from "../../../../../../../types/declarations/pipeline"; + +import "./style.css"; + +export interface ProcessingRatesProps { + vertexId: string; + pipelineId: string; + vertexMetrics: any[]; +} + +export function ProcessingRates({ + vertexMetrics, + pipelineId, + vertexId, +}: ProcessingRatesProps) { + const [foundRates, setFoundRates] = useState([]); + + useEffect(() => { + if (!vertexMetrics || !pipelineId || !vertexId) { + return; + } + const vertexData = vertexMetrics[vertexId]; + if (!vertexData) { + return; + } + const rates: PipelineVertexMetric[] = []; + vertexData.forEach((item: any, index: number) => { + if (item.pipeline !== pipelineId || !item.processingRates) { + return; // continue + } + rates.push({ + partition: index, + oneM: item.processingRates["1m"] + ? item.processingRates["1m"].toFixed(2) + : 0, + fiveM: item.processingRates["5m"] + ? item.processingRates["5m"].toFixed(2) + : 0, + fifteenM: item.processingRates["15m"] + ? item.processingRates["15m"].toFixed(2) + : 0, + }); + }); + setFoundRates(rates); + }, [vertexMetrics, pipelineId, vertexId]); + + return ( + + + + + + Partition + 1m + 5m + 15m + + + + {!foundRates.length && ( + + + No metrics found + + + )} + {!!foundRates.length && + foundRates.map((metric) => ( + + {metric.partition} + {metric.oneM} + {metric.fiveM} + {metric.fifteenM} + + ))} + +
+
+
+ ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/ProcessingRates/style.css b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/ProcessingRates/style.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/SpecEditor/index.tsx b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/SpecEditor/index.tsx new file mode 100644 index 0000000000..54077d69f1 --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/SpecEditor/index.tsx @@ -0,0 +1,50 @@ +import React, { useMemo } from "react"; +import Box from "@mui/material/Box"; +import Paper from "@mui/material/Paper"; +import YAML from "yaml"; +import Editor from "@monaco-editor/react"; +import CircularProgress from "@mui/material/CircularProgress"; + +import "./style.css"; + +export interface SpecEditorProps { + vertexId: string; + vertexSpec: any; +} + +export function SpecEditor({ vertexId, vertexSpec }: SpecEditorProps) { + const editor = useMemo(() => { + if (!vertexSpec) { + return Vertex spec not found; + } + return ( + + + + + } + /> + + ); + }, [vertexId, vertexSpec]); + + return ( + + {editor} + + ); +} diff --git a/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/SpecEditor/style.css b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/partials/SpecEditor/style.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ui/src/components/common/SlidingSidebar/partials/VertexDetails/style.css b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/style.css new file mode 100644 index 0000000000..c2e4b9e3ce --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/partials/VertexDetails/style.css @@ -0,0 +1,34 @@ +.vertex-details-header-text { + font-size: 1.25rem; + font-style: normal; + font-weight: 500; + margin-left: 1rem; +} + +.vertex-details-header-icon { + width: 2.25rem; +} + +.vertex-details-tab-panel { + height: 100%; +} + +.vertex-details-tab.MuiTab-root { + font-size: 14px !important; + font-style: normal !important; + font-weight: 600 !important; + color: #6B6C72 !important; + text-transform: none !important; +} + +.vertex-details-tab-selected.MuiTab-root { + font-size: 14px !important; + font-style: normal !important; + font-weight: 600 !important; + color: #393A3D !important; + text-transform: none !important; +} + +.vertex-details-tabs > .MuiTabs-scroller > .MuiTabs-indicator { + background-color: #037C8F !important; +} diff --git a/ui/src/components/common/SlidingSidebar/style.css b/ui/src/components/common/SlidingSidebar/style.css new file mode 100644 index 0000000000..75efe5d0cf --- /dev/null +++ b/ui/src/components/common/SlidingSidebar/style.css @@ -0,0 +1,7 @@ +.sidebar-drag-icon { + margin-left: -1.5rem; +} + +.sidebar-drawer > .MuiDrawer-paper { + overflow-y: visible !important; +} \ No newline at end of file diff --git a/ui/src/components/common/StatusBar/index.tsx b/ui/src/components/common/StatusBar/index.tsx new file mode 100644 index 0000000000..d0b0e64fe6 --- /dev/null +++ b/ui/src/components/common/StatusBar/index.tsx @@ -0,0 +1,54 @@ +import React from "react"; +import Box from "@mui/material/Box"; + +import "./style.css"; + +export interface StatusBarProps { + healthy: number; + warning: number; + critical: number; +} + +export function StatusBar({ healthy, warning, critical }: StatusBarProps) { + return ( + +
+
+
+
+
+
+ + + {healthy} + Healthy + + + {warning} + Warning + + + {critical} + Critical + + + + ); +} diff --git a/ui/src/components/common/StatusBar/style.css b/ui/src/components/common/StatusBar/style.css new file mode 100644 index 0000000000..018c1cf5e9 --- /dev/null +++ b/ui/src/components/common/StatusBar/style.css @@ -0,0 +1,36 @@ +.status-bar { + display: flex; + flex-direction: row; + width: 16.3125rem; + height: 0.75rem; + border-radius: 0.5rem; + background: linear-gradient(90deg, #00C14E 50%, rgba(224, 192, 23, 0.53) 75.46%, #D1071F 96.83%); +} + +.status-bar-tick { + width: 0.0625rem; + height: 0.75rem; + background: #F8F8FB; +} + +.status-bar-warn-tick { + margin-left: 11.5625rem; +} + +.status-bar-critical-tick { + margin-left: 2.4375rem; +} + +.status-bar-status-value { + color: #393A3D; + font-size: 1rem; + font-style: normal; + font-weight: 600; +} + +.status-bar-status-text { + color: #393A3D; + font-size: 0.625rem; + font-style: normal; + font-weight: 400; +} diff --git a/ui/src/components/common/StatusIndicator/StatusIndicator.tsx b/ui/src/components/common/StatusIndicator/StatusIndicator.tsx new file mode 100644 index 0000000000..9418d96a07 --- /dev/null +++ b/ui/src/components/common/StatusIndicator/StatusIndicator.tsx @@ -0,0 +1,29 @@ +import React from "react"; + +export enum IndicatorStatus { + HEALTHY = "HEALTHY", + WARNING = "WARNING", + CRITICAL = "CRITICAL", + RUNNING = "RUNNING", + STOPPED = "STOPPED", + PAUSED = "PAUSED", +} +export const IndicatorColorMap = { + HEALTHY: "#00C14E", + RUNNING: "#00C14E", + WARNING: "#FEE508", + PAUSED: "#FEE508", + CRITICAL: "#D1071F", + STOPPED: "#D1071F", +}; + +export interface StatusIndicatorProps { + status: IndicatorStatus; +} +export function StatusIndicator({ status }: StatusIndicatorProps) { + return ( + + + + ); +} diff --git a/ui/src/components/common/SummaryPageLayout/index.tsx b/ui/src/components/common/SummaryPageLayout/index.tsx new file mode 100644 index 0000000000..5ce430c0a1 --- /dev/null +++ b/ui/src/components/common/SummaryPageLayout/index.tsx @@ -0,0 +1,310 @@ +import React, { + useMemo, + useState, + useCallback, + useEffect, + useRef, +} from "react"; +import Box from "@mui/material/Box"; +import { + SummaryTitledValue, + SummaryTitledValueProps, +} from "./partials/SummaryTitledValue"; +import { + SummaryStatuses, + SummaryStatusesProps, +} from "./partials/SummaryStatuses"; +import chevronLeft from "../../../images/chevron-m-left.png"; +import chevronRight from "../../../images/chevron-m-right.png"; + +import "./style.css"; + +export enum SummarySectionType { + TITLED_VALUE, + STATUSES, + CUSTOM, + COLLECTION, +} + +export interface SummarySection { + type: SummarySectionType; + titledValueProps?: SummaryTitledValueProps; + statusesProps?: SummaryStatusesProps; + customComponent?: React.ReactNode; + collectionSections?: SummarySection[]; +} + +export interface SummaryPageLayoutProps { + collapsable?: boolean; + defaultCollapsed?: boolean; + offsetOnCollapse?: boolean; // Add top margin to content when collapsed to avoid content overlap + collapsedText?: string; + summarySections: SummarySection[]; + contentComponent: React.ReactNode; + contentPadding?: boolean; +} + +const SUMMARY_HEIGHT = "6.5625rem"; +const COLLAPSED_HEIGHT = "2.25rem"; + +const getSectionComponentAndKey = ( + section: SummarySection, + sectionIndex: number +) => { + let key: string; + const collectionComponents: React.ReactNode[] = []; + switch (section.type) { + case SummarySectionType.TITLED_VALUE: + if (!section.titledValueProps) { + key = "titled-value-missing"; + return { + key, + component:
Missing props
, + }; + } + key = `titled-value-${section.titledValueProps.title}`; + return { + key, + component: ( + + ), + }; + case SummarySectionType.STATUSES: + if (!section.statusesProps) { + key = "statuses-missing"; + return { + key, + component:
Missing props
, + }; + } + key = `statuses-${section.statusesProps.title}`; + return { + key, + component: , + }; + case SummarySectionType.CUSTOM: + if (!section.customComponent) { + key = "custom-missing"; + return { + key, + component:
Missing props
, + }; + } + return { + component: section.customComponent, + }; + case SummarySectionType.COLLECTION: + if (!section.collectionSections || !section.collectionSections.length) { + key = "collection-missing"; + return { + key, + component:
Missing props
, + }; + } + section.collectionSections.forEach((collectionSection, index) => { + if (!section.collectionSections?.length) { + // Added for undefined TS check + return; + } + const { key: collectionKey, component } = getSectionComponentAndKey( + collectionSection, + index + ); + collectionComponents.push(component); + // Add separator if not last section + if (index < section.collectionSections.length - 1) { + collectionComponents.push( +
+ ); + } + }); + key = `collection-${sectionIndex}}`; + return { + key, + component: ( + + {collectionComponents} + + ), + }; + default: + key = "unknown"; + return { + key, + component:
Missing props
, + }; + } +}; + +const getSummaryComponent = (summarySections: SummarySection[]) => { + // Build sections from props + const components: React.ReactNode[] = []; + summarySections.forEach((section, index) => { + const { key, component } = getSectionComponentAndKey(section, index); + components.push(component); + // Add separator if not last section + if (index !== summarySections.length - 1) { + components.push( +
+ ); + } + }); + return ( + + {components} + + ); +}; + +export function SummaryPageLayout({ + collapsable = false, + defaultCollapsed = false, + offsetOnCollapse = false, + collapsedText = "Details", + summarySections, + contentComponent, + contentPadding = true, +}: SummaryPageLayoutProps) { + const [collapsed, setCollapsed] = useState(collapsable && defaultCollapsed); + const sumaryRef = useRef(); + const [summaryHeight, setSummaryHeight] = useState(0); + + // Resize observer to update content margin when summary height changes + useEffect(() => { + if (!sumaryRef.current) { + return; + } + const resizeObserver = new ResizeObserver(() => { + setSummaryHeight(sumaryRef.current.offsetHeight); + }); + resizeObserver.observe(sumaryRef.current); + return function cleanup() { + resizeObserver.disconnect(); + }; + }, [sumaryRef.current]); + + const toggleCollapsed = useCallback(() => { + if (!collapsable) { + return; + } + setCollapsed((prev) => !prev); + }, [collapsable]); + + const summary = useMemo(() => { + if (collapsed) { + return ( + theme.zIndex.drawer - 1, + position: "fixed", + top: "5.75rem", + padding: "0 1.25rem", + alignItems: "center", + }} + > + + {collapsedText} + + expand button + + ); + } + return ( + theme.zIndex.drawer - 1, + position: "fixed", + top: "5.75rem", + padding: "0.5rem", + }} + > + + {getSummaryComponent(summarySections)} + + {collapsable && ( + collapse button + )} + + ); + }, [ + summarySections, + collapsed, + collapsable, + toggleCollapsed, + collapsedText, + sumaryRef, + ]); + + const contentMargin = useMemo(() => { + if (collapsed) { + return offsetOnCollapse ? `${summaryHeight}px` : undefined; + } + return `${summaryHeight}px`; + }, [summaryHeight, collapsed, offsetOnCollapse]); + + return ( + + {summary} + + {contentComponent} + + + ); +} diff --git a/ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/index.tsx b/ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/index.tsx new file mode 100644 index 0000000000..b2e598d5b4 --- /dev/null +++ b/ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/index.tsx @@ -0,0 +1,111 @@ +import React from "react"; +import Box from "@mui/material/Box"; +import { StatusBar } from "../../../StatusBar"; +import circleCheck from "../../../../../images/checkmark-circle.png"; +import circleDash from "../../../../../images/circle-dash.png"; + +import "./style.css"; + +export interface SummaryStatusesProps { + title: string; + active: number; + inActive: number; + healthy: number; + warning: number; + critical: number; + activeText?: string; + inAcitveText?: string; + linkComponent?: React.ReactNode; +} + +export function SummaryStatuses({ + title, + active, + inActive, + healthy, + warning, + critical, + activeText = "Active", + inAcitveText = "Non-Active", + linkComponent, +}: SummaryStatusesProps) { + return ( + + + {title} + + + + active + inactive + + + {active} + {inActive} + + + {activeText} + + {inAcitveText} + + + + + + + {linkComponent && ( + + {linkComponent} + + )} + + + + ); +} diff --git a/ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/style.css b/ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/style.css new file mode 100644 index 0000000000..310ddb6453 --- /dev/null +++ b/ui/src/components/common/SummaryPageLayout/partials/SummaryStatuses/style.css @@ -0,0 +1,32 @@ +.summary-statuses-title { + color: #393A3D; + font-size: 0.8125rem; + font-style: normal; + font-weight: 600; +} + +.summary-statuses-count { + color: #3C4348; + font-size: 1rem; + font-style: normal; + font-weight: 600; +} + +.summary-statuses-active-logo { + width: 1.5rem; +} + +.summary-statuses-active-text { + color: #3C4348; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + margin-top: 0.125rem; +} + +.summary-statuses-link { + color: #393A3D; + font-size: 0.8125rem; + font-style: normal; + font-weight: 600; +} diff --git a/ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/index.tsx b/ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/index.tsx new file mode 100644 index 0000000000..4ff75dae1c --- /dev/null +++ b/ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/index.tsx @@ -0,0 +1,26 @@ +import React from "react"; +import Box from "@mui/material/Box"; + +import "./style.css"; + +export interface SummaryTitledValueProps { + title: string; + value: string | number; +} + +export function SummaryTitledValue({ title, value }: SummaryTitledValueProps) { + return ( + + {title} + {value} + + ); +} diff --git a/ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/style.css b/ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/style.css new file mode 100644 index 0000000000..561aa6be3e --- /dev/null +++ b/ui/src/components/common/SummaryPageLayout/partials/SummaryTitledValue/style.css @@ -0,0 +1,13 @@ +.summary-titled-value-title { + color: #393A3D; + font-size: 0.8125rem; + font-style: normal; + font-weight: 600; +} + +.summary-titled-value-value { + color: #3C4348; + font-size: 2.25rem; + font-style: normal; + font-weight: 600; +} \ No newline at end of file diff --git a/ui/src/components/common/SummaryPageLayout/style.css b/ui/src/components/common/SummaryPageLayout/style.css new file mode 100644 index 0000000000..ca929b6c58 --- /dev/null +++ b/ui/src/components/common/SummaryPageLayout/style.css @@ -0,0 +1,24 @@ +.summary-page-layout-collapse-button { + width: 1.5rem; + height: 1.5rem; + cursor: pointer; +} + +.summary-page-layout-expand-button { + width: 1.5rem; + height: 1.5rem; + cursor: pointer; + margin-left: 0.625rem; +} + +.summary-page-layout-collapsed-text { + color: #393A3D; + font-size: 0.8125rem; + font-style: normal; + font-weight: 600; +} + +.summary-page-layout-separator { + width: 0.0625rem; + background: #DAE3E8; +} diff --git a/ui/src/components/pages/Cluster/index.tsx b/ui/src/components/pages/Cluster/index.tsx new file mode 100644 index 0000000000..2605dec691 --- /dev/null +++ b/ui/src/components/pages/Cluster/index.tsx @@ -0,0 +1,105 @@ +import React, { useMemo } from "react"; +import Box from "@mui/material/Box"; +import CircularProgress from "@mui/material/CircularProgress"; +import { + SummaryPageLayout, + SummarySection, + SummarySectionType, +} from "../../common/SummaryPageLayout"; +import { ClusterNamespaceListing } from "./partials/ClusterNamespaceListing"; +import { useClusterSummaryFetch } from "../../../utils/fetchWrappers/clusterSummaryFetch"; + +import "./style.css"; + +export function Cluster() { + const { data, loading, error } = useClusterSummaryFetch({ + loadOnRefresh: false, + }); + + const summarySections: SummarySection[] = useMemo(() => { + if (!data) { + return []; + } + return [ + { + type: SummarySectionType.TITLED_VALUE, + titledValueProps: { + title: "NAMESPACES", + value: data.namespacesCount, + }, + }, + // Pipelines collection + { + type: SummarySectionType.COLLECTION, + collectionSections: [ + { + type: SummarySectionType.TITLED_VALUE, + titledValueProps: { + title: "PIPELINES", + value: data.pipelinesCount, + }, + }, + { + type: SummarySectionType.STATUSES, + statusesProps: { + title: "PIPELINES STATUS", + active: data.pipelinesActiveCount, + inActive: data.pipelinesInactiveCount, + healthy: data.pipelinesHealthyCount, + warning: data.pipelinesWarningCount, + critical: data.pipelinesCriticalCount, + }, + }, + ], + }, + // ISBs collection + { + type: SummarySectionType.COLLECTION, + collectionSections: [ + { + type: SummarySectionType.TITLED_VALUE, + titledValueProps: { + title: "ISB SERVICES", + value: data.isbsCount, + }, + }, + { + type: SummarySectionType.STATUSES, + statusesProps: { + title: "ISB SERVICES STATUS", + active: data.isbsActiveCount, + inActive: data.isbsInactiveCount, + healthy: data.isbsHealthyCount, + warning: data.isbsWarningCount, + critical: data.isbsCriticalCount, + activeText: "Live", + inAcitveText: "Not-Live", + }, + }, + ], + }, + ]; + }, [data]); + + if (loading) { + return ( + + + + ); + } + if (error) { + return
{`Error loading cluster summary: ${error}`}
; + } + if (!data) { + return
{`No resources found.`}
; + } + return ( + + } + /> + + ); +} diff --git a/ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/index.tsx b/ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/index.tsx new file mode 100644 index 0000000000..16817f58be --- /dev/null +++ b/ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/index.tsx @@ -0,0 +1,143 @@ +import React, { useState, useEffect, useCallback, useMemo } from "react"; +import Box from "@mui/material/Box"; +import Pagination from "@mui/material/Pagination"; +import Grid from "@mui/material/Grid"; +import { DebouncedSearchInput } from "../../../../common/DebouncedSearchInput"; +import { NamespaceCard } from "../NamespaceCard"; +import { + ClusterNamespaceListingProps, + ClusterNamespaceSummary, +} from "../../../../../types/declarations/cluster"; + +import "./style.css"; + +const MAX_PAGE_SIZE = 6; + +export function ClusterNamespaceListing({ + data, +}: ClusterNamespaceListingProps) { + const [search, setSearch] = useState(""); + const [page, setPage] = useState(1); + const [totalPages, setTotalPages] = useState( + Math.ceil(data.namespacesCount / MAX_PAGE_SIZE) + ); + const [filteredNamespaces, setFilteredNamespaces] = useState< + ClusterNamespaceSummary[] + >([]); + + // Update filtered namespaces based on search and page selected + useEffect(() => { + let filtered: ClusterNamespaceSummary[] = data.nameSpaceSummaries; + if (search) { + // Filter by search + filtered = data.nameSpaceSummaries.filter((ns) => + ns.name.includes(search) + ); + } + // Sort by name + filtered.sort((a, b) => (a.name > b.name ? 1 : -1)); + + // Break list into pages + const pages = filtered.reduce((resultArray: any[], item, index) => { + const chunkIndex = Math.floor(index / MAX_PAGE_SIZE); + if (!resultArray[chunkIndex]) { + resultArray[chunkIndex] = []; + } + resultArray[chunkIndex].push(item); + return resultArray; + }, []); + + if (page > pages.length) { + // Reset to page 1 if current page is greater than total pages after filterting + setPage(1); + } + // Set filtered namespaces with current page of namespaces + setFilteredNamespaces(pages[page - 1] || []); + setTotalPages(pages.length); + }, [data, search, page]); + + const handlePageChange = useCallback( + (event: React.ChangeEvent, value: number) => { + setPage(value); + }, + [] + ); + + const listing = useMemo(() => { + if (!filteredNamespaces.length) { + return ( + + + No namespaces found + + + ); + } + return ( + + {filteredNamespaces.map((ns: ClusterNamespaceSummary) => { + return ( + + + + ); + })} + + ); + }, [filteredNamespaces]); + + return ( + + + + + + Namespaces + + {listing} + + + + + ); +} diff --git a/ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/style.css b/ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/style.css new file mode 100644 index 0000000000..693d538b96 --- /dev/null +++ b/ui/src/components/pages/Cluster/partials/ClusterNamespaceListing/style.css @@ -0,0 +1,5 @@ +.cluster-ns-listing-table-title { + font-size: 1.25rem; + font-style: normal; + font-weight: 400; +} diff --git a/ui/src/components/pages/Cluster/partials/NamespaceCard/index.tsx b/ui/src/components/pages/Cluster/partials/NamespaceCard/index.tsx new file mode 100644 index 0000000000..8abf383447 --- /dev/null +++ b/ui/src/components/pages/Cluster/partials/NamespaceCard/index.tsx @@ -0,0 +1,177 @@ +import React from "react"; +import Box from "@mui/material/Box"; +import Paper from "@mui/material/Paper"; +import Grid from "@mui/material/Grid"; +import { Link } from "react-router-dom"; +import { StatusBar } from "../../../../common/StatusBar"; +import { NamespaceCardProps } from "../../../../../types/declarations/cluster"; + +import "./style.css"; + +export function NamespaceCard({ data }: NamespaceCardProps) { + return ( + + + {data.name} + + Pipelines: + + {data.pipelinesCount} + + + + + + Status: + + + + + + {data?.pipelinesActiveCount} + + + Active + + + + + + + {data?.pipelinesInactiveCount} + + + Non-Active + + + + + + + + Health: + + + + + + + + ISB Services: + + {data.isbsCount} + + + + + + Status: + + + + + + {data?.isbsActiveCount} + + + Live + + + + + + + {data?.isbsInactiveCount} + + + Not-Live + + + + + + + + Health: + + + + + + + + + ); +} diff --git a/ui/src/components/pages/Cluster/partials/NamespaceCard/style.css b/ui/src/components/pages/Cluster/partials/NamespaceCard/style.css new file mode 100644 index 0000000000..3228dcd58d --- /dev/null +++ b/ui/src/components/pages/Cluster/partials/NamespaceCard/style.css @@ -0,0 +1,46 @@ +.namespace-card-name { + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + color: #000; +} + +.namespace-card-section-title { + color: #3C4348; + font-size: 0.875rem; + font-style: normal; + font-weight: 600; +} + +.namespace-card-section-title-value { + color: #3C4348; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + margin-left: 0.3125rem; +} + +.namespace-card-section-text-14-normal { + color: #3C4348; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; +} + +.namespace-card-section-text-16-bold { + color: #3C4348; + font-size: 1rem; + font-style: normal; + font-weight: 600; +} + +.namespace-card-section-text-16-normal { + color: #3C4348; + font-size: 1rem; + font-style: normal; + font-weight: 400; +} + +.namespace-card-group-spacing { + margin-left: 5px; +} \ No newline at end of file diff --git a/ui/src/components/pages/Cluster/style.css b/ui/src/components/pages/Cluster/style.css new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/ui/src/components/pages/Cluster/style.css @@ -0,0 +1 @@ + diff --git a/ui/src/components/pages/Namespace/index.test.tsx b/ui/src/components/pages/Namespace/index.test.tsx deleted file mode 100644 index ece36d8118..0000000000 --- a/ui/src/components/pages/Namespace/index.test.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { Namespaces } from "./index"; -import { - fireEvent, - render, - screen, - waitFor, - within, -} from "@testing-library/react"; -import { useNamespaceFetch } from "../../../utils/fetchWrappers/namespaceFetch"; -import { useSystemInfoFetch } from "../../../utils/fetchWrappers/systemInfoFetch"; -import { useNamespaceListFetch } from "../../../utils/fetchWrappers/namespaceListFetch"; -import { GetStore } from "../../../localStore/GetStore"; -import { BrowserRouter } from "react-router-dom"; -import { wait } from "@testing-library/user-event/dist/utils"; - -jest.mock("../../../utils/fetchWrappers/namespaceFetch"); -const mockedUseNamespaceFetch = useNamespaceFetch as jest.MockedFunction< - typeof useNamespaceFetch ->; - -jest.mock("../../../utils/fetchWrappers/systemInfoFetch"); -const mockedUseSystemInfoFetch = useSystemInfoFetch as jest.MockedFunction< - typeof useSystemInfoFetch ->; - -jest.mock("../../../utils/fetchWrappers/namespaceListFetch"); -const mockedUseNamespaceListFetch = - useNamespaceListFetch as jest.MockedFunction; - -jest.mock("../../../localStore/GetStore"); -const mockedGetStore = GetStore as jest.MockedFunction; - -describe("Namespaces screen", () => { - it("Load namespace row content screen", async () => { - mockedUseNamespaceFetch.mockReturnValue({ - pipelines: ["simple-pipeline"], - error: false, - loading: false, - }); - mockedUseSystemInfoFetch.mockReturnValue({ - systemInfo: { namespaced: true, managedNamespace: "abc" }, - error: false, - loading: false, - }); - mockedUseNamespaceListFetch.mockReturnValue({ - namespaceList: ["abc"], - error: false, - loading: false, - }); - render( - - - - ); - fireEvent.keyDown(screen.getByTestId("namespace-input"), { key: "Enter" }); - await waitFor(() => - expect(screen.getByTestId("namespace-row-content")).toBeVisible() - ); - }); - - it("Triggers SystemInfo error", async () => { - mockedUseSystemInfoFetch.mockReturnValue({ - systemInfo: null, - error: "error occurred", - loading: false, - }); - mockedUseNamespaceListFetch.mockReturnValue({ - namespaceList: ["abc"], - error: false, - loading: false, - }); - render( - - - - ); - }); - - it("Triggers UseNamespaceList error", async () => { - mockedUseNamespaceFetch.mockReturnValue({ - pipelines: ["simple-pipeline"], - error: false, - loading: false, - }); - mockedUseSystemInfoFetch.mockReturnValue({ - systemInfo: { namespaced: false, managedNamespace: "abc" }, - error: false, - loading: false, - }); - mockedUseNamespaceListFetch.mockReturnValue({ - namespaceList: undefined, - error: "error occurred", - loading: false, - }); - mockedGetStore.mockReturnValue(null); - render( - - - - ); - }); - - it("Triggers Autocomplete onchange", async () => { - mockedUseNamespaceFetch.mockReturnValue({ - pipelines: ["simple-pipeline"], - error: false, - loading: false, - }); - mockedUseSystemInfoFetch.mockReturnValue({ - systemInfo: { namespaced: false, managedNamespace: "abc" }, - error: false, - loading: false, - }); - mockedUseNamespaceListFetch.mockReturnValue({ - namespaceList: undefined, - error: "error occurred", - loading: false, - }); - mockedGetStore.mockReturnValue('["abc1"]'); - render( - - - - ); - const autocomplete = screen.getByTestId("namespace-input"); - const input = within(autocomplete).getByRole("combobox"); - autocomplete.focus(); - fireEvent.change(input, { target: { value: "abc1" } }); - await wait(); - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }); - await wait(); - fireEvent.keyDown(autocomplete, { key: "Enter" }); - await wait(); - expect(input).toHaveValue("abc1"); - - autocomplete.focus(); - fireEvent.keyPress(input, { key: "Enter", code: 13, charCode: 13 }); - await wait(); - expect(input).toHaveValue("abc1"); - }); -}); diff --git a/ui/src/components/pages/Namespace/index.tsx b/ui/src/components/pages/Namespace/index.tsx index 035e4bb3d8..f287620406 100644 --- a/ui/src/components/pages/Namespace/index.tsx +++ b/ui/src/components/pages/Namespace/index.tsx @@ -1,231 +1,131 @@ -import { useEffect, useState } from "react"; -import { NamespaceRowContent } from "./partials/NamespaceRowContent"; -import { - TableBody, - Table, - TableCell, - TableContainer, - TableHead, - TableRow, - Paper, - TextField, - Autocomplete, - InputAdornment, - Popper, -} from "@mui/material"; +import React, { useMemo, useContext, useCallback } from "react"; +import { useParams } from "react-router-dom"; import Box from "@mui/material/Box"; -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; -import SearchIcon from "@mui/icons-material/Search"; -import { notifyError } from "../../../utils/error"; -import { useSystemInfoFetch } from "../../../utils/fetchWrappers/systemInfoFetch"; -import { useNamespaceListFetch } from "../../../utils/fetchWrappers/namespaceListFetch"; -import { SetNamespaceList, SetStore } from "../../../localStore/SetStore"; -import { GetStore } from "../../../localStore/GetStore"; +import CircularProgress from "@mui/material/CircularProgress"; +import { useNamespaceSummaryFetch } from "../../../utils/fetchWrappers/namespaceSummaryFetch"; +import { + SummaryPageLayout, + SummarySection, + SummarySectionType, +} from "../../common/SummaryPageLayout"; +import { AppContext } from "../../../App"; +import { AppContextProps } from "../../../types/declarations/app"; +import { SidebarType } from "../../common/SlidingSidebar"; +import { NamespacePipelineListing } from "./partials/NamespacePipelineListing"; import "./style.css"; -const NS_Curr_Store = "curr_namespace"; -const NS_List_Store = "namespace_list"; - export function Namespaces() { - const [nsCookie, setNsCookie] = useState([]); - const [nsCluster, setNsCluster] = useState([]); - const [nsCombined, setNsCombined] = useState([]); - const [namespace, setNamespace] = useState(""); - const [value, setValue] = useState(""); - const [disableSearch, setDisableSearch] = useState(false); - const { systemInfo, error: systemInfoError } = useSystemInfoFetch(); - const { namespaceList: clusterNamespaces, error: namespaceListError } = - useNamespaceListFetch(); - - // check system info error - useEffect(() => { - if (systemInfoError) { - notifyError([ - { - error: "Failed to fetch the system info", - options: { toastId: "ns-scope", autoClose: false }, - }, - ]); - } - }, [systemInfoError]); - - // check cluster namespace fetching error - useEffect(() => { - if (namespaceListError && systemInfo && systemInfo?.namespaced === false) { - notifyError([ - { - error: "Failed to fetch the available namespaces", - options: { toastId: "ns-cluster", autoClose: false }, - }, - ]); - } - }, [namespaceListError, systemInfo]); - - // provides namespace search based on scoped installation - useEffect(() => { - if (systemInfo && systemInfo?.namespaced) { - setNamespace(systemInfo?.managedNamespace); - setDisableSearch(true); - } else if (systemInfo && !systemInfo?.namespaced) { - setDisableSearch(false); - - // set namespace value for search box - const curr_ns = GetStore(NS_Curr_Store); - if (curr_ns) { - setValue(curr_ns); - setNamespace(curr_ns); - } - - // sets namespace list available from cookies - const ns_list = JSON.parse(GetStore(NS_List_Store)); - if (ns_list) setNsCookie(ns_list); - } - }, [systemInfo]); - - // sets namespace list available at cluster scope - useEffect(() => { - if (clusterNamespaces) { - setNsCluster(clusterNamespaces); - } - }, [clusterNamespaces]); - - // populating namespace list passed for dropdown - useEffect(() => { - const arr = []; - nsCookie.forEach((namespace) => { - arr.push({ - label: namespace, - type: "Previously Searched", - }); - }); - nsCluster.forEach((namespace) => { - arr.push({ - label: namespace, - type: "Available Namespaces", - }); + const { namespaceId } = useParams(); + const { setSidebarProps } = useContext(AppContext); + const { data, pipelineRawData, isbRawData, loading, error } = + useNamespaceSummaryFetch({ + namespace: namespaceId || "", + loadOnRefresh: false, }); - setNsCombined(arr); - }, [nsCookie, nsCluster]); - const handle = (namespaceVal: string) => { - SetStore(NS_Curr_Store, namespaceVal); - setNamespace(namespaceVal); - if (namespaceVal) { - const arr = SetNamespaceList(nsCookie, NS_List_Store, namespaceVal); - setNsCookie(arr); + const handleK8sEventsClick = useCallback(() => { + if (!namespaceId || !setSidebarProps) { + return; } - }; + setSidebarProps({ + type: SidebarType.NAMESPACE_K8s, + k8sEventsProps: { namespaceId }, + }); + }, [namespaceId, setSidebarProps]); - const handleKeyPress = (e: any) => { - if (e.key === "Enter") { - handle(e.target.value); - e.target.blur(); + const summarySections: SummarySection[] = useMemo(() => { + if (!data) { + return []; } - }; - - const CustomDropDownPopper = function (props) { - return ; - }; + return [ + // Pipelines collection + { + type: SummarySectionType.COLLECTION, + collectionSections: [ + { + type: SummarySectionType.TITLED_VALUE, + titledValueProps: { + title: "PIPELINES", + value: data.pipelinesCount, + }, + }, + { + type: SummarySectionType.STATUSES, + statusesProps: { + title: "PIPELINES STATUS", + active: data.pipelinesActiveCount, + inActive: data.pipelinesInactiveCount, + healthy: data.pipelinesHealthyCount, + warning: data.pipelinesWarningCount, + critical: data.pipelinesCriticalCount, + linkComponent: ( +
+ K8s Events +
+ ), + }, + }, + ], + }, + // ISBs collection + { + type: SummarySectionType.COLLECTION, + collectionSections: [ + { + type: SummarySectionType.TITLED_VALUE, + titledValueProps: { + title: "ISB SERVICES", + value: data.isbsCount, + }, + }, + { + type: SummarySectionType.STATUSES, + statusesProps: { + title: "ISB SERVICES STATUS", + active: data.isbsActiveCount, + inActive: data.isbsInactiveCount, + healthy: data.isbsHealthyCount, + warning: data.isbsWarningCount, + critical: data.isbsCriticalCount, + activeText: "Live", + inAcitveText: "Not-Live", + }, + }, + ], + }, + ]; + }, [data, handleK8sEventsClick]); + if (loading) { + return ( + + + + ); + } + if (error) { + return
{`Error loading namespace summary: ${error}`}
; + } + if (!data) { + return
{`No resources found.`}
; + } return ( -
- - - - - -
- option.type} - sx={{ width: "20rem", mx: "1rem" }} - PopperComponent={CustomDropDownPopper} - value={value} - onChange={(e, v) => { - // different event for click and keypress - v ? handle(v.label) : handle(""); - }} - componentsProps={{ - popper: { - sx: { - minWidth: "20rem !important", - width: "fit-content !important", - }, - }, - }} - ListboxProps={{ - style: { - maxHeight: "30rem", - }, - }} - renderInput={(params) => { - params.inputProps.onKeyPress = handleKeyPress; - return ( - - - - ), - }} - onChange={(e) => { - setValue(e.target.value); - }} - /> - ); - }} - disabled={disableSearch} - /> -
-
-
-
- - - -
- {namespace === "" && ( -
- - - -
- Search for a namespace to get the pipelines -
-
-
-
-
- )} - {namespace !== "" && ( - - )} -
-
-
-
-
-
-
+ + + } + /> + ); } diff --git a/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/PipelinesTypes.ts b/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/PipelinesTypes.ts new file mode 100644 index 0000000000..e793005b9d --- /dev/null +++ b/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/PipelinesTypes.ts @@ -0,0 +1,186 @@ +export interface PipelinesData { + data: PipelineData[]; +} + +export interface PipelineData { + name: string; + status: string; + pipeline: Pipeline; +} + +interface Pipeline { + kind: string; + apiVersion: string; + metadata: Metadata; + spec: Spec; + status: Status; +} + +interface Status { + conditions: Condition[]; + phase: string; + lastUpdated: string; + vertexCount: number; + sourceCount: number; + sinkCount: number; + udfCount: number; +} + +interface Condition { + type: string; + status: string; + lastTransitionTime: string; + reason: string; + message: string; +} + +interface Spec { + vertices: Vertex[]; + edges: Edge[]; + lifecycle: Lifecycle; + limits: Limits; + watermark: Watermark; +} + +interface Watermark { + maxDelay: string; +} + +interface Limits { + readBatchSize: number; + bufferMaxLength: number; + bufferUsageLimit: number; + readTimeout: string; +} + +interface Lifecycle { + deleteGracePeriodSeconds: number; + desiredPhase: string; +} + +interface Edge { + from: string; + to: string; + conditions?: any; +} + +interface Vertex { + name: string; + source?: Source; + scale: _; + udf?: Udf; + sink?: Sink; +} + +interface Sink { + log: _; +} + +interface Udf { + container?: any; + builtin: Builtin; + groupBy?: any; +} + +interface Builtin { + name: string; +} + +interface Source { + generator: Generator; +} + +interface Generator { + rpu: number; + duration: string; + msgSize: number; +} + +interface Metadata { + name: string; + namespace: string; + uid: string; + resourceVersion: string; + generation: number; + creationTimestamp: string; + annotations: Annotations; + finalizers: string[]; + managedFields: ManagedField[]; +} + +interface ManagedField { + manager: string; + operation: string; + apiVersion: string; + time: string; + fieldsType: string; + fieldsV1: FieldsV1; + subresource?: string; +} + +interface FieldsV1 { + "f:metadata"?: Fmetadata; + "f:spec"?: Fspec; + "f:status"?: Fstatus; +} + +interface Fstatus { + ".": _; + "f:conditions": _; + "f:lastUpdated": _; + "f:phase": _; + "f:sinkCount": _; + "f:sourceCount": _; + "f:udfCount": _; + "f:vertexCount": _; +} + +interface Fspec { + "."?: _; + "f:edges"?: _; + "f:lifecycle"?: Flifecycle; + "f:limits"?: Flimits; + "f:watermark"?: Fwatermark; + "f:vertices"?: _; +} + +interface Fwatermark { + ".": _; + "f:disabled": _; + "f:maxDelay": _; +} + +interface Flimits { + ".": _; + "f:bufferMaxLength": _; + "f:bufferUsageLimit": _; + "f:readBatchSize": _; + "f:readTimeout": _; +} + +interface Flifecycle { + ".": _; + "f:deleteGracePeriodSeconds": _; + "f:desiredPhase": _; +} + +interface Fmetadata { + "f:annotations"?: Fannotations; + "f:finalizers"?: Ffinalizers; +} + +interface Ffinalizers { + ".": _; + 'v:"pipeline-controller"': _; +} + +interface Fannotations { + ".": _; + "f:kubectl.kubernetes.io/last-applied-configuration": _; +} + +interface _ {} + +interface Annotations { + "kubectl.kubernetes.io/last-applied-configuration": string; +} diff --git a/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/index.tsx b/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/index.tsx new file mode 100644 index 0000000000..685736c2b5 --- /dev/null +++ b/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/index.tsx @@ -0,0 +1,421 @@ +import React, { useState, useEffect, useCallback, useMemo } from "react"; +import Box from "@mui/material/Box"; +import Pagination from "@mui/material/Pagination"; +import Grid from "@mui/material/Grid"; +import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward"; +import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward"; +import { DebouncedSearchInput } from "../../../../common/DebouncedSearchInput"; +import { PipelineCard } from "../PipelineCard"; +import { createSvgIcon } from "@mui/material/utils"; +import { NamespacePipelineListingProps } from "../../../../../types/declarations/namespace"; +import { PipelineData } from "./PipelinesTypes"; +import "./style.css"; +import { Button, MenuItem, Select } from "@mui/material"; + +import "./style.css"; + +const MAX_PAGE_SIZE = 4; +export const HEALTH = ["All", "Healthy", "Warning", "Critical"]; +export const STATUS = ["All", "Running", "Stopped", "Paused"]; +export const ASC = "asc"; +export const DESC = "desc"; +export const ALPHABETICAL_SORT = "alphabetical"; +export const LAST_UPDATED_SORT = "lastUpdated"; +export const LAST_CREATED_SORT = "lastCreated"; + +export const sortOptions = [ + { + label: "Last Updated", + value: LAST_UPDATED_SORT, + sortOrder: DESC, + }, + { + label: "Last Created", + value: LAST_CREATED_SORT, + sortOrder: DESC, + }, + { + label: "A-Z", + value: ALPHABETICAL_SORT, + sortOrder: ASC, + }, +]; + +const PlusIcon = createSvgIcon( + // credit: plus icon from https://heroicons.com/ + + + , + "Plus" +); + +export function NamespacePipelineListing({ + namespace, + data, + pipelineData, + isbData, +}: NamespacePipelineListingProps) { + const [search, setSearch] = useState(""); + const [health, setHealth] = useState(HEALTH[0]); + const [status, setStatus] = useState(STATUS[0]); + const [page, setPage] = useState(1); + const [orderBy, setOrderBy] = useState({ + value: ALPHABETICAL_SORT, + sortOrder: ASC, + }); + const [totalPages, setTotalPages] = useState( + Math.ceil(data.pipelinesCount / MAX_PAGE_SIZE) + ); + const [filteredPipelines, setFilteredPipelines] = useState( + [] + ); + // Update filtered pipelines based on search and page selected + useEffect(() => { + let filtered: PipelineData[] = Object.values( + pipelineData ? pipelineData : {} + ); + if (search) { + // Filter by search + filtered = filtered.filter((p: PipelineData) => p.name.includes(search)); + } + // Sorting + if (orderBy.value === ALPHABETICAL_SORT) { + filtered.sort((a: PipelineData, b: PipelineData) => { + if (orderBy.sortOrder === ASC) { + return a.name > b.name ? 1 : -1; + } else { + return a.name < b.name ? -1 : 1; + } + }); + } else if (orderBy.value === LAST_UPDATED_SORT) { + filtered.sort((a: PipelineData, b: PipelineData) => { + if (orderBy.sortOrder === ASC) { + return a.pipeline.status.lastUpdated > b.pipeline.status.lastUpdated + ? 1 + : -1; + } else { + return a.pipeline.status.lastUpdated < b.pipeline.status.lastUpdated + ? -1 + : 1; + } + }); + } else { + filtered.sort((a: PipelineData, b: PipelineData) => { + if (orderBy.sortOrder === ASC) { + return Date.parse(a.pipeline.metadata.creationTimestamp) > + Date.parse(b.pipeline.metadata.creationTimestamp) + ? 1 + : -1; + } else { + return Date.parse(a.pipeline.metadata.creationTimestamp) < + Date.parse(b.pipeline.metadata.creationTimestamp) + ? -1 + : 1; + } + }); + } + + //Filter by health + if (health !== "All") { + filtered = filtered.filter((p) => { + if (p.status.toLowerCase() === health.toLowerCase()) { + return true; + } else { + return false; + } + }); + } + + //Filter by status + if (status !== "All") { + filtered = filtered.filter((p) => { + if (p.pipeline.status.phase.toLowerCase() === status.toLowerCase()) { + return true; + } else { + return false; + } + }); + } + // Break list into pages + const pages = filtered.reduce((resultArray: any[], item, index) => { + const chunkIndex = Math.floor(index / MAX_PAGE_SIZE); + if (!resultArray[chunkIndex]) { + resultArray[chunkIndex] = []; + } + resultArray[chunkIndex].push(item); + return resultArray; + }, []); + + if (page > pages.length) { + // Reset to page 1 if current page is greater than total pages after filterting + setPage(1); + } + // Set filtered namespaces with current page of pipelines + setFilteredPipelines(pages[page - 1] || []); + setTotalPages(pages.length); + }, [data, search, page, pipelineData, isbData, orderBy, health, status]); + + const handlePageChange = useCallback( + (event: React.ChangeEvent, value: number) => { + setPage(value); + }, + [] + ); + const handleSortChange = useCallback( + ( + event: React.MouseEvent, + value: string + ) => { + setOrderBy({ + value: value, + sortOrder: orderBy.sortOrder === ASC ? DESC : ASC, + }); + }, + [orderBy] + ); + const listing = useMemo(() => { + if (!filteredPipelines.length) { + return ( + + + No pipelines found + + + ); + } + return ( + + {filteredPipelines.map((p: PipelineData) => { + const isbName = pipelineData + ? pipelineData[p.name]?.pipeline?.spec + ?.interStepBufferServiceName || "default" + : "default"; + return ( + + + + ); + })} + + ); + }, [filteredPipelines, namespace]); + + const handleHealthFilterChange = useCallback( + (e) => { + setHealth(e.target.value); + }, + [health] + ); + + const handleStatusFilterChange = useCallback( + (e) => { + setStatus(e.target.value); + }, + [status] + ); + + return ( + + + + + + + + + + + + + + + + + Pipelines + + + {sortOptions.map((option) => { + return ( + + ); + })} + + + + + + + {listing} + + + + + ); +} diff --git a/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/style.css b/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/style.css new file mode 100644 index 0000000000..613073538a --- /dev/null +++ b/ui/src/components/pages/Namespace/partials/NamespacePipelineListing/style.css @@ -0,0 +1,5 @@ +.ns-pipeline-listing-table-title { + font-size: 1.25rem; + font-style: normal; + font-weight: 400; +} diff --git a/ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.test.tsx b/ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.test.tsx deleted file mode 100644 index 369b739e45..0000000000 --- a/ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.test.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { NamespaceRowContent } from "./index"; -import { render, screen, waitFor } from "@testing-library/react"; -import { useNamespaceFetch } from "../../../../../utils/fetchWrappers/namespaceFetch"; -import { BrowserRouter } from "react-router-dom"; - -jest.mock("../../../../../utils/fetchWrappers/namespaceFetch"); -const mockedUseNamespaceFetch = useNamespaceFetch as jest.MockedFunction< - typeof useNamespaceFetch ->; - -describe("NamespaceRowContent screen", () => { - it("Load pipeline list screen", async () => { - mockedUseNamespaceFetch.mockReturnValueOnce({ - pipelines: ["simple-pipeline"], - error: false, - loading: false, - }); - render( - - - - ); - expect(screen.getByTestId("namespace-row-content")).toBeVisible(); - await waitFor(() => - expect(screen.getByText("simple-pipeline")).toBeInTheDocument() - ); - }); - - it("Load no pipeline screen", async () => { - mockedUseNamespaceFetch.mockReturnValueOnce({ - pipelines: [], - error: true, - loading: false, - }); - render( - - - - ); - await waitFor(() => - expect( - screen.getByText("No pipelines in the provided namespaces") - ).toBeInTheDocument() - ); - }); -}); diff --git a/ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.tsx b/ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.tsx deleted file mode 100644 index 3356d7a650..0000000000 --- a/ui/src/components/pages/Namespace/partials/NamespaceRowContent/index.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { useEffect } from "react"; -import { Link } from "react-router-dom"; -import Box from "@mui/material/Box"; -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; -import { useNamespaceFetch } from "../../../../../utils/fetchWrappers/namespaceFetch"; -import { notifyError } from "../../../../../utils/error"; -import { NamespaceRowContentProps } from "../../../../../types/declarations/namespace"; - -export function NamespaceRowContent(props: NamespaceRowContentProps) { - const { namespaceId } = props; - const { pipelines, error: pipelineError } = useNamespaceFetch(namespaceId); - - useEffect(() => { - if (pipelineError) { - notifyError([ - { - error: "Failed to fetch the pipelines for the provided namespace", - options: { toastId: "ns-server", autoClose: false }, - }, - ]); - } - }, [pipelineError]); - - return ( -
- - - Pipelines - - - {pipelines && - pipelines.map((pipelineId, idx) => { - return ( -
- - - {pipelineId} - - -
- ); - })} - {!pipelines.length && ( - -
No pipelines in the provided namespaces
-
- )} -
-
-
- ); -} diff --git a/ui/src/components/pages/Namespace/partials/PipelineCard/index.tsx b/ui/src/components/pages/Namespace/partials/PipelineCard/index.tsx new file mode 100644 index 0000000000..bae8b4954c --- /dev/null +++ b/ui/src/components/pages/Namespace/partials/PipelineCard/index.tsx @@ -0,0 +1,321 @@ +import React, { useCallback, useContext } from "react"; +import Paper from "@mui/material/Paper"; +import { Link } from "react-router-dom"; +import { PipelineCardProps } from "../../../../../types/declarations/namespace"; +import { + Box, + Button, + Grid, + MenuItem, + Select, + SelectChangeEvent, +} from "@mui/material"; +import {IconsStatusMap, ISBStatusString, StatusString} from "../../../../../utils"; +import { AppContextProps } from "../../../../../types/declarations/app"; +import { AppContext } from "../../../../../App"; +import { SidebarType } from "../../../../common/SlidingSidebar"; +import pipelineIcon from "../../../../../images/pipeline.png"; + +import "./style.css"; + +export function PipelineCard({ + namespace, + data, + statusData, + isbData, +}: PipelineCardProps) { + const { setSidebarProps } = useContext(AppContext); + const [editOption] = React.useState("view"); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [deleteOption, setDeleteOption] = React.useState("Delete"); + const handleEditChange = useCallback( + (event: SelectChangeEvent) => { + if (event.target.value === "pipeline" && setSidebarProps) { + setSidebarProps({ + type: SidebarType.PIPELINE_SPEC, + pipelineSpecProps: { spec: statusData?.pipeline?.spec }, + }); + } else if (event.target.value === "isb" && setSidebarProps) { + setSidebarProps({ + type: SidebarType.PIPELINE_SPEC, + pipelineSpecProps: { + spec: isbData?.isbService?.spec, + titleOverride: "ISB Spec", + }, + }); + } + }, + [setSidebarProps, statusData, isbData] + ); + + const handleDeleteChange = useCallback((event: SelectChangeEvent) => { + setDeleteOption(event.target.value); + }, []); + return ( + <> + + + + pipeline icon + + {data?.name} + + + + + + + + + + + Status: + Health: + + + {statusData?.pipeline?.status?.phase} + {statusData?.status} + + + {StatusString[statusData?.pipeline?.status?.phase]} + {StatusString[statusData?.status]} + + + + + + ISB Services: + ISB Type: + ISB Size: + + + {isbData?.name} + {isbData?.isbService?.status?.type} + + { + isbData?.isbService?.spec[isbData?.isbService?.status?.type] + .replicas + } + + + + + + + Status: + Health: + + + {isbData?.isbService?.status?.phase} + {isbData?.status} + + + {ISBStatusString[isbData?.isbService?.status?.phase]} + {ISBStatusString[isbData?.status]} + + + + + + + + + + + + + + ); +} diff --git a/ui/src/components/pages/Namespace/partials/PipelineCard/style.css b/ui/src/components/pages/Namespace/partials/PipelineCard/style.css new file mode 100644 index 0000000000..61d4240a4b --- /dev/null +++ b/ui/src/components/pages/Namespace/partials/PipelineCard/style.css @@ -0,0 +1,10 @@ +.pipeline-card-name { + font-size: 1.25rem; + font-style: normal; + font-weight: 400; + color: #000; +} + +.pipeline-card-icon { + width: 1.5rem; +} \ No newline at end of file diff --git a/ui/src/components/pages/Namespace/style.css b/ui/src/components/pages/Namespace/style.css index f0b8f239bd..15319c5e6a 100644 --- a/ui/src/components/pages/Namespace/style.css +++ b/ui/src/components/pages/Namespace/style.css @@ -1,17 +1,8 @@ -.Namespaces { -} - -.Namespace-table-head { - display: flex; - flex-direction: row; - align-items: center; -} - -.Namespace-btn { - cursor: pointer; - color: #0077C5; -} - -.Namespace-table-body { - margin: 0 1rem; +.namespace-k8s-events { + color: #393A3D; + font-size: 0.8125rem; + font-style: normal; + font-weight: 600; + text-decoration: underline; + cursor: pointer; } \ No newline at end of file diff --git a/ui/src/components/pages/Pipeline/index.tsx b/ui/src/components/pages/Pipeline/index.tsx index 0b64849eeb..2b5738b554 100644 --- a/ui/src/components/pages/Pipeline/index.tsx +++ b/ui/src/components/pages/Pipeline/index.tsx @@ -1,15 +1,69 @@ -import { useEffect } from "react"; +import React, { useCallback, useContext, useEffect, useMemo } from "react"; import { useParams } from "react-router-dom"; - import CircularProgress from "@mui/material/CircularProgress"; import { usePipelineViewFetch } from "../../../utils/fetcherHooks/pipelineViewFetch"; import Graph from "./partials/Graph"; import { notifyError } from "../../../utils/error"; +import { + SummaryPageLayout, + SummarySection, + SummarySectionType, +} from "../../common/SummaryPageLayout"; +import { usePipelineSummaryFetch } from "../../../utils/fetchWrappers/pipelineFetch"; +import { PipelineStatus } from "./partials/PipelineStatus"; +import { PipelineSummaryStatus } from "./partials/PipelineSummaryStatus"; +import { PipelineISBStatus } from "./partials/PipelineISBStatus"; +import { SidebarType } from "../../common/SlidingSidebar"; +import { AppContextProps } from "../../../types/declarations/app"; +import { AppContext } from "../../../App"; +import noError from "../../../images/no-error.svg"; import "./style.css"; export function Pipeline() { + // TODO needs to be able to be given namespaceId from parent for NS only install const { namespaceId, pipelineId } = useParams(); + // TODO loading and error handling + const { data } = usePipelineSummaryFetch({ namespaceId, pipelineId }); + + const summarySections: SummarySection[] = useMemo(() => { + if (!data) { + return []; + } + const pipelineData = data?.pipelineData; + const isbData = data?.isbData; + return [ + // pipeline collection + { + type: SummarySectionType.COLLECTION, + collectionSections: [ + { + type: SummarySectionType.CUSTOM, + customComponent: ( + + ), + }, + { + type: SummarySectionType.CUSTOM, + customComponent: ( + + ), + }, + { + type: SummarySectionType.CUSTOM, + customComponent: , + }, + ], + }, + ]; + }, [data]); + const { pipeline, vertices, @@ -47,24 +101,61 @@ export function Pipeline() { if (watermarkErr) notifyError(watermarkErr); }, [watermarkErr]); + const { setSidebarProps } = useContext(AppContext); + const handleError = useCallback(() => { + setSidebarProps({ + type: SidebarType.ERRORS, + errorsProps: { + errors: true, + }, + slide: false, + }); + }, [setSidebarProps]); + if (pipelineErr || buffersErr) { - return
Error
; + return ( +
+
Error
+
+ {"error-status"} +
+
+ ); } return ( -
- {!loading && ( - - )} - {loading && } -
+ + {!loading && ( + + )} + {loading && ( + + )} +
+ } + /> ); } diff --git a/ui/src/components/pages/Pipeline/partials/Graph/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/index.tsx index 08a2b3ea1e..bb1b1ab029 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/index.tsx +++ b/ui/src/components/pages/Pipeline/partials/Graph/index.tsx @@ -1,10 +1,16 @@ -import { MouseEvent, useCallback, useEffect, useMemo, useState } from "react"; +import React, { + createContext, + MouseEvent, + useCallback, + useEffect, + useMemo, + useState, + useContext, +} from "react"; import ReactFlow, { - addEdge, applyEdgeChanges, applyNodeChanges, - Connection, Edge, EdgeChange, Node, @@ -12,22 +18,44 @@ import ReactFlow, { NodeTypes, EdgeTypes, Position, - Controls, + Panel, + useReactFlow, + useViewport, + ReactFlowProvider, } from "reactflow"; -import { Card } from "@mui/material"; +import IconButton from "@mui/material/IconButton"; import { graphlib, layout } from "dagre"; -import EdgeInfo from "./partials/EdgeInfo"; -import NodeInfo from "./partials/NodeInfo"; -import Spec from "./partials/Spec"; import CustomEdge from "./partials/CustomEdge"; import CustomNode from "./partials/CustomNode"; -import { GraphProps } from "../../../../../types/declarations/graph"; +import { AppContext } from "../../../../../App"; +import { AppContextProps } from "../../../../../types/declarations/app"; +import { SidebarType } from "../../../../common/SlidingSidebar"; +import { + FlowProps, + GraphProps, + HighlightContextProps, +} from "../../../../../types/declarations/graph"; +import lock from "../../../../../images/lock.svg"; +import unlock from "../../../../../images/unlock.svg"; +import scrollToggle from "../../../../../images/move-arrows.svg"; +import closedHand from "../../../../../images/closed.svg"; +import fullscreen from "../../../../../images/fullscreen.svg"; +import sidePanel from "../../../../../images/side-panel.svg"; +import zoomInIcon from "../../../../../images/zoom-in.svg"; +import zoomOutIcon from "../../../../../images/zoom-out.svg"; +import source from "../../../../../images/source.png"; +import map from "../../../../../images/map.png"; +import reduce from "../../../../../images/reduce.png"; +import sink from "../../../../../images/sink.png"; +import input from "../../../../../images/input.svg"; +import generator from "../../../../../images/generator.svg"; +import noError from "../../../../../images/no-error.svg"; import "reactflow/dist/style.css"; import "./style.css"; -const nodeWidth = 230; -const nodeHeight = 48; +const nodeWidth = 252; +const nodeHeight = 72; const graphDirection = "LR"; const defaultNodeTypes: NodeTypes = { @@ -38,6 +66,9 @@ const defaultEdgeTypes: EdgeTypes = { custom: CustomEdge, }; +//sets nodes and edges to highlight in the graph +export const HighlightContext = createContext(null); + const getLayoutedElements = ( nodes: Node[], edges: Edge[], @@ -46,20 +77,35 @@ const getLayoutedElements = ( const dagreGraph = new graphlib.Graph(); dagreGraph.setDefaultEdgeLabel(() => ({})); const isHorizontal = direction === "LR"; - dagreGraph.setGraph({ rankdir: direction, ranksep: 80 }); + dagreGraph.setGraph({ rankdir: direction, ranksep: 240, edgesep: 180 }); nodes.forEach((node) => { dagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight }); }); edges.forEach((edge) => { - dagreGraph.setEdge(edge.source, edge.target); + // skipping the side input edges to ensure graph alignment without the sideInputs + if (!edge?.data?.sideInputEdge) + dagreGraph.setEdge(edge.source, edge.target); }); layout(dagreGraph); - + // setting nodes excepts generators and assigning generator height after remaining nodes are laid out + let max_pos = 0; + nodes.forEach((node) => { + if (node?.data?.type !== "sideInput") { + const nodeWithPosition = dagreGraph.node(node.id); + max_pos = Math.max(max_pos, nodeWithPosition.y); + } + }); + let cnt = 2; nodes.forEach((node) => { const nodeWithPosition = dagreGraph.node(node.id); + if (node?.data?.type === "sideInput") { + nodeWithPosition.x = nodeWidth; + nodeWithPosition.y = max_pos + nodeHeight * cnt; + cnt++; + } node.targetPosition = isHorizontal ? Position.Left : Position.Top; node.sourcePosition = isHorizontal ? Position.Right : Position.Bottom; @@ -74,8 +120,168 @@ const getLayoutedElements = ( return { nodes, edges }; }; +const Flow = (props: FlowProps) => { + const zoomLevel = useViewport().zoom; + const { zoomIn, zoomOut, fitView } = useReactFlow(); + const [isLocked, setIsLocked] = useState(false); + const [isPanOnScrollLocked, setIsPanOnScrollLocked] = useState(false); + const { + nodes, + edges, + onNodesChange, + onEdgesChange, + handleNodeClick, + handleEdgeClick, + handlePaneClick, + setSidebarProps, + } = props; + + const onIsLockedChange = useCallback( + () => setIsLocked((prevState) => !prevState), + [] + ); + const onIsPanOnScrollLockedChange = useCallback( + () => setIsPanOnScrollLocked((prevState) => !prevState), + [] + ); + const onFullScreen = useCallback(() => fitView(), [zoomLevel]); + const onZoomIn = useCallback(() => zoomIn({ duration: 500 }), [zoomLevel]); + const onZoomOut = useCallback(() => zoomOut({ duration: 500 }), [zoomLevel]); + + const handleError = useCallback(() => { + setSidebarProps({ + type: SidebarType.ERRORS, + errorsProps: { + errors: true, + }, + slide: false, + }); + }, [setSidebarProps]); + // TODO error panel icon color change + return ( + + + + {"lock-unlock"} + + + {"panOnScrollLock"} + +
+ + {"fullscreen"} + + { + //TODO add single panel logic + alert("sidePanel"); + }} + > + {"sidePanel"} + +
+ + zoom-in + + + zoom-out + + + + + + {(((zoomLevel - 0.5) / 1.5) * 100).toFixed(0)}% + + + + + +
+ {"source"} +
Source
+
+
+ {"map"} +
Map
+
+
+ {"reduce"} +
Reduce
+
+
+ {"sink"} +
Sink
+
+
+ {"input"} +
Input
+
+
+ {"generator"} +
Generator
+
+
+ +
+ {"error-status"} +
+
+ + ); +}; + +// hides the side input edges +const hide = (hidden: { [x: string]: any }) => (edge: Edge) => { + edge.hidden = hidden[edge?.data?.source]; + return edge; +}; + +const getHiddenValue = (edges: Edge[]) => { + const hiddenEdges = {}; + edges?.forEach((edge) => { + if (edge?.data?.sideInputEdge) { + hiddenEdges[edge?.data?.source] = true; + } + }); + return hiddenEdges; +}; + export default function Graph(props: GraphProps) { const { data, namespaceId, pipelineId } = props; + const { sidebarProps, setSidebarProps } = + useContext(AppContext); const { nodes: layoutedNodes, edges: layoutedEdges } = useMemo(() => { return getLayoutedElements(data.vertices, data.edges, graphDirection); @@ -83,6 +289,30 @@ export default function Graph(props: GraphProps) { const [nodes, setNodes] = useState(layoutedNodes); const [edges, setEdges] = useState(layoutedEdges); + const [sideNodes, setSideNodes] = useState>(new Map()); + const [sideEdges, setSideEdges] = useState>(new Map()); + const initialHiddenValue = getHiddenValue(layoutedEdges); + const [hidden, setHidden] = useState(initialHiddenValue); + + useEffect(() => { + const nodeSet = new Map(); + layoutedNodes.forEach((node) => { + if (node?.data?.sideHandle) { + nodeSet.set(node?.data?.name, node); + } + }); + setSideNodes(nodeSet); + }, [layoutedNodes]); + + useEffect(() => { + const edgeSet: Map = new Map(); + layoutedEdges.forEach((edge) => { + if (edge?.data?.sideInputEdge) { + edgeSet.set(edge?.id, edge?.targetHandle); + } + }); + setSideEdges(edgeSet); + }, [layoutedEdges]); useEffect(() => { setNodes(layoutedNodes); @@ -99,23 +329,47 @@ export default function Graph(props: GraphProps) { setEdges((eds) => applyEdgeChanges(changes, eds)), [setEdges] ); - const onConnect = useCallback( - (connection: Connection) => setEdges((eds) => addEdge(connection, eds)), - [setEdges] - ); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [edgeOpen, setEdgeOpen] = useState(false); const [edgeId, setEdgeId] = useState(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [edge, setEdge] = useState(); - const handleEdgeClick = (event: MouseEvent, edge: Edge) => { - setEdge(edge); - setEdgeId(edge.id); - setEdgeOpen(true); - setShowSpec(false); - setNodeOpen(false); - }; + const openEdgeSidebar = useCallback( + (edge: Edge) => { + if (!setSidebarProps) { + return; + } + const existingProps = sidebarProps ? JSON.stringify(sidebarProps) : ""; + const updated = { + type: SidebarType.EDGE_DETAILS, + edgeDetailsProps: { + edgeId: edge.id, + watermarks: edge?.data?.edgeWatermark?.watermarks, + }, + }; + if (existingProps === JSON.stringify(updated)) { + // Do not update if no data change. Avoids infinite loop. + return; + } + setSidebarProps(updated); + }, + [setSidebarProps, sidebarProps] + ); + + const handleEdgeClick = useCallback( + (event: MouseEvent, edge: Edge) => { + setEdge(edge); + setEdgeId(edge.id); + setEdgeOpen(true); + setShowSpec(false); + setNodeOpen(false); + openEdgeSidebar(edge); + }, + [setSidebarProps, namespaceId, pipelineId, openEdgeSidebar] + ); // This has been added to make sure that edge container refreshes on edges being refreshed useEffect(() => { @@ -128,22 +382,88 @@ export default function Graph(props: GraphProps) { edge.id = dataEdge.id; flag = true; setEdge(edge); + if (sidebarProps && sidebarProps?.type === SidebarType?.EDGE_DETAILS) { + // Update sidebar data if already open + openEdgeSidebar(edge); + } } }); - }, [edges, edgeId]); + }, [edges, edgeId, sidebarProps, openEdgeSidebar]); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [nodeOpen, setNodeOpen] = useState(false); const [nodeId, setNodeId] = useState(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [node, setNode] = useState(); - const handleNodeClick = (event: MouseEvent, node: Node) => { - setNode(node); - setNodeId(node.id); - setNodeOpen(true); - setShowSpec(false); - setEdgeOpen(false); - }; + useEffect(() => { + setEdges((eds) => eds.map(hide(hidden))); + }, [hidden, data]); + + const openNodeSidebar = useCallback( + (node: Node) => { + if (!setSidebarProps) { + return; + } + const existingProps = sidebarProps ? JSON.stringify(sidebarProps) : ""; + if (node?.data?.type === "sideInput") { + const updated = { + type: SidebarType.GENERATOR_DETAILS, + generatorDetailsProps: { + namespaceId, + pipelineId, + vertexId: node.id, + generatorDetails: sideNodes.get(node.id) || {}, + }, + }; + if (existingProps === JSON.stringify(updated)) { + // Do not update if no data change. Avoids infinite loop. + return; + } + setSidebarProps(updated); + } else { + const updated = { + type: SidebarType.VERTEX_DETAILS, + vertexDetailsProps: { + namespaceId, + pipelineId, + vertexId: node.id, + vertexSpecs: node?.data?.nodeInfo, + vertexMetrics: node?.data?.vertexMetrics?.podMetrics?.data, + buffers: node?.data?.buffers, + type: node?.data?.type, + }, + }; + if (existingProps === JSON.stringify(updated)) { + // Do not update if no data change. Avoids infinite loop. + return; + } + setSidebarProps(updated); + } + }, + [namespaceId, pipelineId, sideNodes, setSidebarProps, sidebarProps] + ); + + const handleNodeClick = useCallback( + (event: MouseEvent | undefined, node: Node) => { + setNode(node); + setNodeId(node.id); + setNodeOpen(true); + setShowSpec(false); + setEdgeOpen(false); + setHidden((prevState) => { + const updatedState = {}; + Object.keys(prevState).forEach((key) => { + updatedState[key] = + node?.data?.type === "sideInput" ? !(key === node.id) : true; + }); + return updatedState; + }); + openNodeSidebar(node); + }, + [setHidden, openNodeSidebar] + ); // This has been added to make sure that node container refreshes on nodes being refreshed useEffect(() => { @@ -153,57 +473,85 @@ export default function Graph(props: GraphProps) { node.data = dataNode.data; node.id = dataNode.id; setNode(node); + if ( + sidebarProps && + (sidebarProps.type === SidebarType.VERTEX_DETAILS || + sidebarProps.type === SidebarType.GENERATOR_DETAILS) + ) { + // Update sidebar data if already open + openNodeSidebar(node); + } } }); - }, [nodes, nodeId]); + }, [nodes, nodeId, sidebarProps, openNodeSidebar]); + + const [highlightValues, setHighlightValues] = useState<{ + [key: string]: boolean; + }>({}); const handlePaneClick = () => { setShowSpec(true); setEdgeOpen(false); setNodeOpen(false); + setHighlightValues({}); + setHidden((prevState) => { + const updatedState = {}; + Object.keys(prevState).forEach((key) => { + updatedState[key] = true; + }); + return updatedState; + }); }; + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [showSpec, setShowSpec] = useState(true); return ( -
+
- - - + + + +
- - {showSpec && } - {edgeOpen && } - {nodeOpen && ( - - )} - + {/**/} + {/* {showSpec && }*/} + {/* {edgeOpen && }*/} + {/* {nodeOpen && (*/} + {/* */} + {/* )}*/} + {/**/}
); } diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/index.tsx index c2b3f5e715..ab49890a40 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/index.tsx +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/index.tsx @@ -1,7 +1,10 @@ -import { FC, memo } from "react"; +import { FC, memo, useCallback, useContext, useEffect, useMemo } from "react"; import { Tooltip } from "@mui/material"; import { EdgeProps, EdgeLabelRenderer, getSmoothStepPath } from "reactflow"; import { duration } from "moment"; +import { HighlightContext } from "../../index"; +import { HighlightContextProps } from "../../../../../../../types/declarations/graph"; +import error from "../../../../../../../images/error.svg"; import "reactflow/dist/style.css"; import "./style.css"; @@ -26,31 +29,26 @@ const CustomEdge: FC = ({ targetPosition, }); - const [, labelX] = obj; - let [edgePath, , labelY] = obj; + let [edgePath, labelX, labelY] = obj; let labelRenderer = ""; if (data?.fwdEdge) { if (sourceY !== targetY) { if (data?.fromNodeOutDegree > 1) { - if (sourceY < targetY) { - labelY = targetY - 14; - } else { - labelY = targetY + 2; - } + labelY = targetY; + labelX = targetX - 63; } else { - if (sourceY < targetY) { - labelY = sourceY + 1; - } else { - labelY = sourceY - 13; - } + labelY = sourceY; + labelX = sourceX + 63; } + } else if (data?.fromNodeOutDegree > 1) { + labelX = sourceX + ((targetX - sourceX) * 3) / 4; } labelRenderer = `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`; } if (data?.backEdge) { - const height = data?.backEdgeHeight * 35; + const height = data?.backEdgeHeight * 35 + 30; edgePath = `M ${sourceX} ${sourceY} L ${sourceX} ${ -height + 5 } Q ${sourceX} ${-height} ${sourceX - 5} ${-height} L ${ @@ -64,46 +62,99 @@ const CustomEdge: FC = ({ if (data?.selfEdge) { edgePath = `M ${sourceX} ${sourceY} L ${sourceX} ${ - sourceY - 15 - } Q ${sourceX} ${sourceY - 20} ${sourceX - 5} ${sourceY - 20} L ${ + sourceY - 25 + } Q ${sourceX} ${sourceY - 30} ${sourceX - 5} ${sourceY - 30} L ${ targetX + 5 - } ${targetY - 20} Q ${targetX} ${sourceY - 20} ${targetX} ${ - sourceY - 15 - } L ${targetX} ${sourceY}`; + } ${targetY - 30} Q ${targetX} ${sourceY - 30} ${targetX} ${ + sourceY - 25 + } L ${targetX} ${sourceY - 8}`; const centerX = (sourceX + targetX) / 2; - labelRenderer = `translate(-50%, -50%) translate(${centerX}px,${labelY}px)`; + labelRenderer = `translate(-50%, -50%) translate(${centerX}px,${ + labelY - 10 + }px)`; } - // Highlight the edge on isFull - thick red line - let edgeStyle, wmStyle, pendingStyle; + const { + highlightValues, + setHighlightValues, + sideInputNodes, + sideInputEdges, + } = useContext(HighlightContext); - if (data?.isFull) { - edgeStyle = { - stroke: "red", - strokeWidth: "0.125rem", - fontWeight: 700, + const getColor = useMemo(() => { + return data?.isFull ? "#DB334D" : "#8D9096"; + }, [data]); + + useEffect(() => { + if (data?.sideInputEdge) return; + let sourceClass = `source-handle-${data?.source}`; + let targetClass = `target-handle-${data?.target}`; + if (data?.backEdge) { + sourceClass = `center-${sourceClass}`; + targetClass = `center-${targetClass}`; + } else if (data?.selfEdge) { + sourceClass = `quad-${sourceClass}`; + targetClass = `quad-${targetClass}`; + } + const handleElements = Array.from( + document.querySelectorAll(`.${targetClass}, .${sourceClass}`) + ) as HTMLElement[]; + + handleElements.forEach((handle) => { + handle.style.background = getColor; + }); + }, [data, getColor]); + + const commonStyle = useMemo(() => { + const style = {}; + if ( + !sideInputEdges.has(id) && + sideInputNodes.has(Object.keys(highlightValues)[0]) + ) { + style["opacity"] = 0.5; + } + return style; + }, [highlightValues, sideInputNodes, sideInputEdges]); + + const edgeStyle = useMemo(() => { + return { + stroke: highlightValues[id] + ? "black" + : data?.sideInputEdge + ? "#274C77" + : getColor, + strokeWidth: 2, + ...commonStyle, }; - } + }, [highlightValues, getColor, data, commonStyle]); - if (sourceY === targetY || data?.backEdge) { - wmStyle = { marginTop: "-0.87rem" }; - pendingStyle = { marginTop: "0.15rem" }; - } else { - wmStyle = { right: "0.1rem" }; - pendingStyle = { left: "0.1rem" }; - } - const getMinWM = () => { + const wmStyle = useMemo(() => { + return { + color: getColor, + ...commonStyle, + }; + }, [getColor, commonStyle]); + + const pendingStyle = useMemo(() => { + return { + color: getColor, + fontWeight: data?.isFull ? 700 : 400, + ...commonStyle, + }; + }, [data, getColor, commonStyle]); + + const getMinWM = useMemo(() => { if (data?.edgeWatermark?.watermarks) { return Math.min.apply(null, data?.edgeWatermark?.watermarks); } else { return -1; } - }; + }, [data]); - const getDelay = () => { + const getDelay = useMemo(() => { const str = " behind now"; const fetchWMTime = data?.edgeWatermark?.WMFetchTime; - const minWM = getMinWM(); + const minWM = getMinWM; const startTime = minWM === -1 ? 0 : minWM; const endTime = fetchWMTime || Date.now(); const diff = duration(endTime - startTime); @@ -131,7 +182,13 @@ const CustomEdge: FC = ({ } else { return `${milliseconds}ms` + str; } - }; + }, [data, getMinWM]); + + const handleClick = useCallback(() => { + const updatedEdgeHighlightValues = {}; + updatedEdgeHighlightValues[id] = true; + setHighlightValues(updatedEdgeHighlightValues); + }, [setHighlightValues]); return ( <> @@ -143,6 +200,7 @@ const CustomEdge: FC = ({ style={edgeStyle} data-testid={id} markerEnd={markerEnd} + onClick={handleClick} /> @@ -151,21 +209,22 @@ const CustomEdge: FC = ({ style={{ transform: labelRenderer, }} + onClick={handleClick} > {data?.edgeWatermark?.isWaterMarkEnabled && (
Watermark
-
{new Date(getMinWM()).toISOString()}
-
{getDelay()}
+
{new Date(getMinWM).toISOString()}
+
{getDelay}
} arrow placement={"top"} > -
- {getMinWM()} +
+ {getMinWM}
)} @@ -174,7 +233,8 @@ const CustomEdge: FC = ({ arrow placement={"bottom"} > -
+
+ {data?.isFull && {"error"}} {data?.backpressureLabel}
diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/style.css b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/style.css index 8f687ba894..6b2ebcf15c 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/style.css +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomEdge/style.css @@ -1,30 +1,41 @@ .edge { position: absolute; cursor: pointer; - font-family: "IBM Plex Sans", sans-serif; - font-weight: 400; - font-size: 0.6rem; - width: fit-content; + pointer-events: all; display: flex; - justify-content: center; + flex-direction: column; } .edge-tooltip { - font-size: 1.2em; + font-size: 0.8rem; text-align: center; } -.edge-label { - width: fit-content; - background: white; - position: absolute; - border-radius: 0.125rem; - padding: 0 0.3rem; - font-size: 0.48rem; - text-transform: lowercase; - text-align: center; +.edge-watermark-label { + display: flex; + align-items: center; + justify-content: center; + height: 1.5rem; + width: 6.625rem; + color: #8D9096; font-family: "IBM Plex Sans", sans-serif; - pointer-events: all; - align-content: center; + font-size: 0.75rem; + font-style: normal; + font-weight: 400; + line-height: normal; +} + +.edge-pending-label { + display: flex; + align-items: center; + justify-content: center; + height: 1.5rem; + width: 6.625rem; + color: #8D9096; + font-family: "IBM Plex Sans", sans-serif; + font-size: 1rem; + font-style: normal; + font-weight: 400; + line-height: normal; } diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/index.tsx index 1446d1ae0a..84395bddd5 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/index.tsx +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/index.tsx @@ -1,25 +1,29 @@ -import { FC, memo, useState } from "react"; +import { FC, memo, useCallback, useContext, useMemo } from "react"; import { Tooltip } from "@mui/material"; import { Handle, NodeProps, Position } from "reactflow"; -import { GetNodeInfoValueComponent } from "./partials/NodeLabelInfo"; +import { HighlightContext } from "../../index"; +import { HighlightContextProps } from "../../../../../../../types/declarations/graph"; +import healthy from "../../../../../../../images/heart-fill.svg"; +import source from "../../../../../../../images/source.png"; +import map from "../../../../../../../images/map.png"; +import reduce from "../../../../../../../images/reduce.png"; +import sink from "../../../../../../../images/sink.png"; +import input from "../../../../../../../images/input.svg"; +import generator from "../../../../../../../images/generator.svg"; import "reactflow/dist/style.css"; import "./style.css"; -const getColor = (nodeType: string) => { +const getBorderColor = (nodeType: string) => { return nodeType === "source" - ? "#34BFFF" + ? "#3874CB" : nodeType === "udf" - ? "#82DBE4" - : "#82A9C9"; + ? "#009EAC" + : "#577477"; }; -const getBorderColor = (nodeType: string) => { - return nodeType === "source" - ? "#2382ad" - : nodeType === "udf" - ? "#59959c" - : "#5e7a91"; +const isSelected = (selected: boolean) => { + return selected ? "0.1875rem solid" : "0.0625rem solid"; }; const CustomNode: FC = ({ @@ -28,108 +32,280 @@ const CustomNode: FC = ({ sourcePosition = Position.Bottom, targetPosition = Position.Top, }: NodeProps) => { - const [bgColor, setBgColor] = useState(() => getColor(data?.type)); - const [isOpen, setIsOpen] = useState(false); + //TODO add check for healthy/unhealthy node and update imported images accordingly + + const { + highlightValues, + setHighlightValues, + setHidden, + sideInputNodes, + handleNodeClick, + sideInputEdges, + } = useContext(HighlightContext); - const handleNodeEnter = () => { - if (data?.vertexMetrics?.error) { - setBgColor("gray"); - setIsOpen(true); + const handleClick = useCallback(() => { + const updatedNodeHighlightValues = {}; + updatedNodeHighlightValues[data?.name] = true; + setHighlightValues(updatedNodeHighlightValues); + }, [data, setHighlightValues]); + + const commonStyle = useMemo(() => { + const style = {}; + if ( + !sideInputNodes.has(data?.name) && + sideInputNodes.has(Object.keys(highlightValues)[0]) + ) { + style["opacity"] = 0.5; } - }; + return style; + }, [highlightValues, sideInputNodes, data]); - const handleNodeLeave = () => { - if (data?.vertexMetrics?.error) { - setBgColor(() => getColor(data?.type)); - setIsOpen(false); + const blurHandle = (id: string) => { + const style = {}; + const sourceVertex = Object.keys(highlightValues)[0]; + if (sideInputNodes.has(sourceVertex)) { + const edgeId = sourceVertex + "-" + data?.name; + if (!sideInputEdges.has(edgeId)) { + style["opacity"] = 0.5; + } else { + if (sideInputEdges.get(edgeId) !== id) { + style["opacity"] = 0.5; + } + } } + return style; }; - return ( -
+ const nodeStyle = useMemo(() => { + return { + border: `${isSelected(highlightValues[data?.name])} ${getBorderColor( + data?.type + )}`, + ...commonStyle, + }; + }, [highlightValues, data]); + + if (data?.type === "sideInput") { + return ( 1 or more pods are not running
- } - placement={"top"} - open={isOpen} + title={
{data?.name}
} arrow + placement={"top-end"} + > +
+ {"generator"} + +
+ + ); + } + + const handleInputClick = useCallback( + (e) => { + e.stopPropagation(); + const targetId = e.target.id; + let source: string; + sideInputNodes.forEach((_, node) => { + const possibleEdge = `${node}-${data?.name}`; + if ( + sideInputEdges.has(possibleEdge) && + sideInputEdges.get(possibleEdge) === targetId + ) { + source = node; + } + }); + handleNodeClick(e, sideInputNodes.get(source)); + }, + [sideInputEdges, data, sideInputNodes, handleNodeClick] + ); + + const handleMouseOver = useCallback( + (e) => { + const targetId = e.target.id; + let source: string; + + sideInputNodes.forEach((_, node) => { + const possibleEdge = `${node}-${data?.name}`; + if ( + sideInputEdges.has(possibleEdge) && + sideInputEdges.get(possibleEdge) === targetId + ) { + source = node; + } + }); + setHidden((prevState) => { + const updatedState = {}; + Object.keys(prevState).forEach((key) => { + updatedState[key] = true; + }); + updatedState[source] = false; + return updatedState; + }); + const updatedHighlightedState = {}; + updatedHighlightedState[source] = true; + setHighlightValues(updatedHighlightedState); + }, + [data, sideInputNodes, sideInputEdges, setHidden, setHighlightValues] + ); + + const handleMouseOut = useCallback(() => { + setHidden((prevState) => { + const updatedState = {}; + Object.keys(prevState).forEach((key) => { + updatedState[key] = true; + }); + return updatedState; + }); + setHighlightValues({}); + }, [setHidden, setHighlightValues]); + + return ( +
+
-
{data?.name}
+ + + {data?.podnum <= 1 ? "pod" : "pods"} +
+ } + placement={"top-end"} + arrow > - -
Processing Rates
-
1 min: {data?.vertexMetrics?.ratePerMin}/sec
-
5 min: {data?.vertexMetrics?.ratePerFiveMin}/sec
-
15 min: {data?.vertexMetrics?.ratePerFifteenMin}/sec
-
- } - arrow - > -
- {data?.vertexMetrics?.ratePerMin}/sec +
+ {data?.type === "source" && ( + {"source-vertex"} + )} + {data?.type === "udf" && data?.nodeInfo?.udf?.groupBy === null && ( + {"map-vertex"} + )} + {data?.type === "udf" && data?.nodeInfo?.udf?.groupBy && ( + {"reduce-vertex"} + )} + {data?.type === "sink" && {"sink-vertex"}} + {data?.podnum} +
+ + +
+ {"healthy"} +
+ + +
Processing Rates
+
1 min: {data?.vertexMetrics?.ratePerMin}/sec
+
5 min: {data?.vertexMetrics?.ratePerFiveMin}/sec
+
15 min: {data?.vertexMetrics?.ratePerFifteenMin}/sec
- - {GetNodeInfoValueComponent(data)} - {(data?.type === "udf" || data?.type === "sink") && ( + } + arrow + placement={"bottom-end"} + > +
+ {data?.vertexMetrics?.ratePerMin}/sec +
+ + + {(data?.type === "udf" || data?.type === "sink") && ( + + )} + {(data?.type === "source" || data?.type === "udf") && ( + + )} + {data?.centerSourceHandle && ( + + )} + {data?.centerTargetHandle && ( + + )} + {data?.quadHandle && ( + <> + - )} - {(data?.type === "source" || data?.type === "udf") && ( + + )} + {data?.nodeInfo?.sideInputs?.map((_, idx) => { + return ( - )} - {data?.centerSourceHandle && ( - - )} - {data?.centerTargetHandle && ( - - )} - {data?.quadHandle && ( - <> - - - - )} -
- + ); + })} +
+ {data?.nodeInfo?.sideInputs?.map((_, idx) => { + return ( + {"input"} + ); + })}
); }; diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/index.tsx deleted file mode 100644 index 90eb0baaf2..0000000000 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -// import React from "react"; -import "./style.css"; - -// Returns the component for node info value -export function GetNodeInfoValueComponent(nodeData) { - const label = nodeData?.podnum <= 1 ? "pod" : "pods"; - return ( - - {nodeData?.name} - - - - - - - - {nodeData?.podnum} {label} - - - ); -} diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/style.css b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/style.css deleted file mode 100644 index 9c42083340..0000000000 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/partials/NodeLabelInfo/style.css +++ /dev/null @@ -1,19 +0,0 @@ -.node-info { - white-space: nowrap; - font-size: 0.65rem; -} - -.node-icon { - width: 0.715rem; - height: 0.715rem; - display: inline-block; - vertical-align: middle; - position: relative; - margin-left: 0.0625rem; - margin-right: 0.0625rem; - padding-bottom: 0.03125rem; -} - -.node-podnum { - font-weight: bold; -} \ No newline at end of file diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/style.css b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/style.css index ec211ca433..f0b57bd6bd 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/style.css +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/CustomNode/style.css @@ -1,20 +1,136 @@ .node-rate { - width: fit-content; - height: 0.625rem; - background: #ccd6dd; - border: 0.0625rem solid #8fa4b1; + display: flex; + width: 5.625rem; + height: 1.375rem; + border-radius: 1.25rem; + background: #D1DEE9; + color: #274C77; + font-family: "IBM Plex Sans", serif; + font-size: 0.75rem; + font-style: normal; + font-weight: 500; + line-height: normal; + justify-content: center; + align-items: center; position: absolute; - bottom: -0.3125rem; - right: 0.625rem; - border-radius: 0.3125rem; - padding: 0 0.3125rem; - font-size: 0.4rem; + bottom: -12.5%; + right: 8%; text-transform: lowercase; - margin-right: 0.0625rem; - text-align: center; - font-family: "IBM Plex Sans", sans-serif; +} + +.node-pods { + display: flex; + width: 6.25rem; + height: 1.375rem; + border-radius: 1.25rem; + background: #D1DEE9; + color: #274C77; + font-family: "IBM Plex Sans", serif; + font-size: 0.75rem; + font-style: normal; + font-weight: 700; + line-height: normal; + justify-content: space-evenly; + align-items: center; + position: absolute; + top: -13.5%; + left: 10%; + text-transform: lowercase; +} + +.node-pods > img { + width: 1.25rem; +} + +.node-status { + width: 1.375rem; + height: 1.375rem; + border-radius: 1.25rem; + background: #D1DEE9; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + bottom: -12.5%; + left: 8%; } .node-tooltip { font-size: 0.8125rem; } + +.react-flow__node-input { + width: 15.75rem; + height: 4.875rem; + border-radius: 1.25rem; + border: 0.0625rem solid #009EAC; + background: var(--boxes, #F8F8FB); + box-shadow: 0 1.5rem 3rem -0.5rem rgba(39, 76, 119, 0.16); + cursor: pointer; +} + +.node-info { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + justify-content: center; + color: #274C77; + text-align: center; + font-family: "IBM Plex Sans", serif; + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: normal; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.node-icon { + width: 0.715rem; + height: 0.715rem; + display: inline-block; + vertical-align: middle; + position: relative; + margin-left: 0.0625rem; + margin-right: 0.0625rem; + padding-bottom: 0.03125rem; +} + +.node-podnum { + font-weight: bold; +} + +.react-flow__handle { + /*background : #8D9096;*/ + z-index: -1; + margin: -0.2rem; + height: 1rem; + width: 1rem; +} + +.sideInput_node { + width: 1.875rem; + height: 1.875rem; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.react-flow__handle-bottom { + z-index: -1; + margin: -0.2rem; + height: 1rem; + width: 1rem; + border: none; + bottom: -15%; + background: none !important; +} + +.sideInput_handle { + bottom: -22% ; + position: absolute; + cursor: pointer; +} \ No newline at end of file diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/index.tsx index 32c217f25a..61e98adca5 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/index.tsx +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/index.tsx @@ -45,6 +45,47 @@ export default function NodeInfo(props: NodeInfoProps) { ); } + if (node?.data?.type === "sideInput") { + // returning just spec in case of side input + return ( + + + + + + + + + {node?.data?.nodeInfo && ( + + )} + + + + {node?.data?.nodeInfo && ( + + + + )} + + ); + } + return ( diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/index.tsx index 746621b735..e5a047e325 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/index.tsx +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/index.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, useMemo, useCallback } from "react"; import Box from "@mui/material/Box"; +import Paper from "@mui/material/Paper"; import CircularProgress from "@mui/material/CircularProgress"; import { EventType } from "@visx/event/lib/types"; import { Containers } from "./partials/Containers"; @@ -103,7 +104,7 @@ export function Pods(props: PodsProps) { } return ( - + {containerSelector} {podDetail} - + ); } diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/index.tsx index e93952a725..5ec4552bbb 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/index.tsx +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/index.tsx @@ -21,7 +21,14 @@ export function PodDetail({ data-testid="podDetail" sx={{ display: "flex", flexDirection: "column", mb: 2 }} > - + Pod Info - + Pod Logs - - - Name: - {podName} - - - - - CPU %: - {cpuPercent} - - - CPU: - {`${usedCPU} / ${specCPU}`} - - - - - Memory %: - {memPercent} - - - Memory: - {`${usedMem} / ${specMem}`} - - + + + + + + Name + {podName} + + + CPU % + {cpuPercent} + + + CPU + {`${usedCPU} / ${specCPU}`} + + + MEMORY % + {memPercent} + + + MEMORY + {`${usedMem} / ${specMem}`} + + +
+
); } diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/partials/PodLogs/index.tsx b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/partials/PodLogs/index.tsx index 04f1ef1988..90f9210643 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/partials/PodLogs/index.tsx +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/PodDetails/partials/PodLogs/index.tsx @@ -105,7 +105,7 @@ export function PodLogs({ namespaceId, podName, containerName }: PodLogsProps) { setLogRequestKey(requestKey); setLogs(["Loading logs..."]); fetch( - `/api/v1/namespaces/${namespaceId}/pods/${podName}/log?container=${containerName}&follow=true&tailLines=${MAX_LOGS}` + `/api/v1/namespaces/${namespaceId}/pods/${podName}/logs?container=${containerName}&follow=true&tailLines=${MAX_LOGS}` ) .then((response) => { if (response && response.body) { @@ -281,6 +281,7 @@ export function PodLogs({ namespaceId, podName, containerName }: PodLogsProps) { component="span" sx={{ whiteSpace: "nowrap", + paddingTop: "0.5rem", }} > - - Pods - +
+ Click on different hexagons under CPU/MEM display to switch to different + Pods +
{filteredPods?.length > 0 && ( -
- CPU - -
-
- MEM - -
-
+ + +
CPU
+
MEM
+
+ + + + + + + + +
); }; diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/partials/PodsHeatMap/style.css b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/partials/PodsHeatMap/style.css index ad439c5e1b..82037c5f0b 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/partials/PodsHeatMap/style.css +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/partials/PodsHeatMap/style.css @@ -1,37 +1,48 @@ .heatmap-graph { - display: flex; - justify-content: space-evenly; + display: flex; + justify-content: space-evenly; + margin-top: 1rem; + border: 1px solid #d9d9d9; +} + +.heatmap-graph-title { + flex-grow: 1; + color: #241C15; + font-size: 1.25rem; + font-style: normal; + font-weight: 500; + line-height: 1.75rem; } .heatmap-graph-wrapper { - display: flex; - text-align: center; - flex-direction: column; + display: flex; + text-align: center; + flex-direction: column; } .hexagon-tooltip { - transform: translate(10%, -75%); + transform: translate(10%, -75%); } .hexagon-tooltip-table { - border-spacing: 0; - border: 0.0625rem solid #dcdddc; - border-radius: 0.3125rem; - width: 100%; - margin-bottom: 0.25rem; + border-spacing: 0; + border: 0.0625rem solid #dcdddc; + border-radius: 0.3125rem; + width: 100%; + margin-bottom: 0.25rem; } .hexagon-table-tbody tr:nth-child(2n + 1) td { - background: white; + background: white; } .hexagon-table-th, .hexagon-table-td { - padding: 0.6rem; + padding: 0.6rem; } .hexagon-table-span { - padding: 0.3125rem; - display: block; - text-align: left; + padding: 0.3125rem; + display: block; + text-align: left; } diff --git a/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/style.css b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/style.css new file mode 100644 index 0000000000..e91d2e6dd7 --- /dev/null +++ b/ui/src/components/pages/Pipeline/partials/Graph/partials/NodeInfo/partials/Pods/partials/SearchablePodsHeatMap/style.css @@ -0,0 +1,8 @@ +.pod-exp-text { + color: #3C4348; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: normal; + margin-top: 0.5rem; +} diff --git a/ui/src/components/pages/Pipeline/partials/Graph/style.css b/ui/src/components/pages/Pipeline/partials/Graph/style.css index 2d3c56f5e5..ffe7a5bb8b 100644 --- a/ui/src/components/pages/Pipeline/partials/Graph/style.css +++ b/ui/src/components/pages/Pipeline/partials/Graph/style.css @@ -2,20 +2,75 @@ flex-grow: 1; position: relative; cursor: move; - height: 30rem; - border: 0.125rem solid whitesmoke; + height: 100%; + background: url("../../../../../images/graph-background.png") no-repeat; + background-size: cover; } -.Graph .controls { - position: absolute; - right: 10px; - top: 10px; - z-index: 10; - font-size: 12px; +.interaction { + display: flex; + flex-direction: row; + width: 21.375rem; + height: 2.5rem; + justify-content: space-between; + align-items: center; + border-radius: 0.25rem; + border: 1px solid var(--base-gray-gray-05, #D4D7DC); + background: var(--primitives-white, #FFF); + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.00); + margin-bottom: 3rem; + margin-left: 3rem; + padding: 0 0.5rem; } -.Graph .controls button:first-child { - margin-right: 10px; +.legend { + display: flex; + flex-direction: column; + height: 12rem; + width: 5rem; + justify-content: space-between; + margin-bottom: 6rem; + margin-left: 4rem; +} + +.legend-title { + display: flex; + flex-direction: row; + width: 100%; + color: var(--badge-pending, #6B6C72); + font-family: AvenirNext forINTUIT, "IBM Plex Sans"; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: normal; + /*justify-content: space-between;*/ +} + +.legend-title > img { + width: 1.25rem; +} + +.legend-text { + margin-top: 0.15rem; + margin-left: 0.75rem; +} + +.zoom-percent-text { + fill: #000; + text-anchor: middle; + dominant-baseline: middle; + font-size: 0.75rem; + font-style: normal; + font-weight: 600; + line-height: 1rem; + text-transform: uppercase; +} + +.divider { + width: 0.0625rem; + height: 1.5rem; + background-color: var(--primitives-white, #D4D7DC); + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.00); } .react-flow svg { overflow: visible; } \ No newline at end of file diff --git a/ui/src/components/pages/Pipeline/partials/PipelineISBStatus/index.tsx b/ui/src/components/pages/Pipeline/partials/PipelineISBStatus/index.tsx new file mode 100644 index 0000000000..c3722b3494 --- /dev/null +++ b/ui/src/components/pages/Pipeline/partials/PipelineISBStatus/index.tsx @@ -0,0 +1,123 @@ +import React from "react"; +import Box from "@mui/material/Box"; +import {IconsStatusMap, ISBStatusString} from "../../../../../utils"; + +import "./style.css"; + +export function PipelineISBStatus({ isbData }) { + return ( + + + + ISB SERVICES STATUS + + + {IconsStatusMap[isbData?.isbService?.status?.phase]} + {isbData?.status} + + + + {ISBStatusString[isbData?.isbService?.status?.phase]} + + {ISBStatusString[isbData?.status]} + + + + + ISB SERVICES SUMMARY + + +
+ Name: +
+
+ Type: +
+
+ +
+ {isbData?.name} +
+
+ {isbData?.isbService?.status?.type} + {/**/} +
+
+ +
+ +
+ Size: + + { + isbData?.isbService?.spec[ + isbData?.isbService?.status?.type + ]?.replicas + } + +
+
+
+
+
+
+
+
+ ); +} diff --git a/ui/src/components/pages/Pipeline/partials/PipelineISBStatus/style.css b/ui/src/components/pages/Pipeline/partials/PipelineISBStatus/style.css new file mode 100644 index 0000000000..b4d20458b7 --- /dev/null +++ b/ui/src/components/pages/Pipeline/partials/PipelineISBStatus/style.css @@ -0,0 +1,15 @@ +.isb-status-subtitle { + color: #3C4348; + font-size: 0.875rem; + font-style: normal; + font-weight: 600; + line-height: 1.78125rem; +} + +.isb-status-text { + color: #393A3D; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 1.46875rem; +} diff --git a/ui/src/components/pages/Pipeline/partials/PipelineStatus/index.tsx b/ui/src/components/pages/Pipeline/partials/PipelineStatus/index.tsx new file mode 100644 index 0000000000..2bad988b93 --- /dev/null +++ b/ui/src/components/pages/Pipeline/partials/PipelineStatus/index.tsx @@ -0,0 +1,54 @@ +import React from "react"; +import Box from "@mui/material/Box"; +import {IconsStatusMap, StatusString} from "../../../../../utils"; + +import "./style.css"; + +export function PipelineStatus({ status, healthStatus }) { + return ( + + + STATUS + + + + {status} + {healthStatus} + + + {StatusString[status]} + + {StatusString[healthStatus]} + + + + + + + ); +} diff --git a/ui/src/components/pages/Pipeline/partials/PipelineStatus/style.css b/ui/src/components/pages/Pipeline/partials/PipelineStatus/style.css new file mode 100644 index 0000000000..2c2485f79f --- /dev/null +++ b/ui/src/components/pages/Pipeline/partials/PipelineStatus/style.css @@ -0,0 +1,11 @@ +.pipeline-logo { + width: 1.5rem; +} + +.pipeline-logo-text { + color: #3C4348; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + margin-top: 0.125rem; +} diff --git a/ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/index.tsx b/ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/index.tsx new file mode 100644 index 0000000000..24be51616c --- /dev/null +++ b/ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/index.tsx @@ -0,0 +1,131 @@ +import React, { useCallback, useContext } from "react"; +import Box from "@mui/material/Box"; +import { useParams } from "react-router-dom"; +import { SidebarType } from "../../../../common/SlidingSidebar"; +import { AppContextProps } from "../../../../../types/declarations/app"; +import { AppContext } from "../../../../../App"; +import { DurationString } from "../../../../../utils"; + +import "./style.css"; + +export function PipelineSummaryStatus({ pipeline, lag }) { + const { namespaceId } = useParams(); + const { setSidebarProps } = useContext(AppContext); + const handleK8sEventsClick = useCallback(() => { + if (!namespaceId || !setSidebarProps) { + return; + } + setSidebarProps({ + type: SidebarType.NAMESPACE_K8s, + k8sEventsProps: { namespaceId }, + }); + }, [namespaceId, setSidebarProps]); + + const handleSpecClick = useCallback(() => { + if (!namespaceId || !setSidebarProps) { + return; + } + setSidebarProps({ + type: SidebarType.PIPELINE_SPEC, + pipelineSpecProps: { spec: pipeline.spec }, + }); + }, [namespaceId, setSidebarProps, pipeline]); + return ( + + + SUMMARY + + +
+ Created On: +
+
+ + Last Updated On:{" "} + +
+ {/*
*/} + {/* Last Refresh: */} + {/* 2023-12-07T02:02:00Z*/} + {/*
*/} +
+ +
+ {pipeline?.metadata?.creationTimestamp} +
+
+ {pipeline?.status?.lastUpdated} +
+ {/*
*/} + {/* 2023-12-07T02:02:00Z*/} + {/*
*/} +
+ +
+ +
+ K8s Events +
+
+
+
+ +
+ Pipeline Specs +
+
+
+
+ +
+ +
+ Max lag: + + {" "} + {DurationString(lag)} + +
+
+
+
+
+
+
+ ); +} diff --git a/ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/style.css b/ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/style.css new file mode 100644 index 0000000000..bb2e2308a2 --- /dev/null +++ b/ui/src/components/pages/Pipeline/partials/PipelineSummaryStatus/style.css @@ -0,0 +1,20 @@ +.pipeline-summary-text { + color: #393A3D; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 1.46875rem; +} + +.pipeline-summary-subtitle { + font-weight: 600; +} + +.pipeline-onclick-events { + color: #393A3D; + font-size: 0.875rem; + font-style: normal; + font-weight: 600; + text-decoration: underline; + cursor: pointer; +} diff --git a/ui/src/components/pages/Pipeline/style.css b/ui/src/components/pages/Pipeline/style.css index 161ede09bf..4fd6104139 100644 --- a/ui/src/components/pages/Pipeline/style.css +++ b/ui/src/components/pages/Pipeline/style.css @@ -4,4 +4,11 @@ .react-flow__edge-textbg { fill: #fafafa; -} \ No newline at end of file +} + +.pipeline-status-title { + font-weight: 600; + color: #393A3D; + font-size: 0.8125rem; + font-style: normal; +} diff --git a/ui/src/images/checkmark-circle.png b/ui/src/images/checkmark-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..39927261e164706af878b9fa1962d7e3bd8772dc GIT binary patch literal 2076 zcmV+%2;=vOP)@~0drDELIAGL9O(c600d`2O+f$vv5yP7;v%lxjvj*wx-T6zS(aY+9iHV7ciHV7ciHV8NjU5zBHA6+0nv$V( z(_f9xHY>#!lx*kvhEhZ6^dwT3wcVh{ny@P;nW;C%cxz7iJ=$Yzx*}48s>3eJse6I() zHU53u;5B-rw-(?-N_IDokcNc|Aus&ToEEFK)3-AIn|!?mH*UCvba(fJ{?=pkL@xq( zV?2j5Knx9B%zm2c2K>F$lpY}71#&C6--k=eE`WdFmk6(UJUDs^SL1paDEWJv!432b z!myO~bBmBwfJo!_ZunKadpv*}{F#7{T4WX>n*foypHXpDcjZN_K(Js&EH zvJIXgk|-DCUC+;oqCB(s1X~Kv1F?&tAMXl94ZE$Fd7~%+=#O#KBh~(=WPFWCMZ^A` zp7$I2@wQO(7L_{*4KRXT5Y29C=JPGw0Oz_e14JKh5Hax>)CmU+SZ<89#Mc*o-TI|a zj638TAtU?H7EnVr{`|TbpYa1nX`se#Ij9wc3UDOkTVVKg)d86SV(os20Mwl@H9;Pj z{3I0PsOJT?0FLvi)4WTGJKBFVpWzOc%72Z`BjsHx^NPw^DEJC`eiZU8Fx+BxEbA7F zs#(zF8i&4rw>>9`6&|H(xlCIL+z41~xup zg?uCAt6G56kyvPc$%iFO9`Nv-60fNJP1D;Udvc`TKcw*)E94s?KZ^^}j(*o0=MwW& z5k@jTlRWZIZUGt>;zyX~$^r=@jA(q#vl}5l+r}&jBbJB|VNB!aVkiN09d&>R*TMMA zAOiR;9*wH7LWJvLd`2UH-IVE#q2Un9h-s4uB^h7w>|!UKqXnquy?uwZj|344tog|y zdU6YZ-WW+D6zX=2ke{Umyg}Mcd_*u7P1JV8NZsTHeJm%{+|h%ipah-`zkhw zzz?-Q>cra4()Syol*;|MUl#zW{~tEbe+0jvp!l0LT#d7EYsjPRKUGeLaP)HnNszpls*s_!lD@l!0bM9<)a`bT;$}6rFLU-{iVA_}YIU6tf7dEI|S&w`McX za&*Y0;Gac$Ka4pE-DVTB9>A@@3S|s*q1v{fdNXt}3x6{-_&s6&nhw9bEKNTopQBI$ z{m2t?F+#-g-iD_bH(uyCX6`A}}D zivJD+i&776ZHW|tv2gP!y|su0!!s78A6?v1tvQb&kOuDE{k`z0o!6~v#K9xn z?Kr%qvJHhjA^^a>FJ_?BlL?9pry0viN&~sd@aMme~~AqFZ0yn1>wP5 z4R>aR!G~CXHLSIrE2s8ruZlm*Zen6$Vq#)qVq#+A^Wq)YTgZ)x1{IY60000GZx^prwfgF}}M_)$E)e-c?47?^B5T^vIy7~kIU^*agHv~~#xnZ)aC9=qI!!+yp}TcDUx~`vi+8HeTgN9Ynt0LD#_M;TO9u+z z2vy^Z(CdzzcAfvyi9LUdZ~e0|3;%g{pN_U6Tl|5qS*G&d`=;vsc+Z#1$^BZ$jp@5JXoJ{3 zu3(0wA6hPqD;{cpXH{rlA0yr%x34JLf$O36bk-$8`-;LHydG+Yvn~MvONIr^nJmx8x}e!_lz?Y}kCUA#G}m8Wf8`nE#(+x8$G#XpC4 zyij$p>FbMOI@98FMQFh?73FCR=9=%|UsEQe26Y*}Fn+8z zC19@F&%F}OdJdVKXEozbT;Kh7!T#!c4|f+7@UfQZu-b&VM?-hk023C2r>mdKI;Vst E05Sj@?f?J) literal 0 HcmV?d00001 diff --git a/ui/src/images/chevron-m-right.png b/ui/src/images/chevron-m-right.png new file mode 100644 index 0000000000000000000000000000000000000000..04bce90f0edf4e2130e5e83b22383777346cf950 GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9EO-XP4l)OOlRpde#$ zkh>GZx^prwfgF}}M_)$E)e-c?47?^xKT^vIy7~kGG>-#uCr1fF8bVM+d>V%^n z8rsX6GaJ2@wanzpNLw`ugl%?`P1XfpR0d;+_5|A``=?HLisny@4tI@MsNE2bGOXQ{=}>e z<9A!L_0+AhAGHZJ7P4!1N9s*~?zX0?;o_{*{O6YS2iP89xgu!8^27e2(H6m1_gUWF z+W&OpfwV)en#w;aC8~Z*yr3A;-xtHuutx9>OGA%f3~NJ<;2qWmAHf*51|7jWYz;hu zG3*TAINmWI@NRi{??cGf=T5F2A7Un~z5e&v%AP2{JoOlxD}u!x*#~CJr(RiXv`#Qq z*ol>48^=Q?hTxV7j18(zHy92GD3&mE$SKw^bjUO+F}U$xF+P*6bLIk z{_#M`;o8T8C%?1${{O;#`NxBYznlI=T>5zM;CI%W>p8_2%gEd8(N6k(^XHn!&VLzt zYfW^%{s{Q5mT_ah`SS}~8|rFS$T7$}%9h_GZx^prwfgF}}M_)$E)e-c@Na`!!5978G?-`=v#yW${m>|^xU5;kZz4TB2O?OA_ zu9B-fX1qBKXbUQEh&2*Ce*E-Pz5e{oHy3Rzv3qAOZ(eIZ!=jUE*So8k+x|SKBwkRmC1y$5pUShTKZT^Y^-OnvH;=J9b8TK}?Dsn^t@;Nx$=)k!FX8;i zy}>56Vxq2M4I?}I+vi3Cyux`?bsQh*zPRtQ$6DL}aMGc-LBgBQSS`3Fl)_bDI!z(8 zVf9*;olG&lsvcqwvNRpHF_>>}`Lm){FqhdsL9uM_*=6#d)>+Qn<>#^gxW8CW31eOu z=gnziJvEH4o^a1F%WkL?RS7X44FKC1fjLu~fJ*chJM z%l+rodQOv{zC1Co?pLUt`O}iuU$0+%)y{|->OkI|&HK0P`%{}|%LIyg22WQ%mvv4F FO#sf?@@xPA literal 0 HcmV?d00001 diff --git a/ui/src/images/circle-dash.png b/ui/src/images/circle-dash.png new file mode 100644 index 0000000000000000000000000000000000000000..464a8dce89ba8362cfb096fac97c473df5294d23 GIT binary patch literal 2462 zcmV;P31Rk$P)@~0drDELIAGL9O(c600d`2O+f$vv5yP3aNG&}1fk1R zqMDE)J!7a#374)6(=Ke_ZrAVa5t6MjZ{PjH9f124WPt_lZr{GQZ{NOs2T)Q{Qc_Y< zQc_Yv+R;5V{5$YS^S^8VVSi|5}Xj???(UP)dC* zgdDi;?+2aE&Ik%h;RMiX{i7)atSPOV*rN?d1u?)U9S99ybi2=vp+FQu0B<^7t;2Lw zXU7PHI2KwQb-SOOK+fbQ05UI=$>lnB#u|?FCgcH{E)B4Ic(B)poS3-)sN=`pEC(t?+ksJgu69GJGe^ht8$@APyO;m*FSDeajr}Oa;GRA?7 z+5B+pf%Fx59)E`Up`nz&e(Uz?Hy7up1IUm}HDL3D?R_*iZAiulZ}J5Hzf$Dy`)W|F zg7ND+oz9T{x7%&ACK!*QCZ$uqa$j#~0gc4wPRLI0;FB%Lh)e`-{!SOfOx?EQp!R|MF5dIA0I+!`LGC~03!1GBt;=eNC7k9vPZr+ zsyOOqQ97TXd!c&*GY2uiXPw|P)2bd4l6W0pTup#`oVKWLyS?sS`|RxOM<^I{PZ#HB z$G2Bj$tpA%U-^^LliyvO|Mx$TfJ6e=_+Wb-L%bhz+M~;4$P;k!APfu_G_O)OQ zDt+fKw^qOV^5XOiViJ1}2z>qVSHK9UQRg2XbowwyTn(=0jHaWCTfG@~K8QUBNN-H0 zXCXVEpnx2@sSg=VYZDXaibpIHWJU+TN49o>%`d*$xekg0G3SK(?Unamq51khL?o65 z;2k|>H0pP|dpj`a1kWI>-jNo1KaN)vSpXZYCy%Wzr}2|jW&x~OQ*r(F>y7{Gz&`Q3 z%gBMp$N~^TTQ5S3th`pYSwPQ1&tz+dn>ml8YC$9cknLxT{(g}bS!qGfgu%j3EzN3C zwIGrJthPTeJ-e`=xUSv-fKbgg0lo;Z1wio<+vrEX`DnUHvWOT{gpu3OM%YKDub8j} zfU|tKWO4LkNVyLS4u#FZss)Oz1$+~vwQXsBvdE)<3R4U2aVKMz09vgl)cK)5xX8Bu zZD_01(!}Jn0t1!+aAH{t`<(W0mtpiz3HGUJ-#QGd#W3(pkcLocD#47SFA`dR5&E&v zp@VjcRRBTChb6ngSDEI{6cN8-F+=DLapnQ506fnP?|k%rlBSN#BcBH*H`E*QyziS} z!72bc91;4t(yw4i5teyCYh4EmRsmq_rylwPLM+|rpMo9yGPHq&8(_h%0U#|uvcv+A zmIay8?|=mt>{uoekvQu4i|pwJ%;~KBxdxa6aUr;_H-rSd*;_Vw zn^|{0m}_XgKEZ3Y@!F68Rh=Xre0Bj?0&qzeV6Hb|?JZ|OqP<+=bKA2sa-~v9%u0f0 zt{5}AdaUg2G|626VDY6hCJ)W~6$KDLeqNNY#&fcVF$srnMq{X=4hisGpY~ew(1MX0 zTst<8Y|n1n$cGd(fQ|)00%#)hU3C*JDLu+Nn$$YJYTuzFF}I2mIdV3{Nt z@s7nMe5H%Aq9Isd1mnaow1MWG4Om2Q(G#X0)L8`eW4I@Ts z_B_HF{Wxc`SM}^rgaD^+X;O=GKw;jH-uQt%Nm;VO z*Fzgol3K)ibCCqVO3en7AOC!jCS-aRV|pym0TqZy0D$|N9cSyJ@og3&-PCsCW-0=U0j@=-Cnu#4l3atYhx6`t(8?O zfbkLv4B31Pq;)uLspeg;yT_`Rbp3B6gig>*Jm&>F%gmGo{=-($R?DWEJ9%z4U;i~? z(Ca?C2?9v`&SlCIBLy5MZb^^s8?5XjX!V{SJeaJ3sizl!+yTfb*!+T$awos+}Ee+C{>}{q3n9^!(??kTMpDi`_B_vN8eznF&&zd~kxq$a&M{^A6{)6ap#< + + + + + + + + diff --git a/ui/src/images/critical.png b/ui/src/images/critical.png new file mode 100644 index 0000000000000000000000000000000000000000..655699c3d1dab87a8b36ce0400069e9c75a36a6d GIT binary patch literal 636 zcmV-?0)zdDP)K~#7Ft(Cu1 z6G0Tmzqh#`xr;(f7<9%oI-`xwFjmCU(1~<90}U0m{w-SDQD9-G*u_%ON*%43kwVS^ zh5!MQ%idk?*!RNmBMA_0_{=1`+2p?a-M8<(Xs+wV=pt@-2&!Mv{&pgjMHf$#cC+9#n z3|{l4R4*U(tu2IM$ZI5OO;7d;%6Fe27d}GMG~|l~4CV9ZI^3)8VtaEFaU8>%s=%6i z-f_-5t9T`1w@Rf8#fa;}L+ZD;`58JDh3Z&Pxg*G#X_*)l)3R`5WQ6CfH}ia%g51$9 z>bgFVvwlu($6+zQ`UN8V_KUw5E)f-9?sf)>)E z8+u1jnG?8T1Z6xC1|iZC_&$$ZnnJx1&Bi{`B3qJ2ZL|Q9d3cXMc#S5~LZwKU8I?DINiP$7FE|-Vqu WkmuopQOq>}0000 + + + + + + + + diff --git a/ui/src/images/fullscreen.svg b/ui/src/images/fullscreen.svg new file mode 100644 index 0000000000..ee37f375ba --- /dev/null +++ b/ui/src/images/fullscreen.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ui/src/images/generator.svg b/ui/src/images/generator.svg new file mode 100644 index 0000000000..9b0927b996 --- /dev/null +++ b/ui/src/images/generator.svg @@ -0,0 +1,3 @@ + + + diff --git a/ui/src/images/graph-background.png b/ui/src/images/graph-background.png new file mode 100644 index 0000000000000000000000000000000000000000..82b267f22c305d49a2748ebcfbe6ad1417c0c329 GIT binary patch literal 516083 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 a6uZJ9BW~*xy0JjFGkCiCxvX literal 0 HcmV?d00001 diff --git a/ui/src/images/heart-fill.png b/ui/src/images/heart-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b03700093d0b0eee7191f0cc91aac83b26161a GIT binary patch literal 434 zcmV;j0ZsmiP)?KX6@0F0u}oI%O1X}ae?|KMVQQ{m#lPX1G%5_w%$j>jioRIxq8 z-T*m^LG*&d+okp;cMDV^LoOkT>>I3)dluBXSh1^@s607*qoM6N<$g39Z&r2qf` literal 0 HcmV?d00001 diff --git a/ui/src/images/heart-fill.svg b/ui/src/images/heart-fill.svg new file mode 100644 index 0000000000..78d7287d8c --- /dev/null +++ b/ui/src/images/heart-fill.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ui/src/images/icon.png b/ui/src/images/icon.png index 7b50794bdf7f9e91246a1fc1f3f7bce86c8d7f90..a5045956dd4a641a86031052d88a49b89084829f 100644 GIT binary patch literal 3689 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 Hu0mjf_*x8a literal 1891 zcmV-p2b}ncP)l|X87Xr-#;5F<{Mpx9E6m0}J(wm3cX*q8&DTby2s(?gvr7o2h{ zhnRDb9FznuP&-ngt*FQ%BoIXU-uLyfZZD$$vmsSPLX`nWb+{tN#h=wq!8-1D?lVo2Nff6PYLn|^d zCc_XTcmdL-2s*n*puI|~8!g0usb?{Md=dc>tN@w05!Peb5Dd2ym=M7TkSRrh&P(hl zj?KjYRujl23@D<*FTB@xma+N96Hz978Ru@Kp@_c`aBgmteL@ynf%=pfgGbZ_$js4@ zPho3OK<>n_mkZPc*qX*$coM<851?Vcb&V%dICpc@?aAIo0C#xEV>@7KXE6S;iAZB@BE_8mXJ=DrOqB7&Wr!cpKXz;^C^3mqfkf63ta{I>3Wi%7$k7UTk$S_=Ogs4&w? zhx8gv8$!TDx;v2Udke7xd$4cUj`j8ji!V@l^cBs{}=& zJzW_67eyiO|iD$p9~qNc74w!Pt$ge@?P*KaA=NT)p!QN{~%V-{vN<0Gc)k zA6Pf-?=!ku+Ik~hP)5`G?M)IVX!=_A(l8Dh@(sniioIVaW^a%Pphe+>Q$PI9=WsLC zYSs1i_H(N%FLCPfuYMh5OQ*`hU=%)}8!p=BY9f(3Dc}80mC+Lpza5rBJC< z*5C68@#r7;Bx-NyK!{MdYo=5xArkqo6UgX7p}>#H;AW`3`CM{}6cI?+An{)nmN0mD z?}qoy1`+Xi98*(MD3{BK#bVNP3A>;{5SjqA&~Xz9lF4L?@gfFYtRcK26TpBE;_vT8 z&?Jxaz$b>iK`ej?_b$5)Lq~!iu900G%oq3)*049o)&cWSgq&48gyBjgkL-sJS{5g= zDNunTK6^>ZkRL~A(w>8jhy~D0WdXwQ))urpRu;I8O=1D+S(B0<7z}X)5Q@{Q+HQk| zLqWv63XixAe|}IDxY({yE`Vkh;E^!GU(0tiR)yZEwcSi17eHYegc1JQkvjIam(vZ= z{vzjsisioX64H%RIU|sjTc+A8_){ zl*$fYxyMUec4(1fL1K`%m-!O%H7=7Q1K*1G5;>26e4@&np{t!2vhYXg?9qw&w#E~Y z?s|cgM50~)nxF|>Dow-q$f0G(Sy-nvOF8;#LqvNrk z9zyrt$qH@hWu>Wue-NbY2ojf4&JN*4Z%#Z~x$#F25@z8=unz2#11;S#lq(D*>AS%moE z@K=8#Xd1*0?ykQf<1es#^MHCuj6`Tm2U$2;zd1$PJshzU@8zSf;MI7-Urmsv0~_W2 z2loh1u@)?%M#P70h4}u{UeCri7F$Z?yC4LZzb?q|WYA^@8V#Tg3%L^-?cSjEgo?vl zTIM700Tc*g3Ka9RYTH&C(Id{^)Xb=AIO8d{SyQTF`xk(fnyM>n(-R6J&~_L2c>Z9) zH%;gpx4yU~m?%)gnR?3WocJ`;7A^h!}-?@x(Uk60GDfD3BBDGWw{?*=N><+U?Z z#c?Y_@$O%gCL8P)#@0WBjij+_58;+Y7Ja^CwMFQf=ids2LuMu$y>QDc+}7 zk(ph@+1ZWH#WOdf$jmLIe!OQcJX#6PjvlTNoQLf?qToyhE{+FX((#W!YN8+ub%D>&H4=5P|1p>CVR13 zCBAW+_lpScx5HeBwHV) + + diff --git a/ui/src/images/lock.svg b/ui/src/images/lock.svg new file mode 100644 index 0000000000..6b1f9953dc --- /dev/null +++ b/ui/src/images/lock.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ui/src/images/map.png b/ui/src/images/map.png new file mode 100644 index 0000000000000000000000000000000000000000..9f42904de44001e3215d0f1c516a37002555df2a GIT binary patch literal 1168 zcmV;B1aJF^P)S+Kk3fuSQQFm%NT5?}-gFoFaaK>~~*0Y;DjBS?S|B)|v~U<3)sfClEq zM-s+X z)eBg7J{CCV{JGRBh^)kxUp^IHlMk&P3djUy?_^rahX-E^uR02}3;O)~qH#PoHrnyJ z#b?dZ!oEX=c0uc3zBi7szl58&&+Ox-ydw7=-Dnq7{&n715m;t(7)Pnenqv<;sN}jgj6C5+{4Q2&4c^(b9fuV zuQDpM+-kG~`^&-kMWdwZy=c7o<7^($uO5W-ZXWN)eDKy|mKz+Y)60i!1tC~MSZ0`F zI1}N&>+==ioxU!}KM!g*B`0O|AmoC=jTn1V64J{j5rTM0+r)!mm_&T!%FjeeT0MyQ z^A`c;Lwf;6kN_h{fDt6X2ohif2{3{L7(oJzAOS{@fE0MuCGb243?a}-b&A`}^2r7d z7QnJ{aI5ifgIy73@;3f2yd5eB>6CqIw?lzf1h;1MyAV5Vs6$bu+q0UyGC*w=W~R#F zR|H!!ON*>c6^2(7D<^#N)pTBROD50tZs$dIX#s|Yn?B>#)}w9ek#;PQu25&ao{^%nw+i?oX`G zSYUUHZCO-2qKjZG=smV&QTvcLE&WL@wq;Q#$VXY(^%vW+s2AjeV*yyp5c$y;_1lA0 z)@O#~L6ba@%Px9s%c571kMvj&Uu?@lBgjYCpW=^gS!e|z*JHuTO@F#UU2MxjFUY4Z iD!s`i}@s}>buufuKXrL$5-XDmhV_F1YmW%CIO)ONXPz^uWPGBUI~-oneHPGBvOjKHz5WUPc{p(w<) z-rPFaYR%YiI&f~^f^+AlJpb7Hg>D#*wal*Fm&f4u8G_S4NJ`?86*nKkd-+`c-fTP= zzxQ~3cu%y`!6-w8&5eoc_5XS-DcVBKgCkjjDllu}&RK7WG=+Cu(GPaex#kK}QX zoz96_{`G}^_M}v1Ey{a|#C(zoPS0S1QHDNzKbAdHpfJCKSZf+A2u1n2Y@@Pd?*b)=G85%CL-F + + + + + + + + + diff --git a/ui/src/images/no-error.svg b/ui/src/images/no-error.svg new file mode 100644 index 0000000000..3a007222bc --- /dev/null +++ b/ui/src/images/no-error.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ui/src/images/pipeline.png b/ui/src/images/pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..2f80c7083c787d0a660f9f1eeade4e36e88a480b GIT binary patch literal 583 zcmV-N0=WH&P))STOgmU@|vZpwHj~Al)$c z?<<=pc;uM5wt}6dz~&Sl;R5)8oli^*7r+bbu7;P0Ul%T$z57-qjQ!MrUZlDy{9b{wr(6bMsZjW1mt%Au$R%wR- zPBO@mx|h$A1hS9$plN48Apnjrjs(pI3N5a4xa~TL)_; zyJhG9y&Q~fI}b^57=6yS2SCXg)o8Z(`L?M4C*U``E^F9#;|!iqFpig=<-K*&TYLon zEpVuM8QX;8D>1PL?V&@!WTaG VI`J$q-~I2wl`A`euv4@{CiF zTdS*co_2F@J$NtP`OmT?32&QIr8Ca0dogkU!rjq6uO@eU9{J(FU`@W#6&B`)EZ)DK zYq%*$bpEhRbxw6EzR1q!%q+0%%As=mQgL=B13h#Js{4ZeVZM11hMtN>U6bOr4W+ODAO3ZN^fU4dPJB>_brGz}(b zf{>!2B86UOF6m#}PN%(d&$P_%iQ58!U*??e+?&o=(1m;^fIHR}Y!q-|$FaO#fCgBg zCZF*$F;ONa()7B|is8JHVxo#5gjUeUY#0?g#{LR_hwmsjq83)uAc98FZYGE^XVnCI z{D~b_cIy;n=dB=KPUA?zvNq5k+g|r4Zv=5McYR@8*^w^g)GGy8b_y@olkfobf_ORk zSULd#xJ!YRX$14DStvxEpn7Zvp%$fO=f0q7Iq`Jz5=CQyyMp#Io9tI6T zZPoNR7IYUxAKR)CmR);6`o*?t_(Qstc4gNrNdMSY&42x=E@*gSTQyB%fi=Xjts194 zS@`hQhM^-q7`kEv2{3{L7(oJzAOS{@03%3%5hTC}5?}-gFoFc!g2(vB#<6y9y5sxB zt1=1~CG7nD1s(8SkZ&AYPhJbZuTU;wyLf>3(PvPiZHWcOClGrykNjNFkxGTsNOt5t*7pjA$j13(Eff?vzs_Tt?>E8`i64oa+t$ESVr} zODxU$PZhqZs4y`vKubZqDJQ0vYS%mGr=WtqNk5oFu~M#GKWF8%c7LWRxsu0UK?S*> z@YIX0@5hfmA$@uPD#!(Of)9!5;y2_>D0fz0Ez!sG&;hMdtnt1pIPuVF;M8a(h_9rkRmASaDDT5K+RZ_s!+h;) z{%9mIy$DLQ6U6V!QYT+(*PHA~~*0Y;DjBS?S`wjBch*u9~Z0xI@OeKX5$ zCI+9g%O`-FjEy2&G$|~t$M|LQcBuVK09T0J*zHhUOqu=v4Z9HAZ>Zys>!v!CEk*0Sy7CtC|*wdfE4L1nT_z(bcs#YpQ0EQs(t1X$-y@DHZm&xiI>wD zOYQ}?wuQGcyk*B@JJhbvbff>HDTZY%Xo+oE20PqD_p)mf+p@TGJdSQ-L6_K;#r*@8 zX#10<2P`#0F&0R~wk+xndGo42NyfG;>W>LjS9X2Hwk+PA#L343%L)&C^aU>`um-$1 zDhEwAGHBVk5ZkhNE2xU>Sm0u8%R(clinu?y9^10e3gTRk1ra79TzgGnY|BC~sLFNO gC72w)%Gj3WAA2{vVDN|EKmY&$07*qoM6N<$f`XzC?EnA( literal 0 HcmV?d00001 diff --git a/ui/src/images/reduce_vertex.png b/ui/src/images/reduce_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3a4460c2c7a6188499872230b950b3d20e62a1 GIT binary patch literal 677 zcmV;W0$TlvP)3_7NVGL7@h8zV(P>XYOQBH{BNn#s}<)Fqp+4>3>I@~Rz#Yq{rXSqhPWef-s*_SKcw&?T0Ynq(>`NB-JG%fZZr z2>V#Xb + + + + + + + + diff --git a/ui/src/images/sink.png b/ui/src/images/sink.png new file mode 100644 index 0000000000000000000000000000000000000000..424a2acd64cb7dffb141a95c3a433fc6bd564ea1 GIT binary patch literal 1687 zcmV;I259+-P))+qm_i^*OEryww6vig38Z!V(5ep&$wTY5ny&Og*F3bW z#H#H>LSAZpQky_*ODwbyP2Jj(2oY3BKST@NJP6eg{0heDJ+tmOyP4g)Gu}J18}Bd3 z?tJWI=kGb^f9}Y=1kwbr-|tZ#z}KL_3~@tiZ!kCmX#fF-Ip*^f>~QaBp>KWq{R$|7 z`)l{Ru5@-TfP=WeL8=@4_3kY975Zzcia$nxRJn=UTY9i!VKNjN2ZwMZg1im>Dun<> zO;w5?xkX%X+=;ZaRUk~KTvtw~LP!l*L4j_&>ys@4p)fh_oO+@VAN?N-U@Ooft`McG z|6E%q*nn_>)N}&sP6Rx_6DkzA!PgfI4uC*}38dL}>UG8%g42$>Kw3Hh34o1=Y74m9 zy!XtRS{KP4B!s*IHY2Jn;1WR=Y+E$k+JY?!v}M~C4Tt(Y+E!Y(~c>SQ?@OdRNI22 zHONWZ7EP*cfnfxtp>2yL@{sPZQQE}_l=ikQ8iV?zrC3JTwrC960+O+|Et-wCz)fq- zHIO_E4H&Xcy0bu%6e$n`DG&oG5CbU?11S&#DG&oG5CbU?11S&#DG&oU2xRY5B~V_v z7oMT7JM;2jad{c${+oxJlT$GD_cYAS&&QnqWN|Tgil0#5<9Sol(@C#gR9L8Ov(C4Q z5P|TEpRRsOy@~k!9x6ilzEV}3!RsS%btI%6M=?*ld_;YZ0-n8a(eV0*$_}X4kAl}a zd;TJbfP0Fe2+gNY#)z}HvZCGuzUt2_qe7V_kvQ?u$P4Zfgb|<*{hsf>hv6GznmBla zcn+ppdv_0*0aNh3H(%GbMT>)Q7YJ`6%J9uGxcW;d<~Z)d^g;9ymCAK7GI!?Ys@rym zgK!rpT4a%^5b>D3DW}9ixYr>4moB44cdIxl4#Hg^ebk^^scu$M0#?9U)>!+lW8xsL zeJ@l7fFrZvJG2m&K~8ogd(qYpl^;-l@cq*AO2QjN=hNJe{y_>q6D{~oh=T}8v8Il$ zhi(LK6derHrTNs!7^gELpEj2IbJQl&W^oYi5riyJcN(Pb6}ce-yB{x#IbQTwM6B`K zf5P2+_q6@`2>NUG9~d4R)3ytC?NUF7UAUbH5hx0#+vxZ>6>9{-b93O?U91i{keuvn zRXDW$D0+cV-1B|kLVkWOJiTX+x(`znBWwKjA7B@@3|6t@strg z13$oxiOr}vdawdcymSQY!uHYp;Pu$XktGmvp}!wyXf#H_PTVe$gb0-Ert|Z1W40HU z+1)grgToSikw%e@R#t#$xC?~E_p49+3BNoZkAluLdnXL35Vd)|pg1nmUrz*FhZ_3O z$1nfti5hi#T6fC=tud3apN==sz~$^NbsW%wSCx#ih34=aE%}=rusC%RI7R8 zHT5R&RWHs=I1HD5`WehJOFxJ1rl)~++xkH=Pq+$%Umnu{9V<~&hmMBAGAA* z#l_a4`PBO<6@0Uh>PEi;g20Hu-z<)$P%!+N{WomtF^AI#eI|_q*F=vzG6nfp4F*ym z22vmfQXmFWAO=z(22vmfQXmFWAO=}voz$t5^d+(23?Ky#YqNd44gLTfl+|qeIU5Qr zP*J*i+k*kz)MookjE07ueXeqV5Ty_Z*$>+h0$rOwEwud%K)#>?@?TEZ5u_? z5KX668Z|@l2a?WN^?uw`s}QB-krj%jlLA@3{`Suk&V)`nXLVw91bPk%R$k9o6GVDv~9CE8bNwC h(yjxGxJcVJ%l|>S1@In)2O0nX002ovPDHLkV1iGR5@i4Y literal 0 HcmV?d00001 diff --git a/ui/src/images/sink_vertex.png b/ui/src/images/sink_vertex.png new file mode 100644 index 0000000000000000000000000000000000000000..86f8c3fa16ae066404a64b7d78435d2d68223092 GIT binary patch literal 985 zcmV;~119{5P)9BEzI`Pw{^oNx&=I9Bdk{}9?)tu1887qPj zINDV6D{9E{t8Uhb5OjjEV=xNCAuJ;|Ju8d(KX^Z`ZyEs^9*F8;NX14X!pP0s*X8ONK@HX(D!UR_;mX50G1m2tcYZ4<1Z$}xa=hes8WUnXo8 zF@z`}6E+!Jf})`&h{MpG+XxmVD~6r)wZm#fW=6VPn)o$|knX{}n3$ZDhX$?D zxzP341qm|K(@i6WwA6<+69TcgT%sbMioK zS?P+1Ajpfvv=D1V451t{+Jusp$jnGX(WQ$hymSFRzdvBp|K2MSd=Ji_$d>um^X4t| zqU<56Dh=Q82tE({u_G}N+pUSK>^k~hN>6H4rWYj-Q79-xJ|V*6`znN3aYXbZt-nwh zSBZN5LiQjMMV@*!=!Gguf@bDsWrdv+p`e2xAq{Ph!rD`K-EAH6A__&jpnQr{m7&n{ z5QieNBa0?TU0SvC>P0!J3A$49R6N;w{D{UT6eJ$3v3c;Ay49d$k=rXWty%8Ozawi2FZA;h_!S=9N^ z@Q~NDl3zSY%!m%b2n@~hi}P1{8r`p>o9ck_i<>c^!&@H4#mFT>cw!b55Ed=JsElE% z=yu<2hfWMlVYN0vvlQ_;7Az#RjP+u8POTBtCQ`zcv0nZF5y_1Kcu?*%00000NkvXX Hu0mjfqVvhc literal 0 HcmV?d00001 diff --git a/ui/src/images/slider.png b/ui/src/images/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..be21369f9629893f54be7e6eb0820c67681f2e55 GIT binary patch literal 1175 zcmV;I1Zew-P)FE(Rppfh9Yjpvu5V9PGSN@B`!^1B}M@Oae z^K%IiGAzI=^6czP9vmDo#1Dx&Gs_*^7 zlCcKzNmLe519)+UPw(&VFZs(WA;i#u!ryR_h?4dF;5>1Be9TZvfoGXz6{eWhmj(w1 zBTJqjx4yojh7Sa!ZI{G^yR#!^UcXUSBj|d3#unttJqVZf4#S5V5L=MQ{QP_2x;u!^#`VX? z$5mbROaKw|0(XH9w|}+*{NzdO=a26VpZWahV<;lX867%J0TVU?>XA<*#v4AzI;>8038dHW@+%8v&w@h?SME z4W9{X6k}Qv-1815vGtpq8)1uT5skp^7RC_Fu!o48`Uexj21LkC0l9*6p4^?kR*|_N zUT8PGY<8A^lmM(NvM4kfP9F;#J}E$lj}pMWC2o8}R#-$GNc{3+HIYaZ`K7XypcinH zLPS(SZZtBizpTqD0<;%!&>*4;o*f{}m$mhYn&lXK_t4N#nwhXDftH7Hi(_MBDSvs* zY8397g3_|-@}iYs=rFv&=~eZ;8Ub_7zc{lQBo(y;IRq0U^Cu1jAL2DJ<60( z%r^tNlUWQNxrP~5%rLM`THQ2cjJM_V2A1GU@WLDu!n}g~)PRdfTxA%9lV~=TN|jC8 zu+A%ZLNd&3Gdave6NNBI#>*dOFtWP5A9$!w5=YrDTsa%!fd$kPgRlI#%>=W3AeQu1 pDSOF-0t9TKP66}Gx-Drx{s2g>Z(t!H2@(JR002ovPDHLkV1j$I9_au8 literal 0 HcmV?d00001 diff --git a/ui/src/images/source.png b/ui/src/images/source.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e372576eb0822776c2aaf1173f244c688e0418 GIT binary patch literal 1559 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 + + diff --git a/ui/src/images/unlock.svg b/ui/src/images/unlock.svg new file mode 100644 index 0000000000..8838106865 --- /dev/null +++ b/ui/src/images/unlock.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ui/src/images/warning-circle.png b/ui/src/images/warning-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..86de6beda2b673e5f5995e1c82818448cbb0b7ea GIT binary patch literal 648 zcmV;30(bq1P)3w z<3J4l*5=+*Lau^4I&fx=o4KdEs{p6~Iv{ia6%Z-_o*4cnp#nk&E`b@~0g`z6Rx8_U zVmskaGdsJsrSFrpk_>#Yn6{60hz@30M}`Cue!`-wRw>UZ_W@#Dn;y?^ArRmxw)l0M zKpiZWzFEWWQUnC=((7U2EimHwkncw3kN4D`GaAVHON4(#R55z5qcM%(J_VcfY=joE zr__yUW4PClL>284e2hn|hT!%LeR}~bi|4{a7u7ec@;DY-Vn~W#6WA;46rMlQi~qPo zHP*ED>>hj6T|rN59mX^7E+mlDWa`zd27Cz-5~fs9xAG`_1QV8_lME;MMb1eSkeYfO zO{rTQJYl0GFsyYaF^GcAl5KS~0vdGni<&}>)|Oj|lP zPqAV~_+rUZlnUu-(Y>%m?8tSyuGlF_ec4 zyZJqtioygp+7n|pTa>sOMFeYpX)}ekQvr8BrIh9VJ^xl6*9%5(t>-SKK6QRjx>*)h z+?+v3A}?@Eua8}q=Z&a3i55kodUN2l1c7ILZaY{k{{9}YS2u;*fBK=PMpDpKt5kX? i;@r8%;d{pWr^yRku;Lp<;Y76n0000 + + + + + diff --git a/ui/src/images/zoom-out.svg b/ui/src/images/zoom-out.svg new file mode 100644 index 0000000000..360111a1ee --- /dev/null +++ b/ui/src/images/zoom-out.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ui/src/index.tsx b/ui/src/index.tsx index 1df95da2d9..ed06c68627 100644 --- a/ui/src/index.tsx +++ b/ui/src/index.tsx @@ -13,6 +13,15 @@ const root = ReactDOM.createRoot( ); const theme = createTheme({ + breakpoints: { + values: { + xs: 0, + sm: 600, + md: 960, + lg: 1400, + xl: 1840, + }, + }, typography: { fontFamily: ["IBM Plex Sans"].join(","), }, diff --git a/ui/src/types/declarations/app.d.ts b/ui/src/types/declarations/app.d.ts new file mode 100644 index 0000000000..61a8e08606 --- /dev/null +++ b/ui/src/types/declarations/app.d.ts @@ -0,0 +1,11 @@ +export interface SystemInfo { + namespaced: boolean; + managedNamespace: string | undefined; +} + +export interface AppContextProps { + systemInfo: SystemInfo | undefined; + systemInfoError: any | undefined; + sidebarProps?: SlidingSideBarProps; + setSidebarProps?: (props: SlidingSideBarProps | undefined) => void; +} \ No newline at end of file diff --git a/ui/src/types/declarations/cluster.d.ts b/ui/src/types/declarations/cluster.d.ts new file mode 100644 index 0000000000..77e02033f8 --- /dev/null +++ b/ui/src/types/declarations/cluster.d.ts @@ -0,0 +1,50 @@ +export interface ClusterNamespaceSummary { + name: string; + pipelinesCount: number; + pipelinesActiveCount: number; + pipelinesInactiveCount: number; + pipelinesHealthyCount: number; + pipelinesWarningCount: number; + pipelinesCriticalCount: number; + isbsCount: number; + isbsActiveCount: number; + isbsInactiveCount: number; + isbsHealthyCount: number; + isbsWarningCount: number; + isbsCriticalCount: number; +} + +export interface ClusterSummaryData { + namespacesCount: number; + pipelinesCount: number; + pipelinesActiveCount: number; + pipelinesInactiveCount: number; + pipelinesHealthyCount: number; + pipelinesWarningCount: number; + pipelinesCriticalCount: number; + isbsCount: number; + isbsActiveCount: number; + isbsInactiveCount: number; + isbsHealthyCount: number; + isbsWarningCount: number; + isbsCriticalCount: number; + nameSpaceSummaries: ClusterNamespaceSummary[]; +} + +export interface ClusterSummaryFetchResult { + data?: ClusterSummaryData; + loading: boolean; + error: any; +} + +export interface ClusterSummaryFetchProps { + loadOnRefresh?: boolean; +} + +export interface ClusterNamespaceListingProps { + data: ClusterSummaryData; +} + +export interface NamespaceCardProps { + data: ClusterNamespaceSummary; +} diff --git a/ui/src/types/declarations/graph.d.ts b/ui/src/types/declarations/graph.d.ts index 423e3d8d76..da9681a2f2 100644 --- a/ui/src/types/declarations/graph.d.ts +++ b/ui/src/types/declarations/graph.d.ts @@ -1,3 +1,4 @@ +import { Dispatch, SetStateAction } from "react"; import { Edge, Node } from "reactflow"; import { GraphData, Pipeline } from "./pipeline"; @@ -20,3 +21,23 @@ export interface NodeInfoProps { namespaceId: string | undefined; pipelineId: string | undefined; } + +export interface FlowProps { + nodes: Node[]; + edges: Edge[]; + onNodesChange: any; + onEdgesChange: any; + handleNodeClick: (e: Element | EventType, node: Node) => void; + handleEdgeClick: (e: Element | EventType, edge: Edge) => void; + handlePaneClick: () => void; + setSidebarProps: Dispatch>; +} + +export interface HighlightContextProps { + sideInputNodes: Map; + sideInputEdges: Map; + highlightValues: { [key: string]: boolean }; + setHighlightValues: Dispatch>; + setHidden: Dispatch>; + handleNodeClick: (e: any, node: Node) => void; +} diff --git a/ui/src/types/declarations/namespace.d.ts b/ui/src/types/declarations/namespace.d.ts index 82f9492aac..fa9347fd98 100644 --- a/ui/src/types/declarations/namespace.d.ts +++ b/ui/src/types/declarations/namespace.d.ts @@ -1,3 +1,74 @@ -export interface NamespaceRowContentProps { - namespaceId: string; +import { PipelineData } from "../../components/pages/Namespace/partials/NamespacePipelineListing/PipelinesTypes"; + +export interface NamespacePipelineSummary { + name: string; + status: string; + // TODO spec +} + +export interface NamespaceSummaryData { + pipelinesCount: number; + pipelinesActiveCount: number; + pipelinesInactiveCount: number; + pipelinesHealthyCount: number; + pipelinesWarningCount: number; + pipelinesCriticalCount: number; + isbsCount: number; + isbsActiveCount: number; + isbsInactiveCount: number; + isbsHealthyCount: number; + isbsWarningCount: number; + isbsCriticalCount: number; + pipelineSummaries: NamespacePipelineSummary[]; + pipelineRawData?: any; + isbRawData?: any; +} + +export interface NamespaceSummaryFetchResult { + data?: NamespaceSummaryData; + pipelineRawData?: any; + isbRawData?: any; + loading: boolean; + error: any; +} + +export interface NamespaceSummaryFetchProps { + namespace: string; + loadOnRefresh?: boolean; +} +export interface PipelineCardProps { + namespace: string; + data: NamespacePipelineSummary; + statusData?: any; + isbData?: any; +} +export interface NamespacePipelineListingProps { + namespace: string; + data: NamespaceSummaryData; + pipelineData?: Map; + isbData?: any; +} + +export interface K8sEvent { + eventKey: number; + namespace: string; + timestamp: string; + type: string; + object: string; + reason: string; + message: string; +} + +export interface K8sEventSummary { + normalCount: number; + warningCount: number; + events: K8sEvent[]; +} +export interface NamespaceK8sEventsFetchProps { + namespace: string; +} +export interface NamespaceK8sEventsFetchResult { + data?: K8sEventSummary; + loading: boolean; + error: any; } diff --git a/ui/src/types/declarations/pipeline.d.ts b/ui/src/types/declarations/pipeline.d.ts index f879ba65c8..4d976912b8 100644 --- a/ui/src/types/declarations/pipeline.d.ts +++ b/ui/src/types/declarations/pipeline.d.ts @@ -44,6 +44,7 @@ export interface Pipeline { export interface Spec { vertices: PipelineVertex[]; edges: PipelineEdge[]; + sideInputs?: SideInput[]; watermark: any; } @@ -52,6 +53,7 @@ export interface PipelineVertex { source?: any; udf?: any; sink?: any; + sideInputs?: any[]; } export interface PipelineEdge { @@ -59,3 +61,95 @@ export interface PipelineEdge { to: string; conditions?: Conditions; } + +export interface SideInput { + name: string; + container: any; + trigger: any; +} + +export interface IsbSummary { + name: string; + status: string; + isbService: IsbService; +} + +export interface IsbService { + metadata: any; + spec: IsbServiceSpec; + status: IsbServiceStatus; +} + +export interface IsbServiceStatus { + conditions: any; + phase: string; +} + +export interface IsbServiceSpec { + jetstream?: Jetstream; +} + +export interface PipelineSummary { + name: string; + status: string; + lag?: number; + pipeline: Pipeline; +} + +export interface PipelineMergeSummaryData { + pipelineData: PipelineSummary; + isbData: IsbSummary; +} + +export interface PipelineSummaryFetchResult { + data?: PipelineMergeSummaryData; + loading: boolean; + error: any; +} + +export interface PipelineVertexMetric { + partition: number; + oneM: number; + fiveM: number; + fifteenM: number; +} + +export interface PipelineVertexMetrics { + vertexId: string; + metrics: PipelineVertexMetric[]; +} + +export interface PipelineVertexMetricsFetchResult { + data?: PipelineVertexMetrics[]; + loading: boolean; + error: any; +} + +export interface PiplelineVertexMetricsFetchProps { + namespace: string; + pipeline: string; + loadOnRefresh?: boolean; +} + +export interface PipelineWatermark { + partition: number; + watermark: number; + formattedWatermark: string; +} + +export interface PipelineWatermarks { + edgeId: string; + watermarks: PipelineWatermark[]; +} + +export interface PipelineWatermarksFetchResult { + data?: PipelineWatermarks[]; + loading: boolean; + error: any; +} + +export interface PipelineWatermarksFetchProps { + namespace: string; + pipeline: string; + loadOnRefresh?: boolean; +} diff --git a/ui/src/utils/fetchWrappers/clusterSummaryFetch.ts b/ui/src/utils/fetchWrappers/clusterSummaryFetch.ts new file mode 100644 index 0000000000..9026535400 --- /dev/null +++ b/ui/src/utils/fetchWrappers/clusterSummaryFetch.ts @@ -0,0 +1,362 @@ +import { useEffect, useState } from "react"; +import { useFetch, Options } from "./fetch"; +import { + ClusterNamespaceSummary, + ClusterSummaryData, + ClusterSummaryFetchProps, + ClusterSummaryFetchResult, +} from "../../types/declarations/cluster"; + +// const MOCK_DATA = [ +// { +// namespace: "my-ns", +// pipelineSummary: { +// active: { +// Healthy: 1, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 2, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 2, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 2, +// }, +// }, +// { +// namespace: "my-other-ns", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns1", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns2", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns3", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns4", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns5", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns6", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns7", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// { +// namespace: "my-other-ns8", +// pipelineSummary: { +// active: { +// Healthy: 5, +// Warning: 1, +// Critical: 1, +// }, +// inactive: 1, +// }, +// isbServiceSummary: { +// active: { +// Healthy: 5, +// Warning: 2, +// Critical: 2, +// }, +// inactive: 1, +// }, +// }, +// ]; + +const rawDataToClusterSummary = ( + rawData: any[] +): ClusterSummaryData | undefined => { + if (!rawData || !Array.isArray(rawData)) { + return undefined; + } + const namespacesCount = rawData.length; + let pipelinesCount = 0; + let pipelinesActiveCount = 0; + let pipelinesInactiveCount = 0; + let pipelinesHealthyCount = 0; + let pipelinesWarningCount = 0; + let pipelinesCriticalCount = 0; + let isbsCount = 0; + let isbsActiveCount = 0; + let isbsInactiveCount = 0; + let isbsHealthyCount = 0; + let isbsWarningCount = 0; + let isbsCriticalCount = 0; + const nameSpaceSummaries: ClusterNamespaceSummary[] = []; + + rawData.forEach((ns: any) => { + // Pipeline counts + const nsPipelinesHealthyCount = ns.pipelineSummary?.active?.Healthy || 0; + const nsPipelinesWarningCount = ns.pipelineSummary?.active?.Warning || 0; + const nsPipelinesCriticalCount = ns.pipelineSummary?.active?.Critical || 0; + const nsPipelinesActiveCount = + nsPipelinesHealthyCount + + nsPipelinesWarningCount + + nsPipelinesCriticalCount; + const nsPipelinesInactiveCount = ns.pipelineSummary?.inactive || 0; + const nsPipelinesCount = nsPipelinesActiveCount + nsPipelinesInactiveCount; + // ISB counts + const nsIsbsHealthyCount = ns.isbServiceSummary?.active?.Healthy || 0; + const nsIsbsWarningCount = ns.isbServiceSummary?.active?.Warning || 0; + const nsIsbsCriticalCount = ns.isbServiceSummary?.active?.Critical || 0; + const nsIsbsActiveCount = + nsIsbsHealthyCount + nsIsbsWarningCount + nsIsbsCriticalCount; + const nsIsbsInactiveCount = ns.isbServiceSummary?.inactive || 0; + const nsIsbsCount = nsIsbsActiveCount + nsIsbsInactiveCount; + // Add ns summary to array + nameSpaceSummaries.push({ + name: ns.namespace || DEFAULT_NS_NAME, + pipelinesCount: nsPipelinesCount, + pipelinesActiveCount: nsPipelinesActiveCount, + pipelinesInactiveCount: nsPipelinesInactiveCount, + pipelinesHealthyCount: nsPipelinesHealthyCount, + pipelinesWarningCount: nsPipelinesWarningCount, + pipelinesCriticalCount: nsPipelinesCriticalCount, + isbsCount: nsIsbsCount, + isbsActiveCount: nsIsbsActiveCount, + isbsInactiveCount: nsIsbsInactiveCount, + isbsHealthyCount: nsIsbsHealthyCount, + isbsWarningCount: nsIsbsWarningCount, + isbsCriticalCount: nsIsbsCriticalCount, + }); + // Add counts to cluster summary counts + pipelinesCount += nsPipelinesCount; + pipelinesActiveCount += nsPipelinesActiveCount; + pipelinesInactiveCount += nsPipelinesInactiveCount; + pipelinesHealthyCount += nsPipelinesHealthyCount; + pipelinesWarningCount += nsPipelinesWarningCount; + pipelinesCriticalCount += nsPipelinesCriticalCount; + isbsCount += nsIsbsCount; + isbsActiveCount += nsIsbsActiveCount; + isbsInactiveCount += nsIsbsInactiveCount; + isbsHealthyCount += nsIsbsHealthyCount; + isbsWarningCount += nsIsbsWarningCount; + isbsCriticalCount += nsIsbsCriticalCount; + }); + return { + namespacesCount, + pipelinesCount, + pipelinesActiveCount, + pipelinesInactiveCount, + pipelinesHealthyCount, + pipelinesWarningCount, + pipelinesCriticalCount, + isbsCount, + isbsActiveCount, + isbsInactiveCount, + isbsHealthyCount, + isbsWarningCount, + isbsCriticalCount, + nameSpaceSummaries, + }; +}; + +const DEFAULT_NS_NAME = "default"; +const DATA_REFRESH_INTERVAL = 60000; // ms + +export const useClusterSummaryFetch = ({ + loadOnRefresh = false, +}: ClusterSummaryFetchProps) => { + const [results, setResults] = useState({ + data: undefined, + loading: true, + error: undefined, + }); + const [options, setOptions] = useState({ + skip: false, + requestKey: "", + }); + const { + data: fetchData, + loading: fetchLoading, + error: fetchError, + } = useFetch("/api/v1/cluster-summary", undefined, options); + + useEffect(() => { + setInterval(() => { + setOptions({ + skip: false, + requestKey: "id" + Math.random().toString(16).slice(2), + }); + }, DATA_REFRESH_INTERVAL); + }, []); + + useEffect(() => { + if (fetchLoading) { + if (options?.requestKey === "" || loadOnRefresh) { + // Only set loading true when first load or when loadOnRefresh is true + setResults({ + data: undefined, + loading: true, + error: undefined, + }); + } + return; + } + if (fetchError) { + setResults({ + data: undefined, + loading: false, + error: fetchError, + }); + return; + } + if (fetchData && fetchData.errMsg) { + setResults({ + data: undefined, + loading: false, + error: fetchData.errMsg, + }); + return; + } + if (fetchData) { + // const clusterSummary = rawDataToClusterSummary(MOCK_DATA); // TODO REMOVE MOCK + const clusterSummary = rawDataToClusterSummary(fetchData.data); + setResults({ + data: clusterSummary, + loading: false, + error: undefined, + }); + return; + } + }, [fetchData, fetchLoading, fetchError, loadOnRefresh, options]); + + return results; +}; diff --git a/ui/src/utils/fetchWrappers/namespaceK8sEventsFetch.ts b/ui/src/utils/fetchWrappers/namespaceK8sEventsFetch.ts new file mode 100644 index 0000000000..3456142910 --- /dev/null +++ b/ui/src/utils/fetchWrappers/namespaceK8sEventsFetch.ts @@ -0,0 +1,138 @@ +import { useEffect, useState } from "react"; +import { useFetch, Options } from "./fetch"; +import { + K8sEvent, + K8sEventSummary, + NamespaceK8sEventsFetchProps, + NamespaceK8sEventsFetchResult, +} from "../../types/declarations/namespace"; + +// const MOCK_DATA = [ +// { +// apiVersion: "v1", +// count: 4, +// eventTime: null, +// firstTimestamp: "2023-09-11T19:16:47Z", +// involvedObject: { +// apiVersion: "iammanager.keikoproj.io/v1alpha1", +// kind: "Iamrole", +// name: "iamrole", +// namespace: "dev-log-usw2-dev", +// resourceVersion: "16504395", +// uid: "517e486c-a9a0-4cf7-bbdd-0269e12fe8b8", +// }, +// kind: "Event", +// lastTimestamp: "2023-09-11T21:15:45Z", +// message: "Successfully created/updated iam role", +// metadata: { +// creationTimestamp: "2023-09-11T21:15:45Z", +// name: "iamrole.1783ee37b9ff4d70", +// namespace: "dev-log-usw2-dev", +// resourceVersion: "16504414", +// uid: "a522d798-1bb5-4f46-aae0-71385e87fcd7", +// }, +// reason: "Ready", +// reportingComponent: "", +// reportingInstance: "", +// source: { +// component: "iam-manager", +// }, +// type: "Normal", +// }, +// ]; + +const rawDataToEventListing = ( + namespace: string, + rawData: any[] +): K8sEventSummary | undefined => { + if (!rawData || !Array.isArray(rawData)) { + return undefined; + } + const defaultValue = "none"; + let normalCount = 0; + let warningCount = 0; + const events: K8sEvent[] = []; + rawData.forEach((event, index) => { + if (event.type && event.type.toLowerCase() === "normal") { + normalCount++; + } else { + warningCount++; + } + events.push({ + eventKey: index, + namespace, + timestamp: event.timestamp + ? `${new Date(event.timestamp).toLocaleDateString()} ${new Date( + event.timestamp + ).toLocaleTimeString()}` + : defaultValue, + type: event.type || defaultValue, + object: event.object || defaultValue, + reason: event.reason || defaultValue, + message: event.message || defaultValue, + }); + }); + return { + normalCount, + warningCount, + events, + }; +}; + +export const useNamespaceK8sEventsFetch = ({ + namespace, +}: NamespaceK8sEventsFetchProps) => { + const [results, setResults] = useState({ + data: undefined, + loading: true, + error: undefined, + }); + const [options] = useState({ + skip: false, + requestKey: "", + }); + const { + data: fetchData, + loading: fetchLoading, + error: fetchError, + } = useFetch(`/api/v1/namespaces/${namespace}/events`, undefined, options); + + useEffect(() => { + if (fetchLoading) { + setResults({ + data: undefined, + loading: true, + error: undefined, + }); + return; + } + if (fetchError) { + setResults({ + data: undefined, + loading: false, + error: fetchError, + }); + return; + } + if (fetchData && fetchData.errMsg) { + setResults({ + data: undefined, + loading: false, + error: fetchData.errMsg, + }); + return; + } + if (fetchData) { + // const eventList = rawDataToEventListing(MOCK_DATA); // TODO REMOVE MOCK + const eventList = rawDataToEventListing(namespace, fetchData.data); + setResults({ + data: eventList, + loading: false, + error: undefined, + }); + return; + } + }, [namespace, fetchData, fetchLoading, fetchError]); + + return results; +}; diff --git a/ui/src/utils/fetchWrappers/namespaceSummaryFetch.ts b/ui/src/utils/fetchWrappers/namespaceSummaryFetch.ts new file mode 100644 index 0000000000..b91f5a8e65 --- /dev/null +++ b/ui/src/utils/fetchWrappers/namespaceSummaryFetch.ts @@ -0,0 +1,210 @@ +import { useEffect, useState } from "react"; +import { useFetch, Options } from "./fetch"; +import { + NamespacePipelineSummary, + NamespaceSummaryData, + NamespaceSummaryFetchProps, + NamespaceSummaryFetchResult, +} from "../../types/declarations/namespace"; + +const rawDataToNamespaceSummary = ( + rawPipelineData: any[], + rawIsbData: any[] +): NamespaceSummaryData | undefined => { + if ( + !rawPipelineData || + !Array.isArray(rawPipelineData) || + !rawIsbData || + !Array.isArray(rawIsbData) + ) { + return undefined; + } + const pipelinesCount = rawPipelineData.length; + let pipelinesActiveCount = 0; + let pipelinesInactiveCount = 0; + let pipelinesHealthyCount = 0; + let pipelinesWarningCount = 0; + let pipelinesCriticalCount = 0; + const isbsCount = rawIsbData.length; + let isbsActiveCount = 0; + let isbsInactiveCount = 0; + let isbsHealthyCount = 0; + let isbsWarningCount = 0; + let isbsCriticalCount = 0; + const pipelineSummaries: NamespacePipelineSummary[] = []; + rawPipelineData.forEach((pipeline: any) => { + switch (pipeline.status) { + case "healthy": + pipelinesActiveCount++; + pipelinesHealthyCount++; + break; + case "warning": + pipelinesActiveCount++; + pipelinesWarningCount++; + break; + case "critical": + pipelinesActiveCount++; + pipelinesCriticalCount++; + break; + case "inactive": + pipelinesInactiveCount++; + break; + default: + break; + } + // Add pipeline summary to array + pipelineSummaries.push({ + name: pipeline.name, + status: pipeline.status, + }); + }); + rawIsbData.forEach((isb: any) => { + switch (isb.status) { + case "healthy": + isbsActiveCount++; + isbsHealthyCount++; + break; + case "warning": + isbsActiveCount++; + isbsWarningCount++; + break; + case "critical": + isbsActiveCount++; + isbsCriticalCount++; + break; + case "inactive": + isbsInactiveCount++; + break; + default: + break; + } + }); + // TODO how to map ISB to pipeline? + return { + pipelinesCount, + pipelinesActiveCount, + pipelinesInactiveCount, + pipelinesHealthyCount, + pipelinesWarningCount, + pipelinesCriticalCount, + isbsCount, + isbsActiveCount, + isbsInactiveCount, + isbsHealthyCount, + isbsWarningCount, + isbsCriticalCount, + pipelineSummaries, + }; +}; + +const DATA_REFRESH_INTERVAL = 15000; // ms + +export const useNamespaceSummaryFetch = ({ + namespace, + loadOnRefresh = false, +}: NamespaceSummaryFetchProps) => { + const [results, setResults] = useState({ + data: undefined, + loading: true, + error: undefined, + }); + const [options, setOptions] = useState({ + skip: false, + requestKey: "", + }); + const { + data: pipelineData, + loading: pipelineLoading, + error: pipelineError, + } = useFetch( + `/api/v1/namespaces/${namespace}/pipelines`, + undefined, + options + ); + const { + data: isbData, + loading: isbLoading, + error: isbError, + } = useFetch( + `/api/v1/namespaces/${namespace}/isb-services`, + undefined, + options + ); + + useEffect(() => { + setInterval(() => { + setOptions({ + skip: false, + requestKey: "id" + Math.random().toString(16).slice(2), + }); + }, DATA_REFRESH_INTERVAL); + }, []); + + useEffect(() => { + if (pipelineLoading || isbLoading) { + if (options?.requestKey === "" || loadOnRefresh) { + // Only set loading true when first load or when loadOnRefresh is true + setResults({ + data: undefined, + loading: true, + error: undefined, + }); + } + return; + } + if (pipelineError || isbError) { + setResults({ + data: undefined, + loading: false, + error: pipelineError || isbError, + }); + return; + } + if (pipelineData?.errMsg || isbData?.errMsg) { + setResults({ + data: undefined, + loading: false, + error: pipelineData?.errMsg || isbData?.errMsg, + }); + return; + } + if (pipelineData && isbData) { + const pipeLineMap = pipelineData.data.reduce((map: any, obj: any) => { + map[obj.name] = obj; + return map; + }, {}); + const isbMap = isbData.data.reduce((map: any, obj: any) => { + map[obj.name] = obj; + return map; + }, {}); + // const nsSummary = rawDataToNamespaceSummary( + // // TODO REMOVE MOCK + // MOCK_PIPELINE_DATA, + // MOCK_ISB_DATA + // ); + const nsSummary = rawDataToNamespaceSummary( + pipelineData.data, + isbData.data + ); + setResults({ + data: nsSummary, + pipelineRawData: pipeLineMap, + isbRawData: isbMap, + loading: false, + error: undefined, + }); + return; + } + }, [ + pipelineData, + isbData, + pipelineLoading, + isbLoading, + pipelineError, + isbError, + loadOnRefresh, + options, + ]); + + return results; +}; diff --git a/ui/src/utils/fetchWrappers/pipelineFetch.ts b/ui/src/utils/fetchWrappers/pipelineFetch.ts new file mode 100644 index 0000000000..806faa604b --- /dev/null +++ b/ui/src/utils/fetchWrappers/pipelineFetch.ts @@ -0,0 +1,107 @@ +import { useEffect, useState } from "react"; +import { Options, useFetch } from "./fetch"; +import {PipelineSummaryFetchResult} from "../../types/declarations/pipeline"; + + +const DATA_REFRESH_INTERVAL = 15000; // ms + +// fetch pipeline summary and ISB summary +export const usePipelineSummaryFetch = ({ namespaceId, pipelineId }: any) => { + const [results, setResults] = useState({ + data: undefined, + loading: true, + error: undefined, + }); + const [isb, setIsb] = useState(null); + const [options, setOptions] = useState({ + skip: false, + requestKey: "", + }); + const { + data: pipelineData, + loading: pipelineLoading, + error: pipelineError, + } = useFetch( + `/api/v1/namespaces/${namespaceId}/pipelines/${pipelineId}`, + undefined, + options + ); + + const { + data: isbData, + loading: isbLoading, + error: isbError, + } = useFetch( + `/api/v1/namespaces/${namespaceId}/isb-services/${isb}`, + undefined, + isb ? options : { ...options, skip: true } + ); + + useEffect(() => { + setInterval(() => { + setOptions({ + skip: false, + requestKey: "id" + Math.random().toString(16).slice(2), + }); + }, DATA_REFRESH_INTERVAL); + }, []); + + useEffect(() => { + if (pipelineLoading || isbLoading) { + if (options?.requestKey === "") { + setResults({ + data: undefined, + loading: true, + error: undefined, + }); + } + return; + } + if (pipelineError || isbError) { + setResults({ + data: undefined, + loading: false, + error: pipelineError || isbError, + }); + return; + } + if (pipelineData?.errMsg || isbData?.errMsg) { + setResults({ + data: undefined, + loading: false, + error: pipelineData?.errMsg || isbData?.errMsg, + }); + return; + } + if (pipelineData) { + if (pipelineData.data?.data?.pipeline?.spec?.interStepBufferServiceName) { + setIsb( + pipelineData.data?.data?.pipeline?.spec?.interStepBufferServiceName + ); + } else { + setIsb("default"); + } + } + if (pipelineData && isbData) { + const pipelineSummary = { + pipelineData: pipelineData?.data, + isbData: isbData?.data, + }; + setResults({ + data: pipelineSummary, + loading: false, + error: undefined, + }); + return; + } + }, [ + pipelineData, + isbData, + pipelineLoading, + isbLoading, + pipelineError, + isbError, + options, + ]); + return results; +}; diff --git a/ui/src/utils/fetchWrappers/piplelineVertexMetricsFetch.ts b/ui/src/utils/fetchWrappers/piplelineVertexMetricsFetch.ts new file mode 100644 index 0000000000..9fad806423 --- /dev/null +++ b/ui/src/utils/fetchWrappers/piplelineVertexMetricsFetch.ts @@ -0,0 +1,99 @@ +import { useEffect, useState } from "react"; +import { useFetch, Options } from "./fetch"; +import { + PipelineVertexMetrics, + PipelineVertexMetricsFetchResult, + PiplelineVertexMetricsFetchProps, +} from "../../types/declarations/pipeline"; + +const rawDataToVertexMetrics = ( + rawData: any +): PipelineVertexMetrics[] | undefined => { + if (!rawData) { + return undefined; + } + return Object.keys(rawData).map((vertexId: string) => { + return { + vertexId, + metrics: rawData[vertexId].map((item: any, index: number) => { + return { + partition: index, + oneM: + item.processingRates && item.processingRates["1m"] + ?item.processingRates["1m"].toFixed(2) + : 0, + fiveM: + item.processingRates && item.processingRates["5m"] + ? item.processingRates["5m"].toFixed(2) + : 0, + fifteenM: + item.processingRates && item.processingRates["15m"] + ? item.processingRates["15m"].toFixed(2) + : 0, + }; + }), + }; + }); +}; + +export const usePiplelineVertexMetricsFetch = ({ + namespace, + pipeline, + loadOnRefresh = false, +}: PiplelineVertexMetricsFetchProps) => { + const [results, setResults] = useState({ + data: undefined, + loading: true, + error: undefined, + }); + const [options] = useState({ + skip: false, + requestKey: "", + }); + const { data, loading, error } = useFetch( + `/api/v1/namespaces/${namespace}/pipelines/${pipeline}/vertices/metrics`, + undefined, + options + ); + + useEffect(() => { + if (loading) { + if (options?.requestKey === "" || loadOnRefresh) { + // Only set loading true when first load or when loadOnRefresh is true + setResults({ + data: undefined, + loading: true, + error: undefined, + }); + } + return; + } + if (error) { + setResults({ + data: undefined, + loading: false, + error: error, + }); + return; + } + if (data?.errMsg) { + setResults({ + data: undefined, + loading: false, + error: data?.errMsg, + }); + return; + } + if (data) { + const result = rawDataToVertexMetrics(data.data); + setResults({ + data: result, + loading: false, + error: undefined, + }); + return; + } + }, [data, loading, error, loadOnRefresh, options]); + + return results; +}; diff --git a/ui/src/utils/fetchWrappers/piplelineWatermarksFetch.ts b/ui/src/utils/fetchWrappers/piplelineWatermarksFetch.ts new file mode 100644 index 0000000000..2cb9ce75d8 --- /dev/null +++ b/ui/src/utils/fetchWrappers/piplelineWatermarksFetch.ts @@ -0,0 +1,89 @@ +import { useEffect, useState } from "react"; +import { useFetch, Options } from "./fetch"; +import { + PipelineWatermarks, + PipelineWatermarksFetchResult, + PipelineWatermarksFetchProps, +} from "../../types/declarations/pipeline"; + +const rawDataToWatermarks = ( + rawData: any +): PipelineWatermarks[] | undefined => { + if (!rawData) { + return undefined; + } + return rawData.map((item: any) => { + return { + edgeId: item.edge, + watermarks: item.watermarks.map((watermark: number, index: number) => { + return { + partition: index, + watermark, + formattedWatermark: new Date(watermark).toISOString(), + } + }), + }; + }); +}; + +export const usePiplelineWatermarksFetch = ({ + namespace, + pipeline, + loadOnRefresh = false, +}: PipelineWatermarksFetchProps) => { + const [results, setResults] = useState({ + data: undefined, + loading: true, + error: undefined, + }); + const [options] = useState({ + skip: false, + requestKey: "", + }); + const { data, loading, error } = useFetch( + `/api/v1/namespaces/${namespace}/pipelines/${pipeline}/watermarks`, + undefined, + options + ); + + useEffect(() => { + if (loading) { + if (options?.requestKey === "" || loadOnRefresh) { + // Only set loading true when first load or when loadOnRefresh is true + setResults({ + data: undefined, + loading: true, + error: undefined, + }); + } + return; + } + if (error) { + setResults({ + data: undefined, + loading: false, + error: error, + }); + return; + } + if (data?.errMsg) { + setResults({ + data: undefined, + loading: false, + error: data?.errMsg, + }); + return; + } + if (data) { + const result = rawDataToWatermarks(data.data); + setResults({ + data: result, + loading: false, + error: undefined, + }); + return; + } + }, [data, loading, error, loadOnRefresh, options]); + + return results; +}; diff --git a/ui/src/utils/fetchWrappers/systemInfoFetch.ts b/ui/src/utils/fetchWrappers/systemInfoFetch.ts index 1a10256592..3bbef0bd48 100644 --- a/ui/src/utils/fetchWrappers/systemInfoFetch.ts +++ b/ui/src/utils/fetchWrappers/systemInfoFetch.ts @@ -3,16 +3,13 @@ import { SystemInfo } from "../models/systemInfo"; import { useFetch } from "./fetch"; export const useSystemInfoFetch = () => { - const [systemInfo, setSystemInfo] = useState(undefined); + const [systemInfo, setSystemInfo] = useState( + undefined + ); + const [errMsg, setErrMsg] = useState(""); const [loading, setLoading] = useState(true); - const { - data, - loading: fetchLoading, - error, - } = useFetch( - `/api/v1/sysinfo` - ); + const { data, loading: fetchLoading, error } = useFetch(`/api/v1/sysinfo`); useEffect(() => { if (fetchLoading) { @@ -21,14 +18,20 @@ export const useSystemInfoFetch = () => { } if (error) { setLoading(false); + setErrMsg("Failed to fetch the system info"); + return; + } + if (data?.errMsg) { + setLoading(false); + setErrMsg(data.errMsg); return; } if (data) { - setSystemInfo(data); + setSystemInfo(data?.data); setLoading(false); return; } }, [data, fetchLoading]); - return { systemInfo, error, loading }; + return { systemInfo, error: errMsg, loading }; }; diff --git a/ui/src/utils/fetchWrappers/vertex.ts b/ui/src/utils/fetchWrappers/vertex.ts new file mode 100644 index 0000000000..3456142910 --- /dev/null +++ b/ui/src/utils/fetchWrappers/vertex.ts @@ -0,0 +1,138 @@ +import { useEffect, useState } from "react"; +import { useFetch, Options } from "./fetch"; +import { + K8sEvent, + K8sEventSummary, + NamespaceK8sEventsFetchProps, + NamespaceK8sEventsFetchResult, +} from "../../types/declarations/namespace"; + +// const MOCK_DATA = [ +// { +// apiVersion: "v1", +// count: 4, +// eventTime: null, +// firstTimestamp: "2023-09-11T19:16:47Z", +// involvedObject: { +// apiVersion: "iammanager.keikoproj.io/v1alpha1", +// kind: "Iamrole", +// name: "iamrole", +// namespace: "dev-log-usw2-dev", +// resourceVersion: "16504395", +// uid: "517e486c-a9a0-4cf7-bbdd-0269e12fe8b8", +// }, +// kind: "Event", +// lastTimestamp: "2023-09-11T21:15:45Z", +// message: "Successfully created/updated iam role", +// metadata: { +// creationTimestamp: "2023-09-11T21:15:45Z", +// name: "iamrole.1783ee37b9ff4d70", +// namespace: "dev-log-usw2-dev", +// resourceVersion: "16504414", +// uid: "a522d798-1bb5-4f46-aae0-71385e87fcd7", +// }, +// reason: "Ready", +// reportingComponent: "", +// reportingInstance: "", +// source: { +// component: "iam-manager", +// }, +// type: "Normal", +// }, +// ]; + +const rawDataToEventListing = ( + namespace: string, + rawData: any[] +): K8sEventSummary | undefined => { + if (!rawData || !Array.isArray(rawData)) { + return undefined; + } + const defaultValue = "none"; + let normalCount = 0; + let warningCount = 0; + const events: K8sEvent[] = []; + rawData.forEach((event, index) => { + if (event.type && event.type.toLowerCase() === "normal") { + normalCount++; + } else { + warningCount++; + } + events.push({ + eventKey: index, + namespace, + timestamp: event.timestamp + ? `${new Date(event.timestamp).toLocaleDateString()} ${new Date( + event.timestamp + ).toLocaleTimeString()}` + : defaultValue, + type: event.type || defaultValue, + object: event.object || defaultValue, + reason: event.reason || defaultValue, + message: event.message || defaultValue, + }); + }); + return { + normalCount, + warningCount, + events, + }; +}; + +export const useNamespaceK8sEventsFetch = ({ + namespace, +}: NamespaceK8sEventsFetchProps) => { + const [results, setResults] = useState({ + data: undefined, + loading: true, + error: undefined, + }); + const [options] = useState({ + skip: false, + requestKey: "", + }); + const { + data: fetchData, + loading: fetchLoading, + error: fetchError, + } = useFetch(`/api/v1/namespaces/${namespace}/events`, undefined, options); + + useEffect(() => { + if (fetchLoading) { + setResults({ + data: undefined, + loading: true, + error: undefined, + }); + return; + } + if (fetchError) { + setResults({ + data: undefined, + loading: false, + error: fetchError, + }); + return; + } + if (fetchData && fetchData.errMsg) { + setResults({ + data: undefined, + loading: false, + error: fetchData.errMsg, + }); + return; + } + if (fetchData) { + // const eventList = rawDataToEventListing(MOCK_DATA); // TODO REMOVE MOCK + const eventList = rawDataToEventListing(namespace, fetchData.data); + setResults({ + data: eventList, + loading: false, + error: undefined, + }); + return; + } + }, [namespace, fetchData, fetchLoading, fetchError]); + + return results; +}; diff --git a/ui/src/utils/fetcherHooks/pipelineViewFetch.ts b/ui/src/utils/fetcherHooks/pipelineViewFetch.ts index ebead9cce7..d344fa18b8 100644 --- a/ui/src/utils/fetcherHooks/pipelineViewFetch.ts +++ b/ui/src/utils/fetcherHooks/pipelineViewFetch.ts @@ -48,29 +48,47 @@ export const usePipelineViewFetch = ( const BASE_API = `/api/v1/namespaces/${namespaceId}/pipelines/${pipelineId}`; - // call to get pipeline + // Call to get pipeline useEffect(() => { const fetchPipeline = async () => { try { const response = await fetch(`${BASE_API}?refreshKey=${requestKey}`); if (response.ok) { - const data = await response.json(); - setPipeline(data); - setNS_PL(`${data?.metadata?.namespace}-${data?.metadata?.name}-`); - if (!isEqual(spec, data?.spec)) setSpec(data?.spec); + const json = await response.json(); + if (json?.data) { + // Update pipeline state with data from the response + setPipeline(json.data?.pipeline); + // Update NS_PL state with metadata from the pipeline + setNS_PL( + `${json.data?.pipeline?.metadata?.namespace}-${json.data.pipeline?.metadata?.name}-` + ); + // Update spec state if it is not equal to the spec from the response + if (!isEqual(spec, json.data?.pipeline?.spec)) + setSpec(json.data?.pipeline?.spec); + } else if (json?.errMsg) { + // pipeline API call returns an error message + setPipelineErr([ + { + error: json.errMsg, + options: { toastId: "pipeline-fetch-error", autoClose: 5000 }, + }, + ]); + } } else { + // Handle the case when the response is not OK setPipelineErr([ { error: "Failed to fetch the pipeline details", - options: { toastId: "pl-details", autoClose: false }, + options: { toastId: "pipeline-fetch", autoClose: 5000 }, }, ]); } } catch { + // Handle any errors that occur during the fetch request setPipelineErr([ { error: "Failed to fetch the pipeline details", - options: { toastId: "pl-details", autoClose: false }, + options: { toastId: "pipeline-fetch", autoClose: 5000 }, }, ]); } @@ -79,29 +97,42 @@ export const usePipelineViewFetch = ( fetchPipeline(); }, [requestKey]); - // call to get buffers + // Call to get buffers useEffect(() => { const fetchBuffers = async () => { try { const response = await fetch( - `${BASE_API}/buffers?refreshKey=${requestKey}` + `${BASE_API}/isbs?refreshKey=${requestKey}` ); if (response.ok) { - const data = await response.json(); - setBuffers(data); + const json = await response.json(); + if (json?.data) { + // Update buffers state with data from the response + setBuffers(json.data); + } else if (json?.errMsg) { + // Buffer API call returns an error message + setBuffersErr([ + { + error: json.errMsg, + options: { toastId: "isb-fetch-error", autoClose: 5000 }, + }, + ]); + } } else { + // Handle the case when the response is not OK setBuffersErr([ { error: "Failed to fetch the pipeline buffers", - options: { toastId: "pl-buffer", autoClose: false }, + options: { toastId: "isb-fetch", autoClose: 5000 }, }, ]); } - } catch (e: any) { + } catch { + // Handle any errors that occur during the fetch request setBuffersErr([ { error: "Failed to fetch the pipeline buffers", - options: { toastId: "pl-buffer", autoClose: false }, + options: { toastId: "isb-fetch", autoClose: 5000 }, }, ]); } @@ -124,6 +155,7 @@ export const usePipelineViewFetch = ( const podsErr: any[] = []; if (spec?.vertices) { + // Fetch pods count for each vertex in parallel Promise.allSettled( spec.vertices.map((vertex: any) => { return fetch(`${BASE_API}/vertices/${vertex.name}/pods`) @@ -135,26 +167,43 @@ export const usePipelineViewFetch = ( } }) .then((json) => { - vertexToPodsMap.set(vertex.name, json.length); + if (json?.data) { + // Update vertexToPodsMap with the number of pods for the current vertex + vertexToPodsMap.set(vertex.name, json.data.length); + } else if (json?.errMsg) { + // Pods API call returns an error message + podsErr.push({ + error: json.errMsg, + options: { + toastId: `${vertex.name}-pods-fetch-error`, + autoClose: 5000, + }, + }); + } }); }) ) .then((results) => { results.forEach((result) => { if (result && result?.status === "rejected") { + // Handle rejected promises and add error messages to podsErr podsErr.push({ error: `${result.reason.response.status}: Failed to get pods count for ${result.reason.vertex} vertex`, options: { - toastId: `${result.reason.vertex}-pods`, + toastId: `${result.reason.vertex}-pods-fetch`, autoClose: 5000, }, }); } }); - if (podsErr.length > 0) setPodsErr(podsErr); + if (podsErr.length > 0) { + // Update podsErr state if there are any errors + setPodsErr(podsErr); + } }) .then(() => { if (!isEqual(vertexPods, vertexToPodsMap)) { + // Update vertexPods state if it is not equal to vertexToPodsMap setVertexPods(vertexToPodsMap); } }) @@ -167,81 +216,97 @@ export const usePipelineViewFetch = ( const metricsErr: any[] = []; if (spec?.vertices && vertexPods.size > 0) { - Promise.allSettled( - spec.vertices.map((vertex: any) => { - return fetch(`${BASE_API}/vertices/${vertex.name}/metrics`) - .then((response) => { - if (response.ok) { - return response.json(); - } else { - return Promise.reject({ response, vertex: vertex.name }); - } - }) - .then((json) => { - const vertexMetrics = { - ratePerMin: "0.00", - ratePerFiveMin: "0.00", - ratePerFifteenMin: "0.00", - podMetrics: [], - error: false, - } as VertexMetrics; - let ratePerMin = 0.0, - ratePerFiveMin = 0.0, - ratePerFifteenMin = 0.0; - // keeping processing rates as summation of pod values - json.forEach((pod: any) => { - if ("processingRates" in pod) { - if ("1m" in pod["processingRates"]) { - ratePerMin += pod["processingRates"]["1m"]; - } - if ("5m" in pod["processingRates"]) { - ratePerFiveMin += pod["processingRates"]["5m"]; - } - if ("15m" in pod["processingRates"]) { - ratePerFifteenMin += pod["processingRates"]["15m"]; - } - } else { - if ( - vertexPods.has(vertex.name) && - vertexPods.get(vertex.name) !== 0 - ) { - vertexMetrics.error = true; - metricsErr.push({ - error: `404: Failed to get metrics for ${vertex.name} vertex`, - options: { - toastId: `${vertex.name}-metrics`, - autoClose: 5000, - }, - }); + // Fetch metrics for all vertices together + Promise.allSettled([ + fetch(`${BASE_API}/vertices/metrics`) + .then((response) => { + if (response.ok) { + return response.json(); + } else { + return Promise.reject(response); + } + }) + .then((json) => { + if (json?.data) { + const vertices = json.data; + Object.values(vertices).forEach((vertex: any) => { + const vertexName = vertex[0].vertex; + const vertexMetrics = { + ratePerMin: "0.00", + ratePerFiveMin: "0.00", + ratePerFifteenMin: "0.00", + podMetrics: [], + error: false, + } as VertexMetrics; + let ratePerMin = 0.0, + ratePerFiveMin = 0.0, + ratePerFifteenMin = 0.0; + // Calculate processing rates as summation of pod values + vertex.forEach((pod: any) => { + if ("processingRates" in pod) { + if ("1m" in pod["processingRates"]) { + ratePerMin += pod["processingRates"]["1m"]; + } + if ("5m" in pod["processingRates"]) { + ratePerFiveMin += pod["processingRates"]["5m"]; + } + if ("15m" in pod["processingRates"]) { + ratePerFifteenMin += pod["processingRates"]["15m"]; + } + } else { + if ( + vertexPods.has(vertexName) && + vertexPods.get(vertexName) !== 0 + ) { + // Handle case when processingRates are not available for a vertex + vertexMetrics.error = true; + metricsErr.push({ + error: `Failed to get metrics for ${vertexName} vertex`, + options: { + toastId: `${vertexName}-metrics`, + autoClose: 5000, + }, + }); + } } + }); + vertexMetrics.ratePerMin = ratePerMin.toFixed(2); + vertexMetrics.ratePerFiveMin = ratePerFiveMin.toFixed(2); + vertexMetrics.ratePerFifteenMin = ratePerFifteenMin.toFixed(2); + if ( + vertexPods.has(vertexName) && + vertexPods.get(vertexName) !== 0 + ) { + vertexMetrics.podMetrics = json; } + vertexToMetricsMap.set(vertexName, vertexMetrics); }); - vertexMetrics.ratePerMin = ratePerMin.toFixed(2); - vertexMetrics.ratePerFiveMin = ratePerFiveMin.toFixed(2); - vertexMetrics.ratePerFifteenMin = ratePerFifteenMin.toFixed(2); - if ( - vertexPods.has(vertex.name) && - vertexPods.get(vertex.name) !== 0 - ) { - vertexMetrics.podMetrics = json; - } - vertexToMetricsMap.set(vertex.name, vertexMetrics); - }); - }) - ) - .then((results) => { - results.forEach((result) => { - if (result && result?.status === "rejected") { + } else if (json?.errMsg) { + // Metrics API call returns an error message metricsErr.push({ - error: `${result.reason.response.status}: Failed to get metrics for ${result.reason.vertex} vertex`, + error: json.errMsg, options: { - toastId: `${result.reason.vertex}-metrics`, + toastId: "vertex-metrics-fetch-error", autoClose: 5000, }, }); } + }), + ]) + .then((results) => { + results.forEach((result) => { + if (result && result?.status === "rejected") { + // Handle rejected promises and add error messages to metricsErr + metricsErr.push({ + error: `${result.reason.response.status}: Failed to get metrics for some vertices`, + options: { toastId: `vertex-metrics-fetch`, autoClose: 5000 }, + }); + } }); - if (metricsErr.length > 0) setMetricsErr(metricsErr); + if (metricsErr.length > 0) { + // Update metricsErr state if there are any errors + setMetricsErr(metricsErr); + } }) .then(() => setVertexMetrics(vertexToMetricsMap)) .catch(console.error); @@ -264,8 +329,10 @@ export const usePipelineViewFetch = ( if (spec?.edges) { if (spec?.watermark?.disabled === true) { + // Set edgeWatermark to empty map if watermark is disabled setEdgeWatermark(edgeToWatermarkMap); } else { + // Fetch watermarks for each edge together Promise.allSettled([ fetch(`${BASE_API}/watermarks`) .then((response) => { @@ -276,21 +343,33 @@ export const usePipelineViewFetch = ( } }) .then((json) => { - json.forEach((edge: any) => { - const edgeWatermark = {} as EdgeWatermark; - edgeWatermark.isWaterMarkEnabled = edge["isWatermarkEnabled"]; - edgeWatermark.watermarks = edge["watermarks"]; - edgeWatermark.WMFetchTime = Date.now(); - edgeToWatermarkMap.set(edge.edge, edgeWatermark); - }); + if (json?.data) { + json.data.forEach((edge: any) => { + const edgeWatermark = {} as EdgeWatermark; + edgeWatermark.isWaterMarkEnabled = edge["isWatermarkEnabled"]; + edgeWatermark.watermarks = edge["watermarks"]; + edgeWatermark.WMFetchTime = Date.now(); + edgeToWatermarkMap.set(edge.edge, edgeWatermark); + }); + } else if (json?.errMsg) { + // Watermarks API call returns an error message + watermarkErr.push({ + error: json.errMsg, + options: { + toastId: "watermarks-fetch-error", + autoClose: 5000, + }, + }); + } }), ]) .then((results) => { results.forEach((result) => { if (result && result?.status === "rejected") { + // Handle rejected promises and add error messages to watermarkErr watermarkErr.push({ error: `${result.reason.status}: Failed to get watermarks for some vertices`, - options: { toastId: "vertex-watermarks", autoClose: 5000 }, + options: { toastId: "watermarks-fetch", autoClose: 5000 }, }); } }); @@ -441,6 +520,21 @@ export const usePipelineViewFetch = ( newVertices.push(newNode); }); } + //creating side input nodes + if (spec?.sideInputs) { + spec.sideInputs.forEach((sideInput) => { + const newNode = {} as Node; + newNode.id = sideInput?.name; + newNode.data = { name: sideInput?.name }; + newNode.position = { x: 0, y: 0 }; + newNode.draggable = false; + newNode.type = "custom"; + newNode.data.nodeInfo = sideInput; + newNode.data.type = "sideInput"; + newNode.data.sideHandle = true; + newVertices.push(newNode); + }); + } return newVertices; }, [ spec, @@ -485,7 +579,7 @@ export const usePipelineViewFetch = ( type: MarkerType.Arrow, width: 15, height: 15, - color: "black", + color: edgeIsFull.get(edge?.to) ? "#DB334D" : "#8D9096", }; const pipelineEdge = { id, @@ -524,6 +618,50 @@ export const usePipelineViewFetch = ( newEdges.push(pipelineEdge); }); } + //creating side input edges + if (spec?.sideInputs && spec?.vertices) { + const generatorToVertexMap: { [key: string]: string[] } = {}; + const vertexToHandleMap: { [key: string]: string } = {}; + + spec.vertices.forEach((vertex) => { + if (vertex?.sideInputs) { + vertex?.sideInputs.forEach((sideInput) => { + if (!generatorToVertexMap[sideInput]) { + generatorToVertexMap[sideInput] = []; + } + generatorToVertexMap[sideInput].push(vertex?.name); + }); + } + }); + + spec.sideInputs.forEach((sideInput) => { + generatorToVertexMap[sideInput?.name]?.forEach((vertex) => { + const id = `${sideInput.name}-${vertex}`; + const pipelineEdge = { + id, + source: sideInput.name, + target: vertex, + data: { + source: sideInput.name, + target: vertex, + sideInputEdge: true, + }, + } as Edge; + pipelineEdge.animated = true; + pipelineEdge.type = "custom"; + pipelineEdge.sourceHandle = "2"; + if (vertex in vertexToHandleMap) { + const handleID = vertexToHandleMap[vertex]; + const idSplit = handleID.split("-"); + vertexToHandleMap[vertex] = "3-" + (Number(idSplit[1]) + 1); + } else { + vertexToHandleMap[vertex] = "3-0"; + } + pipelineEdge.targetHandle = vertexToHandleMap[vertex]; + newEdges.push(pipelineEdge); + }); + }); + } return newEdges; }, [ spec, diff --git a/ui/src/utils/fetcherHooks/podsViewFetch.ts b/ui/src/utils/fetcherHooks/podsViewFetch.ts index 1f346797ae..cfb400a65f 100644 --- a/ui/src/utils/fetcherHooks/podsViewFetch.ts +++ b/ui/src/utils/fetcherHooks/podsViewFetch.ts @@ -32,50 +32,63 @@ export const usePodsViewFetch = ( `/api/v1/namespaces/${namespaceId}/pipelines/${pipelineId}/vertices/${vertexId}/pods?refreshKey=${requestKey}` ); if (response.ok) { - const data = await response.json(); - const pList = data?.map((pod: any) => { - const containers: string[] = []; - const containerSpecMap = new Map(); - pod?.spec?.containers?.forEach((container: any) => { - const cpu = container?.resources?.requests?.cpu; - let cpuParsed: undefined | number; - if (cpu) { - try { - cpuParsed = Number(quantityToScalar(cpu)); - } catch (e) { - cpuParsed = undefined; + const json = await response.json(); + if (json?.data) { + const data = json?.data; + const pList = data?.map((pod: any) => { + const containers: string[] = []; + const containerSpecMap = new Map(); + pod?.spec?.containers?.forEach((container: any) => { + const cpu = container?.resources?.requests?.cpu; + let cpuParsed: undefined | number; + if (cpu) { + try { + cpuParsed = Number(quantityToScalar(cpu)); + } catch (e) { + cpuParsed = undefined; + } } - } - const memory = container?.resources?.requests?.memory; - let memoryParsed: undefined | number; - if (memory) { - try { - memoryParsed = Number(quantityToScalar(memory)); - } catch (e) { - memoryParsed = undefined; + const memory = container?.resources?.requests?.memory; + let memoryParsed: undefined | number; + if (memory) { + try { + memoryParsed = Number(quantityToScalar(memory)); + } catch (e) { + memoryParsed = undefined; + } } - } - containers.push(container?.name); - containerSpecMap.set(container?.name, { - name: container?.name, - cpu, - cpuParsed, - memory, - memoryParsed, + containers.push(container?.name); + containerSpecMap.set(container?.name, { + name: container?.name, + cpu, + cpuParsed, + memory, + memoryParsed, + }); }); + return { + name: pod?.metadata?.name, + containers, + containerSpecMap, + }; }); - return { - name: pod?.metadata?.name, - containers, - containerSpecMap, - }; - }); - setPods(pList); + setPods(pList); + } else if (json?.errMsg) { + setPodsErr([ + { + error: json.errMsg, + options: { + toastId: `${vertexId}-pod-fetch-error`, + autoClose: 5000, + }, + }, + ]); + } } else { setPodsErr([ { error: `Failed to get pods for ${vertexId} vertex`, - options: { toastId: `${vertexId}-pod`, autoClose: 5000 }, + options: { toastId: `${vertexId}-pod-fetch`, autoClose: 5000 }, }, ]); } @@ -83,7 +96,7 @@ export const usePodsViewFetch = ( setPodsErr([ { error: `Failed to get pods for ${vertexId} vertex`, - options: { toastId: `${vertexId}-pod`, autoClose: 5000 }, + options: { toastId: `${vertexId}-pod-fetch`, autoClose: 5000 }, }, ]); } @@ -109,50 +122,63 @@ export const usePodsViewFetch = ( `/api/v1/metrics/namespaces/${namespaceId}/pods?refreshKey=${requestKey}` ); if (response.ok) { - const data = await response.json(); - const podsMap = new Map(); - data?.forEach((pod: any) => { - const containerMap = new Map(); - pod?.containers?.forEach((c: any) => { - const cpu = c?.usage?.cpu; - let cpuParsed: undefined | number; - if (cpu) { - try { - cpuParsed = Number(quantityToScalar(cpu)); - } catch (e) { - cpuParsed = undefined; + const json = await response.json(); + if (json?.data) { + const data = json?.data; + const podsMap = new Map(); + data?.forEach((pod: any) => { + const containerMap = new Map(); + pod?.containers?.forEach((c: any) => { + const cpu = c?.usage?.cpu; + let cpuParsed: undefined | number; + if (cpu) { + try { + cpuParsed = Number(quantityToScalar(cpu)); + } catch (e) { + cpuParsed = undefined; + } } - } - const memory = c?.usage?.memory; - let memoryParsed: undefined | number; - if (memory) { - try { - memoryParsed = Number(quantityToScalar(memory)); - } catch (e) { - memoryParsed = undefined; + const memory = c?.usage?.memory; + let memoryParsed: undefined | number; + if (memory) { + try { + memoryParsed = Number(quantityToScalar(memory)); + } catch (e) { + memoryParsed = undefined; + } } - } - const container = { - name: c?.name, - cpu, - cpuParsed, - memory, - memoryParsed, + const container = { + name: c?.name, + cpu, + cpuParsed, + memory, + memoryParsed, + }; + containerMap.set(container.name, container); + }); + const podDetail = { + name: pod?.metadata?.name, + containerMap, }; - containerMap.set(container.name, container); + podsMap.set(podDetail.name, podDetail); }); - const podDetail = { - name: pod?.metadata?.name, - containerMap, - }; - podsMap.set(podDetail.name, podDetail); - }); - setPodsDetails(podsMap); + setPodsDetails(podsMap); + } else if (json?.errMsg) { + setPodsDetailsErr([ + { + error: json.errMsg, + options: { + toastId: `${vertexId}-pod-fetch-error`, + autoClose: 5000, + }, + }, + ]); + } } else { setPodsDetailsErr([ { error: `Failed to get pods details for ${vertexId} vertex`, - options: { toastId: `${vertexId}-pod`, autoClose: 5000 }, + options: { toastId: `${vertexId}-pod-fetch`, autoClose: 5000 }, }, ]); } @@ -160,7 +186,7 @@ export const usePodsViewFetch = ( setPodsDetailsErr([ { error: `Failed to get pods details for ${vertexId} vertex`, - options: { toastId: `${vertexId}-pod`, autoClose: 5000 }, + options: { toastId: `${vertexId}-pod-fetch`, autoClose: 5000 }, }, ]); } diff --git a/ui/src/utils/index.ts b/ui/src/utils/index.ts index b9e3816b24..a7285f9c76 100644 --- a/ui/src/utils/index.ts +++ b/ui/src/utils/index.ts @@ -1,4 +1,24 @@ import { Pod, PodDetail, ResourceUsage } from "../types/declarations/pods"; +import circleCheck from "../../src/images/checkmark-circle.png"; +import circleDash from "../../src/images/circle-dash.png"; +import heartFill from "../../src/images/heart-fill.png"; +import warning from "../../src/images/warning-circle.png"; +import critical from "../../src/images/critical.png"; +import moment from "moment"; + +// global constants +export const RUNNING = "Running"; +export const ACTIVE = "active"; +export const INACTIVE = "inactive"; +export const HEALTHY = "healthy"; +export const WARNING = "warning"; +export const CRITICAL = "critical"; +export const SUCCEEDED = "Succeeded"; +export const FAILED = "Failed"; +export const PENDING = "Pending"; +export const PAUSING = "Pausing"; +export const PAUSED = "Paused"; +export const DELETING = "Deleting"; export function getBaseHref(): string { if (window.__RUNTIME_CONFIG__?.BASE_HREF) { @@ -144,3 +164,75 @@ export function a11yProps(index: number) { "aria-controls": `info-tabpanel-${index}`, }; } + +// icon maps for each status +export const IconsStatusMap = { + [RUNNING]: circleCheck, + [SUCCEEDED]: circleCheck, + [FAILED]: circleCheck, + [PAUSING]: circleCheck, + [DELETING]: circleCheck, + [PENDING]: circleCheck, + [PAUSED]: circleCheck, + [ACTIVE]: circleCheck, + [INACTIVE]: circleDash, + [HEALTHY]: heartFill, + [WARNING]: warning, + [CRITICAL]: critical, +}; + +interface StatusStringType { + [index: string]: string; +} + +export const StatusString: StatusStringType = { + [RUNNING]: "Active", + [SUCCEEDED]: "Succeeded", + [FAILED]: "Failed", + [PENDING]: "Pending", + [PAUSING]: "Pausing", + [DELETING]: "Deleting", + [PAUSED]: "Paused", + [ACTIVE]: "Active", + [INACTIVE]: "Inactive", + [HEALTHY]: "Healthy", + [WARNING]: "Warning", + [CRITICAL]: "Critical", +}; + +export const ISBStatusString: StatusStringType = { + [RUNNING]: "Live", + [FAILED]: "Failed", + [PENDING]: "Pending", + [HEALTHY]: "Healthy", + [WARNING]: "Warning", + [CRITICAL]: "Critical", +}; + +// returns the duration string in the format of 1d 2hr 3min 4sec 5ms +export const DurationString = (duration: number): string => { + const diff = moment.duration(duration); + const years = diff.years(); + const months = diff.months(); + const days = diff.days(); + const hours = diff.hours(); + const minutes = diff.minutes(); + const seconds = diff.seconds(); + const milliseconds = diff.milliseconds(); + + if (years > 0) { + return `${years}yr ${months}mo`; + } else if (months > 0) { + return `${months}mo ${days}d`; + } else if (days > 0) { + return `${days}d ${hours}hr`; + } else if (hours > 0) { + return `${hours}hr ${minutes}min`; + } else if (minutes > 0) { + return `${minutes}min ${seconds}sec`; + } else if (seconds > 0) { + return `${seconds}sec ${milliseconds}ms`; + } else { + return `${milliseconds}ms`; + } +}; diff --git a/ui/yarn.lock b/ui/yarn.lock index bb49ec76e5..5d07d953de 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@adobe/css-tools@^4.0.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" @@ -36,303 +41,279 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" - integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== +"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" - integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.4" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.4" - "@babel/types" "^7.21.4" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/eslint-parser@^7.16.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz#d79e822050f2de65d7f368a076846e7184234af7" - integrity sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34" + integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" - semver "^6.3.0" + semver "^6.3.1" -"@babel/generator@^7.21.4", "@babel/generator@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" - integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== +"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.21.4" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" - integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz#3a017163dc3c2ba7deb9a7950849a9586ea24c18" - integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz#40411a8ab134258ad2cf3a3d987ec6aa0723cee5" - integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" + semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== - dependencies: - "@babel/types" "^7.21.0" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/types" "^7.22.5" -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" - integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-async-generator-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" -"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -340,59 +321,18 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-proposal-decorators@^7.16.4": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz#70e0c89fdcd7465c97593edb8f628ba6e4199d63" - integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.21.0" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz#66d9014173b3267a9ced3e69935138bc64ffb5c8" + integrity sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.10" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -400,7 +340,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.0", "@babel/plugin-proposal-numeric-separator@^7.18.6": +"@babel/plugin-proposal-numeric-separator@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== @@ -408,26 +348,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": +"@babel/plugin-proposal-optional-chaining@^7.16.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -436,7 +357,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": +"@babel/plugin-proposal-private-methods@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== @@ -444,23 +365,10 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -490,12 +398,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz#d2b3f31c3e86fa86e16bb540b7660c55bd7d0e78" - integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w== +"@babel/plugin-syntax-decorators@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" + integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -511,21 +419,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.18.6": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz#3e37fca4f06d93567c1cd9b75156422e90a67107" - integrity sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw== +"@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -539,12 +454,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -602,366 +517,499 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-arrow-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz#6aeca0adcb81dc627c8986e770bfaa4d9812aff5" - integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-flow" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" -"@babel/plugin-transform-for-of@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-commonjs@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz#b32a5556100d424b25e388dd689050d78396884d" - integrity sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" + integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" - integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.21.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.16.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" - integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" - integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.4.tgz#a952482e634a8dd8271a3fe5459a16eb10739c58" - integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" + integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== + dependencies: + "@babel/compat-data" "^7.22.20" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -971,124 +1019,139 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.20.7" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.20.7" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.21.0" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.20.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.4" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.19" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/preset-typescript@^7.16.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz#b913ac8e6aa8932e47c21b01b4368d8aa239a529" - integrity sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" + integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" - "@babel/plugin-transform-typescript" "^7.21.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-typescript" "^7.22.15" "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4", "@babel/traverse@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" - integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.4" - "@babel/types" "^7.21.4" +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.22.15", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.23.0", "@babel/traverse@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@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.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1207,117 +1270,117 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== -"@emotion/babel-plugin@^11.10.6": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" - integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ== +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" - stylis "4.1.3" + stylis "4.2.0" -"@emotion/cache@^11.10.5", "@emotion/cache@^11.10.7": - version "11.10.7" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.7.tgz#2e3b12d3c7c74db0a020ae79eefc52a1b03a6908" - integrity sha512-VLl1/2D6LOjH57Y8Vem1RoZ9haWF4jesHDGiHtKozDQuBIkJm2gimVo0I02sWCuzZtVACeixTVB4jeE8qvCBoQ== +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" "@emotion/hash@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/is-prop-valid@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== +"@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== dependencies: - "@emotion/memoize" "^0.8.0" + "@emotion/memoize" "^0.8.1" -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.9.0": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" - integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== + version "11.11.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.6" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" csstype "^3.0.2" -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== "@emotion/styled@^11.8.1": - version "11.10.6" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.6.tgz#d886afdc51ef4d66c787ebde848f3cc8b117ebba" - integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og== + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.6" - "@emotion/is-prop-valid" "^1.2.0" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -1326,10 +1389,10 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.0.tgz#f6f729b02feee2c749f57e334b7a1b5f40a81724" - integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" + integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -1346,14 +1409,14 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.2.tgz#01575e38707add677cf73ca1589abba8da899a02" - integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.1" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1361,15 +1424,42 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.39.0": - version "8.39.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" - integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== +"@eslint/js@8.50.0": + version "8.50.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484" + integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== + +"@floating-ui/core@^1.4.2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" + integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== + dependencies: + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/dom@^1.5.1": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" + integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== + dependencies: + "@floating-ui/core" "^1.4.2" + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/react-dom@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/utils@^0.1.3": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" + integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1478,12 +1568,12 @@ "@types/node" "*" jest-mock "^27.5.1" -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^29.4.3" + jest-get-type "^29.6.3" "@jest/fake-timers@^27.5.1": version "27.5.1" @@ -1544,12 +1634,12 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.27.8" "@jest/source-map@^27.5.1": version "27.5.1" @@ -1634,12 +1724,12 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -1655,41 +1745,36 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@juggle/resize-observer@^3.3.1": version "3.4.0" @@ -1765,6 +1850,20 @@ prop-types "^15.7.2" react-is "^16.8.0 || ^17.0.0" +"@monaco-editor/loader@^1.3.3": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" + integrity sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@^4.5.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.5.2.tgz#e8cc802203f729b423a998ea6fcb466604d61258" + integrity sha512-emcWu6vg1OpXPiYll4aPOaXe8bwYB4UaaNTwtArFLgMoNGBzRZb2Xn0Bra2HMIFM7QLgs7fCGunHO5LkfT2LBA== + dependencies: + "@monaco-editor/loader" "^1.3.3" + "@mswjs/cookies@^0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" @@ -1774,93 +1873,92 @@ set-cookie-parser "^2.4.6" "@mswjs/interceptors@^0.17.5": - version "0.17.9" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.9.tgz#0096fc88fea63ee42e36836acae8f4ae33651c04" - integrity sha512-4LVGt03RobMH/7ZrbHqRxQrS9cc2uh+iNKSj8UWr8M26A2i793ju+csaB5zaqYltqJmA2jUq4VeYfKmVqvsXQg== + version "0.17.10" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" + integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== dependencies: "@open-draft/until" "^1.0.3" "@types/debug" "^4.1.7" "@xmldom/xmldom" "^0.8.3" debug "^4.3.3" - headers-polyfill "^3.1.0" + headers-polyfill "3.2.5" outvariant "^1.2.1" strict-event-emitter "^0.2.4" web-encoding "^1.1.5" -"@mui/base@5.0.0-alpha.127": - version "5.0.0-alpha.127" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.127.tgz#bc61eaf1fd31094c939b6521cfea21643207c3b4" - integrity sha512-FoRQd0IOH9MnfyL5yXssyQRnC4vXI+1bwkU1idr+wNkP1ZfxE+JsThHcfl1dy5azLssVUGTtQFD9edQLdbyJog== +"@mui/base@5.0.0-beta.17": + version "5.0.0-beta.17" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.17.tgz#98b7ef6a3176b7aaf59ac8862d3271acb6876bc0" + integrity sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ== dependencies: - "@babel/runtime" "^7.21.0" - "@emotion/is-prop-valid" "^1.2.0" + "@babel/runtime" "^7.22.15" + "@floating-ui/react-dom" "^2.0.2" "@mui/types" "^7.2.4" - "@mui/utils" "^5.12.0" - "@popperjs/core" "^2.11.7" - clsx "^1.2.1" + "@mui/utils" "^5.14.11" + "@popperjs/core" "^2.11.8" + clsx "^2.0.0" prop-types "^15.8.1" - react-is "^18.2.0" -"@mui/core-downloads-tracker@^5.12.2": - version "5.12.2" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.12.2.tgz#4a0186d25b01d693171366e1c00de0e7c8c35f6a" - integrity sha512-Qn7dy8tql6T0hY6gTFPkpWlnqVVFGu5Z6QzEzUSzzmLZpfAx4kf8sFz0PHiB7gU5yrqcZF9picMx1shpRY/rXw== +"@mui/core-downloads-tracker@^5.14.11": + version "5.14.11" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.11.tgz#e829aceb5c0bbfc3383ed90a6a85445344dd65a7" + integrity sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q== "@mui/icons-material@^5.6.2": - version "5.11.16" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38" - integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A== + version "5.14.11" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.11.tgz#ce563d1b6c7abc76f8a8048c970135601e7b49b5" + integrity sha512-aHReLasBuS/+hhPzbZCgZ0eTcZ2QRnoC2WNK7XvdAf3l+LjC1flzjh6GWw1tZJ5NHnZ+bivdwtLFQ8XTR96JkA== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.22.15" "@mui/material@^5.6.3": - version "5.12.2" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.12.2.tgz#c3fcc94e523d9e673e2e045dfad04d12ab454a80" - integrity sha512-XOVy6fVC0rI2dEwDq/1s4Te2hewTUe6lznzeVnruyATGkdmM06WnHqkZOoLVIWo9hWwAxpcgTDcAIVpFtt1nrw== - dependencies: - "@babel/runtime" "^7.21.0" - "@mui/base" "5.0.0-alpha.127" - "@mui/core-downloads-tracker" "^5.12.2" - "@mui/system" "^5.12.1" + version "5.14.11" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.11.tgz#7537f07c383a6cfa32a00fabc9959593478bc5c4" + integrity sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A== + dependencies: + "@babel/runtime" "^7.22.15" + "@mui/base" "5.0.0-beta.17" + "@mui/core-downloads-tracker" "^5.14.11" + "@mui/system" "^5.14.11" "@mui/types" "^7.2.4" - "@mui/utils" "^5.12.0" - "@types/react-transition-group" "^4.4.5" - clsx "^1.2.1" + "@mui/utils" "^5.14.11" + "@types/react-transition-group" "^4.4.6" + clsx "^2.0.0" csstype "^3.1.2" prop-types "^15.8.1" react-is "^18.2.0" react-transition-group "^4.4.5" -"@mui/private-theming@^5.12.0": - version "5.12.0" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.12.0.tgz#5f1e6fd09b1447c387fdac1eef7f23efca5c6d69" - integrity sha512-w5dwMen1CUm1puAtubqxY9BIzrBxbOThsg2iWMvRJmWyJAPdf3Z583fPXpqeA2lhTW79uH2jajk5Ka4FuGlTPg== +"@mui/private-theming@^5.14.11": + version "5.14.11" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.11.tgz#1543b4d13d5cb32018c5bd41b516db1c33f70344" + integrity sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ== dependencies: - "@babel/runtime" "^7.21.0" - "@mui/utils" "^5.12.0" + "@babel/runtime" "^7.22.15" + "@mui/utils" "^5.14.11" prop-types "^15.8.1" -"@mui/styled-engine@^5.12.0": - version "5.12.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.12.0.tgz#44640cad961adcc9413ae32116237cd1c8f7ddb0" - integrity sha512-frh8L7CRnvD0RDmIqEv6jFeKQUIXqW90BaZ6OrxJ2j4kIsiVLu29Gss4SbBvvrWwwatR72sBmC3w1aG4fjp9mQ== +"@mui/styled-engine@^5.14.11": + version "5.14.11" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.11.tgz#22cb0047f211be4dbc133a5d1015369293bdff00" + integrity sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A== dependencies: - "@babel/runtime" "^7.21.0" - "@emotion/cache" "^11.10.7" + "@babel/runtime" "^7.22.15" + "@emotion/cache" "^11.11.0" csstype "^3.1.2" prop-types "^15.8.1" -"@mui/system@^5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.12.1.tgz#8452bc03159f0a6725b96bde1dee1316e308231b" - integrity sha512-Po+sicdV3bbRYXdU29XZaHPZrW7HUYUqU1qCu77GCCEMbahC756YpeyefdIYuPMUg0OdO3gKIUfDISBrkjJL+w== +"@mui/system@^5.14.11": + version "5.14.11" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.11.tgz#4f3aaf3e3d6d039e41a60f939056aa5fd371d291" + integrity sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA== dependencies: - "@babel/runtime" "^7.21.0" - "@mui/private-theming" "^5.12.0" - "@mui/styled-engine" "^5.12.0" + "@babel/runtime" "^7.22.15" + "@mui/private-theming" "^5.14.11" + "@mui/styled-engine" "^5.14.11" "@mui/types" "^7.2.4" - "@mui/utils" "^5.12.0" - clsx "^1.2.1" + "@mui/utils" "^5.14.11" + clsx "^2.0.0" csstype "^3.1.2" prop-types "^15.8.1" @@ -1869,14 +1967,13 @@ resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== -"@mui/utils@^5.12.0": - version "5.12.0" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.12.0.tgz#284db48b36ac26f3d34076379072c1dc8aed1ad0" - integrity sha512-RmQwgzF72p7Yr4+AAUO6j1v2uzt6wr7SWXn68KBsnfVpdOHyclCzH2lr/Xu6YOw9su4JRtdAIYfJFXsS6Cjkmw== +"@mui/utils@^5.14.11": + version "5.14.11" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.11.tgz#d19a1d8725ffd16c6c6817f00b5172931958fb9a" + integrity sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.22.15" "@types/prop-types" "^15.7.5" - "@types/react-is" "^16.7.1 || ^17.0.0" prop-types "^15.8.1" react-is "^18.2.0" @@ -1914,9 +2011,9 @@ integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.10" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" - integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== + version "0.5.11" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" + integrity sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ== dependencies: ansi-html-community "^0.0.8" common-path-prefix "^3.0.0" @@ -1928,32 +2025,33 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.11.7": - version "2.11.7" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" - integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@reactflow/background@11.2.0": - version "11.2.0" - resolved "https://registry.yarnpkg.com/@reactflow/background/-/background-11.2.0.tgz#2a6f89d4f4837d488629d32a2bd5f01708018115" - integrity sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w== +"@reactflow/background@11.3.2": + version "11.3.2" + resolved "https://registry.yarnpkg.com/@reactflow/background/-/background-11.3.2.tgz#84dcad8f79356f07a2a22c7d47af7253a8fa975c" + integrity sha512-KOy24lz9HpaBlx5KGcpQRsbMRWWkZdFyRxFq5RfPy6BnxDx0GFZ2o2igKKVutuo2bgCQdhaqzipcOUHlEAvnbQ== dependencies: - "@reactflow/core" "11.7.0" + "@reactflow/core" "11.9.2" classcat "^5.0.3" - zustand "^4.3.1" + zustand "^4.4.1" -"@reactflow/controls@11.1.11": - version "11.1.11" - resolved "https://registry.yarnpkg.com/@reactflow/controls/-/controls-11.1.11.tgz#d58e1bd9ddc2ee83fbf96130a7c54f44ca068c09" - integrity sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow== +"@reactflow/controls@11.2.2": + version "11.2.2" + resolved "https://registry.yarnpkg.com/@reactflow/controls/-/controls-11.2.2.tgz#b1e9f23760ea9deed1f8c28e11b6d3e00f8dd714" + integrity sha512-VuDxm9l0B4esXzRpzKRqH7Sc1Szj+KBV1bsswaOQWDbLlGKRtIZMXjdQ9BwBf+PMJD4ANrmnGEdHxFTL6NUpbg== dependencies: - "@reactflow/core" "11.7.0" + "@reactflow/core" "11.9.2" classcat "^5.0.3" + zustand "^4.4.1" -"@reactflow/core@11.7.0", "@reactflow/core@^11.6.0": - version "11.7.0" - resolved "https://registry.yarnpkg.com/@reactflow/core/-/core-11.7.0.tgz#6d9bdc0b1de1c9251dd3651135450ab2d42c6562" - integrity sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ== +"@reactflow/core@11.9.2": + version "11.9.2" + resolved "https://registry.yarnpkg.com/@reactflow/core/-/core-11.9.2.tgz#957f7186e591fe280736f54656be280b8954d471" + integrity sha512-/tiE8sPShzeWFnshvi8hc1lbp1C5PLgAFl94JQdBstq94uOBTpdoI//1MN4a+fGp1xwAUP7P0IcLuWqIDZgrZg== dependencies: "@types/d3" "^7.4.0" "@types/d3-drag" "^3.0.1" @@ -1963,45 +2061,45 @@ d3-drag "^3.0.0" d3-selection "^3.0.0" d3-zoom "^3.0.0" - zustand "^4.3.1" + zustand "^4.4.1" -"@reactflow/minimap@11.5.0": - version "11.5.0" - resolved "https://registry.yarnpkg.com/@reactflow/minimap/-/minimap-11.5.0.tgz#ddce263a41c2e65dd2febc09c26e93764ce76bfc" - integrity sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA== +"@reactflow/minimap@11.7.2": + version "11.7.2" + resolved "https://registry.yarnpkg.com/@reactflow/minimap/-/minimap-11.7.2.tgz#6d04761cb551eb9e2ab86f2d2f311521a641c90f" + integrity sha512-GqhJ0AoNhYf/GXI7JlWOR4THvi1nEcyo6sL6pGupJu8Ve1b8rpcTKNh4mXIerl8x0oRF8ajGvpIvh4R6rEtLoQ== dependencies: - "@reactflow/core" "11.7.0" + "@reactflow/core" "11.9.2" "@types/d3-selection" "^3.0.3" "@types/d3-zoom" "^3.0.1" classcat "^5.0.3" d3-selection "^3.0.0" d3-zoom "^3.0.0" - zustand "^4.3.1" + zustand "^4.4.1" -"@reactflow/node-resizer@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz#7764211a7e00f873eab652937cffba8df7c02b6a" - integrity sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg== +"@reactflow/node-resizer@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@reactflow/node-resizer/-/node-resizer-2.2.2.tgz#94fe44818cb1e739ea071b04a75fb5bd3360316b" + integrity sha512-p8fqfEtMdXVAEdAT74GVpMeIm2v2t92LObKPFvIbOaA11vmcp+jSt45y2mPD6CxP6snzEVHXigYmGZNiujDtlQ== dependencies: - "@reactflow/core" "^11.6.0" + "@reactflow/core" "11.9.2" classcat "^5.0.4" d3-drag "^3.0.0" d3-selection "^3.0.0" - zustand "^4.3.1" + zustand "^4.4.1" -"@reactflow/node-toolbar@1.1.11": - version "1.1.11" - resolved "https://registry.yarnpkg.com/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz#174b235d85de37cffba387af8f6fb315ec1d31d7" - integrity sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg== +"@reactflow/node-toolbar@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@reactflow/node-toolbar/-/node-toolbar-1.3.2.tgz#0424daf605eae098155fd2e8d549ab27bef18844" + integrity sha512-s8gP07HClKDidsBSrcljoK600cdVLLBK1gNK0bSVpCk3hBVKUkEGESwMf7VwpZ1oxhM3859R3pz++7lUrbmF3w== dependencies: - "@reactflow/core" "11.7.0" + "@reactflow/core" "11.9.2" classcat "^5.0.3" - zustand "^4.3.1" + zustand "^4.4.1" -"@remix-run/router@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.5.0.tgz#57618e57942a5f0131374a9fdb0167e25a117fdc" - integrity sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg== +"@remix-run/router@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6" + integrity sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2041,19 +2139,19 @@ picomatch "^2.2.2" "@rushstack/eslint-patch@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" - integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz#5f1b518ec5fa54437c0b7c4a821546c64fed6922" + integrity sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA== "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^1.7.0": version "1.8.6" @@ -2188,23 +2286,23 @@ loader-utils "^2.0.0" "@testing-library/dom@^8.5.0": - version "8.20.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" - integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^5.0.1" - aria-query "^5.0.0" + aria-query "5.1.3" chalk "^4.1.0" dom-accessibility-api "^0.5.9" - lz-string "^1.4.4" + lz-string "^1.5.0" pretty-format "^27.0.2" "@testing-library/jest-dom@^5.14.1": - version "5.16.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" - integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + version "5.17.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" + integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== dependencies: "@adobe/css-tools" "^4.0.1" "@babel/runtime" "^7.9.2" @@ -2243,14 +2341,14 @@ integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== "@types/aria-query@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" - integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.2.tgz#6f1225829d89794fd9f891989c9ce667422d7f64" + integrity sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2259,54 +2357,54 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.4.tgz#0fa6be6c182288831be8c31c35dab6d6ccac47c5" - integrity sha512-TLG7CsGZZmX9aDF78UuJxnNTfQyRUFU0OYIVyIblr0/wd/HvsIo8wmuB90CszeD2MtLLAE9Tt4cWvk+KVkyGIw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.3" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" + integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + version "3.5.11" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" + integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" + integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== dependencies: "@types/node" "*" @@ -2316,68 +2414,68 @@ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/d3-array@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" - integrity sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ== + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.8.tgz#a5d0687a12b48142c6f124d5e3796054e91bcea5" + integrity sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ== "@types/d3-axis@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.2.tgz#96e11d51256baf5bdb2fa73a17d302993e79df07" - integrity sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.4.tgz#0e1b380ca92b825f8b07402c8ba88b702e7de0b1" + integrity sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA== dependencies: "@types/d3-selection" "*" "@types/d3-brush@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.2.tgz#a610aad5a1e76c375be63e11c5eee1ed9fd2fb40" - integrity sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.4.tgz#dbbd71a980c7fd198771e4ae79ccba75debdc76f" + integrity sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q== dependencies: "@types/d3-selection" "*" "@types/d3-chord@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.2.tgz#cf6f05ad2d8faaad524e9e6f454b4fd06b200930" - integrity sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.4.tgz#7f2a3174bfa3dd94e0caa2111b8ce24d1dd2a5cd" + integrity sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg== "@types/d3-color@*": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.0.tgz#6594da178ded6c7c3842f3cc0ac84b156f12f2d4" - integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.1.tgz#43a2aa7836fdae19ce32fabe97742e787f4b2e08" + integrity sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg== "@types/d3-color@^1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.2.tgz#944f281d04a0f06e134ea96adbb68303515b2784" - integrity sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA== + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.3.tgz#147ef0d582ef7c0ee2b4e4a24b862af553dcc54b" + integrity sha512-jcHMwBcuuQ1LPt43jdbOhdOFczfDfhzvAZ1+1L0KiXPv4VqGsWAltxfxUDvtSuIMsvTZ2eeua+tOtxI6qqxYUg== "@types/d3-contour@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.2.tgz#d8a0e4d12ec14f7d2bb6e59f3fbc1a527457d0b2" - integrity sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.4.tgz#8e7cf6435000aaf9f1049267dcd67b18c9922b2e" + integrity sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA== dependencies: "@types/d3-array" "*" "@types/geojson" "*" "@types/d3-delaunay@*": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz#006b7bd838baec1511270cb900bf4fc377bbbf41" - integrity sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ== + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.2.tgz#ef2a4ae56058dee00ebce7f110806a4efdf56389" + integrity sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A== "@types/d3-dispatch@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz#b2fa80bab3bcead68680766e966f59cd6cb9a69f" - integrity sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.4.tgz#bac9eb26e49b235ac731a398b9596abc1fb76a3a" + integrity sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw== "@types/d3-drag@*", "@types/d3-drag@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.2.tgz#5562da3e7b33d782c2c1f9e65c5e91bb01ee82cf" - integrity sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.4.tgz#8d31aaf565b6b146d370eb511805c18541c1a748" + integrity sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g== dependencies: "@types/d3-selection" "*" "@types/d3-dsv@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.1.tgz#c51a3505cee42653454b74a00f8713dc3548c362" - integrity sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.4.tgz#f2706ed90f72e8c16d3858b3c3060dfd47b7f161" + integrity sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA== "@types/d3-ease@*": version "3.0.0" @@ -2385,45 +2483,45 @@ integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== "@types/d3-fetch@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.2.tgz#fe1f335243e07c9bd520c9a71756fed8330c54b1" - integrity sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.4.tgz#e54ab1286f859c8f0edb261c3ce4b155a3232c37" + integrity sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q== dependencies: "@types/d3-dsv" "*" "@types/d3-force@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.4.tgz#2d50bd2b695f709797e1745644f6bc123e6e5f5a" - integrity sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.6.tgz#7898d7fd2618fba65058ee83baaf7d79a8c047c5" + integrity sha512-G9wbOvCxkNlLrppoHLZ6oFpbm3z7ibfkXwLD8g5/4Aa7iTEV0Z7TQ0OL8UxAtvdOhCa2VZcSuqn1NQqyCEqmiw== "@types/d3-format@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.1.tgz#194f1317a499edd7e58766f96735bdc0216bb89d" - integrity sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.2.tgz#1416669e1ae3fd924bdbb6c80901be45f3a3cea6" + integrity sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA== "@types/d3-geo@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.3.tgz#535e5f24be13722964c52354301be09b752f5d6e" - integrity sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.0.5.tgz#4407202458b306c97c90c9a5271b3b7e1fc687af" + integrity sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ== dependencies: "@types/geojson" "*" "@types/d3-hierarchy@*": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b3a446b5437faededb30ac32b7cc0486559ab1e2" - integrity sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A== + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.4.tgz#4e0b6679895e3a0ce14b93d63ba158183801b776" + integrity sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ== "@types/d3-interpolate@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" - integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.2.tgz#b5928cca26fc20dbfe689ff37d62f7bac434c74e" + integrity sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow== dependencies: "@types/d3-color" "*" "@types/d3-interpolate@^1.3.1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" - integrity sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg== + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.3.tgz#a4d58d84b0b0feb5a6e25de4df4e1e9bb647bcb3" + integrity sha512-eosrP1F0BPnpok+3/dK12/ZusskELe2mZBJfuynIhTw6oCpNcBsVHEJ2dyfTMkm1mv+OX7vQ4G89sYqh9+jHWg== dependencies: "@types/d3-color" "^1" @@ -2443,9 +2541,9 @@ integrity sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw== "@types/d3-quadtree@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz#433112a178eb7df123aab2ce11c67f51cafe8ff5" - integrity sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.3.tgz#b6f03b436e7f023100f24fbee5f8c8821fc9b456" + integrity sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg== "@types/d3-random@*": version "3.0.1" @@ -2458,52 +2556,52 @@ integrity sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw== "@types/d3-scale@*": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.3.tgz#7a5780e934e52b6f63ad9c24b105e33dd58102b5" - integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.5.tgz#daa4faa5438315a37a1f5eb1bcdc5aeb3d3e5a2d" + integrity sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA== dependencies: "@types/d3-time" "*" "@types/d3-scale@^3.3.0": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" - integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.3.tgz#1b3310edd670fe14648102a109a1a2b74ddd01ba" + integrity sha512-B74S1KJnp5wCXGbTqdDLJkt20tCp++2WBja8L2sQwiA03U5qZ2W+nrYrJaRvpNOuxu9/xRmc6ksJRoLcEH7qKg== dependencies: "@types/d3-time" "^2" "@types/d3-selection@*", "@types/d3-selection@^3.0.2", "@types/d3-selection@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.5.tgz#27cd53b7672d405025e2414d98532d7934c16ebd" - integrity sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w== + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.7.tgz#c710b42de8dfa9f8927a3ed99c38ec3ce682bb8b" + integrity sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg== "@types/d3-shape@*": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.1.tgz#15cc497751dac31192d7aef4e67a8d2c62354b95" - integrity sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A== + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.3.tgz#20eee7aad70f2562041af18e305fec6b48fd511d" + integrity sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw== dependencies: "@types/d3-path" "*" "@types/d3-shape@^1.3.1": - version "1.3.8" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.8.tgz#c3c15ec7436b4ce24e38de517586850f1fea8e89" - integrity sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg== + version "1.3.9" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.9.tgz#8d73985ae354eecbaca48a300fd362aeec453209" + integrity sha512-NX8FSlYqN4MPjiOwJAu5a3y6iEj7lS8nb8zP5dQpHOWh24vMJLTXno7c7wm72SfTFNAalfvZVsatMUrEa686gg== dependencies: "@types/d3-path" "^1" "@types/d3-time-format@*": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.0.tgz#ee7b6e798f8deb2d9640675f8811d0253aaa1946" - integrity sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.1.tgz#c47d933c2998ddc61a3133da64c0b8f0a5ecdefa" + integrity sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q== "@types/d3-time@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" - integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.1.tgz#f0c8f9037632cc4511ae55e7e1459dcb95fb3619" + integrity sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA== "@types/d3-time@^2", "@types/d3-time@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" - integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.2.tgz#0f8d3ef08902b387dbb56ef257d30bcb10ced8f1" + integrity sha512-jupLabYMmJ1+qW0kHYhFzddsJ20f+M/HC0yJ5YWkG9wbka4QM8GQZ7Krd3Wz0V6cWz7Na951T/VMLNNWr9eBPg== "@types/d3-timer@*": version "3.0.0" @@ -2511,24 +2609,24 @@ integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== "@types/d3-transition@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.3.tgz#d4ac37d08703fb039c87f92851a598ba77400402" - integrity sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.5.tgz#354e8c60650c76c2249cd7b99055b344672c71aa" + integrity sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg== dependencies: "@types/d3-selection" "*" "@types/d3-zoom@*", "@types/d3-zoom@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.2.tgz#067aa6a6ecbc75a78b753cc6f7a7f9f7e4e7d117" - integrity sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.5.tgz#3cc09d38add8231ecaa710ec053e876896e9b865" + integrity sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ== dependencies: "@types/d3-interpolate" "*" "@types/d3-selection" "*" "@types/d3@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.0.tgz#fc5cac5b1756fc592a3cf1f3dc881bf08225f515" - integrity sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA== + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.1.tgz#0168b616fa551d99e4534d0cbdeb50844c92b597" + integrity sha512-lBpYmbHTCtFKO1DB1R7E9dXp9/g1F3JXSGOF7iKPZ+wRmYg/Q6tCRHODGOc5Qk25fJRe2PI60EDRf2HLPUncMA== dependencies: "@types/d3-array" "*" "@types/d3-axis" "*" @@ -2562,37 +2660,37 @@ "@types/d3-zoom" "*" "@types/dagre@^0.7.47": - version "0.7.48" - resolved "https://registry.yarnpkg.com/@types/dagre/-/dagre-0.7.48.tgz#e3ff1962df959c22af44d58d4275d35bd9309043" - integrity sha512-rF3yXSwHIrDxEkN6edCE4TXknb5YSEpiXfLaspw1I08grC49ZFuAVGOQCmZGIuLUGoFgcqGlUFBL/XrpgYpQgw== + version "0.7.50" + resolved "https://registry.yarnpkg.com/@types/dagre/-/dagre-0.7.50.tgz#0c49746a0b3c63b75c4d1f5031fad522cf852a62" + integrity sha512-3HxPUil6GwbcO+q3WxZhM6XMSXYaiXjjzKUDYsGk2tqP5Ko2WpN71I8g1kXLgX5nUkKg00+LlCTuaverWVADGA== "@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" + integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.5" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" + integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" - integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + version "8.44.3" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" + integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" + integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== "@types/estree@0.0.39": version "0.0.39" @@ -2600,18 +2698,19 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + version "4.17.37" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" + integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" + integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -2619,14 +2718,14 @@ "@types/serve-static" "*" "@types/geojson@*": - version "7946.0.10" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" - integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== + version "7946.0.11" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.11.tgz#012c17cb2256ad8de78560da851ab914a7b9b40e" + integrity sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg== "@types/graceful-fs@^4.1.2": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" + integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== dependencies: "@types/node" "*" @@ -2635,10 +2734,15 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== +"@types/http-errors@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + "@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + version "1.17.12" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" + integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== dependencies: "@types/node" "*" @@ -2648,23 +2752,23 @@ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" + integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" + integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.5.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" - integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== + version "29.5.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" + integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2683,44 +2787,44 @@ integrity sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g== "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/lodash@^4.14.172": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== - -"@types/lodash@^4.14.195": - version "4.14.195" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" - integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== +"@types/lodash@^4.14.172", "@types/lodash@^4.14.195": + version "4.14.199" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" + integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" + integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== + +"@types/mime@^1": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" + integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.32" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" + integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== "@types/node@*": - version "18.16.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.1.tgz#5db121e9c5352925bb1f1b892c4ae620e3526799" - integrity sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA== + version "20.8.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.1.tgz#53452f1c4a6d88b9ab1b8a9cb190c41d52bafc23" + integrity sha512-iN6stS2QGMl50pjH0h/dIfmcEUogljAreQZ+cubPw3ISWp5fJrZw9NOh/sDHJfw92A41hCU+Ls5zTIsNYzcnuA== "@types/node@^16.7.13": - version "16.18.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.25.tgz#8863940fefa1234d3fcac7a4b7a48a6c992d67af" - integrity sha512-rUDO6s9Q/El1R1I21HG4qw/LstTHCPO/oQNAwI/4b2f9EWvMnqt4d3HJwPMawfZ3UvodB8516Yg+VAq54YM+eA== + version "16.18.56" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.56.tgz#a832bc19d7bd1ed6c830325b02f1688a89dd8216" + integrity sha512-QghPNEY/qYeP5YuCPIE1bVMFiPBSjFCCoX5cjmNtFIdbKeuzboupgjz05mA4C6SXHyRLLTlQ3pbRIfnLqwaekA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2728,71 +2832,55 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*", "@types/prop-types@^15.7.5": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.8" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" + integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== "@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + version "1.5.6" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.6.tgz#a6edffe8283910e46dc7a573621f928e6b47fa56" + integrity sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ== "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.8" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.5.tgz#38bd1733ae299620771bd414837ade2e57757498" + integrity sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== "@types/react-dom@*", "@types/react-dom@^18.0.0": - version "18.2.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.1.tgz#663b2612feb5f6431a70207430d7c04881b87f29" - integrity sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w== + version "18.2.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.8.tgz#338f1b0a646c9f10e0a97208c1d26b9f473dffd6" + integrity sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw== dependencies: "@types/react" "*" -"@types/react-is@^16.7.1 || ^17.0.0": - version "17.0.4" - resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.4.tgz#3cccd02851f7f7a75b21d6e922da26bc7f8f44ad" - integrity sha512-FLzd0K9pnaEvKz4D1vYxK9JmgQPiGk1lu23o1kqGsLeT0iPbRSF7b76+S5T9fD8aRa0B8bY7I/3DebEj+1ysBA== - dependencies: - "@types/react" "^17" - "@types/react-test-renderer@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz#7b7f69ca98821ea5501b21ba24ea7b6139da2243" - integrity sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ== + version "18.0.3" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.3.tgz#67922bf5e5f0096581b1efd67dcdeabdd400cfea" + integrity sha512-4wcNLnY6nIT+L6g94CpzL4CXX2P18JvKPU9CDlaHr3DnbP3GiaQLhDotJqjWlVqOcE4UhLRjp0MtxqwuNKONnA== dependencies: "@types/react" "*" -"@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.5": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== +"@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.6": + version "4.4.7" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.7.tgz#bf69f269d74aa78b99097673ca6dd6824a68ef1c" + integrity sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.0": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^17": - version "17.0.58" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.58.tgz#c8bbc82114e5c29001548ebe8ed6c4ba4d3c9fb0" - integrity sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A== + version "18.2.24" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.24.tgz#3c7d68c02e0205a472f04abe4a0c1df35d995c05" + integrity sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2811,41 +2899,50 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + version "0.16.4" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" + integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== + +"@types/send@*": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" + integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== + dependencies: + "@types/mime" "^1" + "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.2" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.2.tgz#cb26e775678a8526b73a5d980a147518740aaecd" + integrity sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + version "1.15.3" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" + integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== dependencies: + "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/set-cookie-parser@^2.4.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz#b6a955219b54151bfebd4521170723df5e13caad" - integrity sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.4.tgz#3c36c9147960cca0fc7c508aacb18ea41f6b5003" + integrity sha512-xCfTC/eL/GmvMC24b42qJpYSTdCIBwWcfskDF80ztXtnU6pKXyvuZP2EConb2K9ps0s7gMhCa0P1foy7wiItMA== dependencies: "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.34" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.34.tgz#43e10e549b36d2ba2589278f00f81b5d7ccda167" + integrity sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g== dependencies: "@types/node" "*" @@ -2855,132 +2952,132 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/testing-library__jest-dom@^5.9.1": - version "5.14.5" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" - integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== + version "5.14.9" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" + integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== dependencies: "@types/jest" "*" "@types/trusted-types@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" - integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" + integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== +"@types/ws@^8.5.5": + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" + integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== "@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + version "16.0.6" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.6.tgz#cc0c63684d68d23498cf0b5f32aa4c3fb437c638" + integrity sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.26" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.26.tgz#388e5002a8b284ad7b4599ba89920a6d74d8d79a" + integrity sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.20.0", "@typescript-eslint/eslint-plugin@^5.5.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz#9b09ee1541bff1d2cebdcb87e7ce4a4003acde08" - integrity sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.1" - "@typescript-eslint/type-utils" "5.59.1" - "@typescript-eslint/utils" "5.59.1" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.1.tgz#e185c9db6fe0c02ff2e542622db375ae012a0fe2" - integrity sha512-KVtKcHEizCIRx//LC9tBi6xp94ULKbU5StVHBVWURJQOVa2qw6HP28Hu7LmHrQM3p9I3q5Y2VR4wKllCJ3IWrw== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" + integrity sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw== dependencies: - "@typescript-eslint/utils" "5.59.1" + "@typescript-eslint/utils" "5.62.0" "@typescript-eslint/parser@^5.20.0", "@typescript-eslint/parser@^5.5.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.1.tgz#73c2c12127c5c1182d2e5b71a8fa2a85d215cbb4" - integrity sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.59.1" - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/typescript-estree" "5.59.1" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz#8a20222719cebc5198618a5d44113705b51fd7fe" - integrity sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/visitor-keys" "5.59.1" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz#63981d61684fd24eda2f9f08c0a47ecb000a2111" - integrity sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.59.1" - "@typescript-eslint/utils" "5.59.1" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.1.tgz#03f3fedd1c044cb336ebc34cc7855f121991f41d" - integrity sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz#4aa546d27fd0d477c618f0ca00b483f0ec84c43c" - integrity sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/visitor-keys" "5.59.1" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.1", "@typescript-eslint/utils@^5.58.0": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.1.tgz#d89fc758ad23d2157cfae53f0b429bdf15db9473" - integrity sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA== +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.1" - "@typescript-eslint/types" "5.59.1" - "@typescript-eslint/typescript-estree" "5.59.1" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.59.1": - version "5.59.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz#0d96c36efb6560d7fb8eb85de10442c10d8f6058" - integrity sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.59.1" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" "@visx/bounds@2.17.0": @@ -3074,131 +3171,131 @@ prop-types "^15.5.10" react-use-measure "^2.0.4" -"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" - integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" - integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" - integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" - integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@webassemblyjs/helper-numbers@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" - integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.5" - "@webassemblyjs/helper-api-error" "1.11.5" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" - integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" - integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" - integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" - integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" - integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" - integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/helper-wasm-section" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-opt" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - "@webassemblyjs/wast-printer" "1.11.5" - -"@webassemblyjs/wasm-gen@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" - integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - -"@webassemblyjs/wasm-opt@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" - integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - -"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" - integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-api-error" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - -"@webassemblyjs/wast-printer@1.11.5": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" - integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== - dependencies: - "@webassemblyjs/ast" "1.11.5" + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" "@xmldom/xmldom@^0.8.3": - version "0.8.7" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.7.tgz#8b1e39c547013941974d83ad5e9cf5042071a9a0" - integrity sha512-sI1Ly2cODlWStkINzqGrZ8K6n+MTSbAeQnAipGyL+KZCXuHaRlj2gyyy8B/9MvsFFqN7XHryQnB2QwhzvJXovg== + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -3236,10 +3333,10 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" @@ -3256,10 +3353,10 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== address@^1.0.1, address@^1.1.2: version "1.2.2" @@ -3401,13 +3498,20 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.0.0, aria-query@^5.1.3: +aria-query@5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -3426,15 +3530,15 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^2.1.0: @@ -3442,47 +3546,71 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.findlastindex@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== +array.prototype.reduce@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" + integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" asap@~2.0.3, asap@~2.0.6: version "2.0.6" @@ -3504,6 +3632,13 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -3515,13 +3650,13 @@ at-least-node@^1.0.0: integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.13: - version "10.4.14" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" @@ -3532,16 +3667,16 @@ available-typed-arrays@^1.0.5: integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axe-core@^4.6.2: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + version "4.8.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" + integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== axobject-query@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: - deep-equal "^2.0.5" + dequal "^2.0.3" babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" @@ -3602,29 +3737,29 @@ babel-plugin-named-asset-import@^0.3.8: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz#1fac2b1dcef6274e72b3c72977ed8325cb330591" + integrity sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.32.2" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" @@ -3700,13 +3835,14 @@ batch@0.6.1: integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== bfj@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" - integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== dependencies: - bluebird "^3.5.5" - check-types "^11.1.1" + bluebird "^3.7.2" + check-types "^11.2.3" hoopy "^0.1.4" + jsonpath "^1.1.1" tryer "^1.0.1" big.js@^5.2.2: @@ -3728,7 +3864,7 @@ bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@^3.5.5: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -3793,15 +3929,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" bser@2.1.1: version "2.1.1" @@ -3884,10 +4020,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: - version "1.0.30001481" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz#f58a717afe92f9e69d0e35ff64df596bfad93912" - integrity sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001542" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001542.tgz#823ddb5aed0a70d5e2bfb49126478e84e9514b85" + integrity sha512-UrtAXVcj1mvPBFQ4sKd38daP8dEcXXr5sQe6QNNinaPd0iA/cxg9/l3VrSdL73jgw5sKyuQ6jNgiKO12W3SsVA== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -3902,7 +4038,7 @@ chalk@4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.4.1: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3942,10 +4078,10 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-types@^11.1.1: - version "11.2.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" - integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" @@ -3973,9 +4109,9 @@ ci-info@^3.2.0: integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== classcat@^5.0.3, classcat@^5.0.4: version "5.0.4" @@ -4002,9 +4138,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.5.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.8.0.tgz#e97a3e2bd00e6d85aa0c13d7f9e3ce236f7787fc" - integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== cli-width@^3.0.0: version "3.0.0" @@ -4034,11 +4170,16 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@^1.0.4, clsx@^1.1.1, clsx@^1.2.1: +clsx@^1.0.4, clsx@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -4054,9 +4195,9 @@ coa@^2.0.2: q "^1.1.2" collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" @@ -4186,6 +4327,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -4201,22 +4347,22 @@ cookie@^0.4.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-js-compat@^3.25.1: - version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe" - integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== +core-js-compat@^3.31.0, core-js-compat@^3.32.2: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" + integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== dependencies: - browserslist "^4.21.5" + browserslist "^4.22.1" core-js-pure@^3.23.3: - version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.1.tgz#7d93dc89e7d47b8ef05d7e79f507b0e99ea77eec" - integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg== + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.0.tgz#938a28754b4d82017a7a8cbd2727b1abecc63591" + integrity sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg== core-js@^3.19.2: - version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.1.tgz#fc9c5adcc541d8e9fa3e381179433cbf795628ba" - integrity sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ== + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.0.tgz#70366dbf737134761edb017990cf5ce6c6369c40" + integrity sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw== core-util-is@~1.0.0: version "1.0.3" @@ -4246,11 +4392,11 @@ cosmiconfig@^7.0.0: yaml "^1.10.0" cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: - node-fetch "2.6.7" + node-fetch "^2.6.12" cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" @@ -4274,9 +4420,9 @@ css-blank-pseudo@^3.0.3: postcss-selector-parser "^6.0.9" css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== css-has-pseudo@^3.0.4: version "3.0.4" @@ -4286,14 +4432,14 @@ css-has-pseudo@^3.0.4: postcss-selector-parser "^6.0.9" css-loader@^6.5.1: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.19" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.3" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" @@ -4382,9 +4528,9 @@ css.escape@^1.5.1: integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssdb@^7.1.0: - version "7.5.4" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.5.4.tgz#e34dafee5184d67634604e345e389ca79ac179ea" - integrity sha512-fGD+J6Jlq+aurfE1VDXlLS4Pt0VtNlu2+YgfGOdMxRyl/HQ9bDiHTwSck1Yz8A97Dt/82izSK6Bp/4nVqacOsg== + version "7.7.2" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.7.2.tgz#fbebd90edfc6af129fda4fd986f9dd604a209094" + integrity sha512-pQPYP7/kch4QlkTcLuUNiNL2v/E+O+VIdotT+ug62/+2B2/jkzs5fMM6RHCzGCZ9C82pODEMSIzRRUzJOrl78g== cssesc@^3.0.0: version "3.0.0" @@ -4482,9 +4628,9 @@ d3-array@2, d3-array@^2.3.0: internmap "^1.0.0" "d3-array@2 - 3", "d3-array@2.10.0 - 3": - version "3.2.3" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" - integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" @@ -4705,15 +4851,16 @@ dedent@^0.7.0: integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-equal@^2.0.5: - version "2.2.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" - integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + version "2.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" + integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== dependencies: + array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" - es-get-iterator "^1.1.2" - get-intrinsic "^1.1.3" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.1" is-arguments "^1.1.1" - is-array-buffer "^3.0.1" + is-array-buffer "^3.0.2" is-date-object "^1.0.5" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -4721,7 +4868,7 @@ deep-equal@^2.0.5: object-is "^1.1.5" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" which-boxed-primitive "^1.0.2" which-collection "^1.0.1" @@ -4751,16 +4898,26 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -4779,6 +4936,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -4812,10 +4974,10 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== dir-glob@^3.0.1: version "3.0.1" @@ -4835,9 +4997,9 @@ dns-equal@^1.0.0: integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -4968,10 +5130,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.284: - version "1.4.372" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.372.tgz#7888ac92ccb9556627c3a37eba3b89ee5ac345f8" - integrity sha512-MrlFq/j+TYHOjeWsWGYfzevc25HNeJdsF6qaLFrqBTRWZQtWkb1myq/Q2veLWezVaa5OcSZ99CFwTT4aF4Mung== +electron-to-chromium@^1.4.535: + version "1.4.538" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.538.tgz#86d6b60a8b7e0af3d2aaad3f4ba5a33838cc72ea" + integrity sha512-1a2m63NEookb1beNFTGDihgF3CKL7ksZ7PSA0VloON5DpTEhnOVgaDes8xkrDhkXRxlcN8JymQDGnv+Nn+uvhg== emittery@^0.10.2: version "0.10.2" @@ -5003,20 +5165,21 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" - integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" entities@^2.0.0: version "2.2.0" @@ -5037,18 +5200,19 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== +es-abstract@^1.17.2, es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -5063,26 +5227,30 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21 is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.11" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== -es-get-iterator@^1.1.2: +es-get-iterator@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== @@ -5097,10 +5265,30 @@ es-get-iterator@^1.1.2: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -5152,15 +5340,26 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -5190,15 +5389,15 @@ eslint-config-react-app@^7.0.1: eslint-plugin-testing-library "^5.0.1" eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" -eslint-module-utils@^2.7.4: +eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== @@ -5214,25 +5413,27 @@ eslint-plugin-flowtype@^8.0.3: string-natural-compare "^3.0.1" eslint-plugin-import@^2.25.3: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + version "2.28.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== dependencies: array-includes "^3.1.6" + array.prototype.findlastindex "^1.2.2" array.prototype.flat "^1.3.1" array.prototype.flatmap "^1.3.1" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" + eslint-module-utils "^2.8.0" has "^1.0.3" - is-core-module "^2.11.0" + is-core-module "^2.13.0" is-glob "^4.0.3" minimatch "^3.1.2" + object.fromentries "^2.0.6" + object.groupby "^1.0.0" object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + semver "^6.3.1" + tsconfig-paths "^3.14.2" eslint-plugin-jest@^25.3.0: version "25.7.0" @@ -5276,14 +5477,15 @@ eslint-plugin-react-hooks@^4.3.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.27.1: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -5293,13 +5495,13 @@ eslint-plugin-react@^7.27.1: object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.4" - semver "^6.3.0" + semver "^6.3.1" string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^5.0.1: - version "5.10.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.10.3.tgz#e613fbaf9a145e9eef115d080b32cb488fae622e" - integrity sha512-0yhsKFsjHLud5PM+f2dWr9K3rqYzMy4cSHs3lcmFYMa1CdSzRvHGgXvsFarBjZ41gU8jhTdMIkg8jHLxGJqLqw== + version "5.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz#5b46cdae96d4a78918711c0b4792f90088e62d20" + integrity sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw== dependencies: "@typescript-eslint/utils" "^5.58.0" @@ -5311,10 +5513,10 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -5336,10 +5538,10 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" - integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-webpack-plugin@^3.1.1: version "3.2.0" @@ -5399,26 +5601,26 @@ eslint@^7.19.0: v8-compile-cache "^2.0.3" eslint@^8.3.0: - version "8.39.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.39.0.tgz#7fd20a295ef92d43809e914b70c39fd5a23cf3f1" - integrity sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og== + version "8.50.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2" + integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.2" - "@eslint/js" "8.39.0" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.50.0" + "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.0" - espree "^9.5.1" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -5426,22 +5628,19 @@ eslint@^8.3.0: find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" espree@^7.3.0, espree@^7.3.1: @@ -5453,14 +5652,19 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -espree@^9.5.1: - version "9.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.1.tgz#4f26a4d5f18905bf4f2e0bd99002aab807e96dd4" - integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.0" + eslint-visitor-keys "^3.4.1" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -5481,7 +5685,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -5547,15 +5751,15 @@ expect@^27.5.1: jest-message-util "^27.5.1" expect@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" express@^4.17.3: version "4.18.2" @@ -5609,14 +5813,14 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5668,9 +5872,9 @@ fbjs-css-vars@^1.0.0: integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== dependencies: cross-fetch "^3.1.5" fbjs-css-vars "^1.0.0" @@ -5678,7 +5882,7 @@ fbjs@^3.0.0, fbjs@^3.0.1: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.30" + ua-parser-js "^1.0.35" figures@^3.0.0: version "3.2.0" @@ -5702,7 +5906,7 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -filelist@^1.0.1: +filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== @@ -5772,17 +5976,18 @@ find-up@^5.0.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.7: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== flux@^4.0.1: version "4.0.4" @@ -5793,9 +5998,9 @@ flux@^4.0.1: fbjs "^3.0.1" follow-redirects@^1.0.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== for-each@^0.3.3: version "0.3.3" @@ -5837,10 +6042,10 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fraction.js@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== fresh@0.5.2: version "0.5.2" @@ -5866,10 +6071,10 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== +fs-monkey@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" @@ -5877,31 +6082,31 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5916,13 +6121,14 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-own-enumerable-property-symbols@^3.0.0: @@ -6013,9 +6219,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0, globals@^13.6.0, globals@^13.9.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.22.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.22.0.tgz#0c9fcb9c48a2494fbb5edbfee644285543eba9d8" + integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== dependencies: type-fest "^0.20.2" @@ -6050,10 +6256,10 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== graphlib@^2.1.8: version "2.1.8" @@ -6135,10 +6341,15 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +headers-polyfill@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" + integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== + headers-polyfill@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.1.2.tgz#9a4dcb545c5b95d9569592ef7ec0708aab763fbe" - integrity sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.3.0.tgz#67c6ef7b72d4c8cac832ad5936f5b3a56e7b705a" + integrity sha512-5e57etwBpNcDc0b6KCVWEh/Ro063OxPvzVimUdM0/tsYM/T7Hfy3kknIGj78SFTOhNd8AZY41U8mOHoO4LzmIQ== highlight-words-core@^1.2.0: version "1.2.2" @@ -6175,9 +6386,9 @@ html-encoding-sniffer@^2.0.1: whatwg-encoding "^1.0.5" html-entities@^2.1.0, html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-escaper@^2.0.0: version "2.0.2" @@ -6198,9 +6409,9 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-webpack-plugin@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz#826838e31b427f5f7f30971f8d8fa2422dfa6763" - integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== + version "5.5.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -6397,9 +6608,9 @@ ini@^1.3.5: integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inquirer@^8.2.0: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -6415,9 +6626,9 @@ inquirer@^8.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" + wrap-ansi "^6.0.1" -internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: +internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -6442,9 +6653,9 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + version "2.1.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" @@ -6468,6 +6679,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -6495,10 +6713,10 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== +is-core-module@^2.13.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -6519,6 +6737,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -6529,7 +6754,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -6654,16 +6879,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@^1.0.0: version "1.0.0" @@ -6734,12 +6955,12 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -6752,22 +6973,33 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" + filelist "^1.0.4" + minimatch "^3.1.2" jest-changed-files@^27.5.1: version "27.5.1" @@ -6861,15 +7093,15 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-docblock@^27.5.1: version "27.5.1" @@ -6919,10 +7151,10 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^27.5.1: version "27.5.1" @@ -6995,15 +7227,15 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-message-util@^27.5.1: version "27.5.1" @@ -7035,18 +7267,18 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.5.0" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" @@ -7213,12 +7445,12 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -7314,20 +7546,15 @@ jest@^27.4.3: jest-cli "^27.5.1" jiti@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" - integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== js-levenshtein@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== -js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7391,6 +7618,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -7423,7 +7655,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -7437,6 +7669,15 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -7513,12 +7754,21 @@ jss@10.10.0, jss@^10.5.1: tiny-warning "^1.0.2" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + json-buffer "3.0.1" kind-of@^6.0.2: version "6.0.3" @@ -7708,7 +7958,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lz-string@^1.4.4: +lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== @@ -7720,13 +7970,20 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -7750,11 +8007,11 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.1.2, memfs@^3.4.3: - version "3.5.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec" - integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: - fs-monkey "^1.0.3" + fs-monkey "^1.0.4" memoize-one@^4.0.0: version "4.1.0" @@ -7817,9 +8074,9 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.4.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -7960,17 +8217,10 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== +node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -7984,10 +8234,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -8019,9 +8269,9 @@ nth-check@^1.0.2, nth-check@^2.0.1: boolbase "^1.0.0" nwsapi@^2.2.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" - integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -8051,7 +8301,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -8062,50 +8312,60 @@ object.assign@^4.1.3, object.assign@^4.1.4: object-keys "^1.1.1" object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.getownpropertydescriptors@^2.1.0: - version "2.1.6" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" - integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + version "2.1.7" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" + integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== dependencies: - array.prototype.reduce "^1.0.5" + array.prototype.reduce "^1.0.6" call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.21.2" + es-abstract "^1.22.1" safe-array-concat "^1.0.0" +object.groupby@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.values@^1.1.0, object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -8159,17 +8419,17 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.1, optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" ora@^5.4.1: version "5.4.1" @@ -8353,9 +8613,9 @@ pify@^2.3.0: integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1, pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" @@ -8652,10 +8912,10 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -8884,9 +9144,9 @@ postcss-selector-not@^6.0.1: postcss-selector-parser "^6.0.10" postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8919,10 +9179,10 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.19, postcss@^8.4.23, postcss@^8.4.4: - version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== +postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -8982,12 +9242,12 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -9216,19 +9476,19 @@ react-refresh@^0.11.0: integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-router-dom@6: - version "6.10.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.10.0.tgz#090ddc5c84dc41b583ce08468c4007c84245f61f" - integrity sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg== + version "6.16.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.16.0.tgz#86f24658da35eb66727e75ecbb1a029e33ee39d9" + integrity sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg== dependencies: - "@remix-run/router" "1.5.0" - react-router "6.10.0" + "@remix-run/router" "1.9.0" + react-router "6.16.0" -react-router@6.10.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.10.0.tgz#230f824fde9dd0270781b5cb497912de32c0a971" - integrity sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ== +react-router@6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.16.0.tgz#abbf3d5bdc9c108c9b822a18be10ee004096fb81" + integrity sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA== dependencies: - "@remix-run/router" "1.5.0" + "@remix-run/router" "1.9.0" react-scripts@5.0.1: version "5.0.1" @@ -9303,18 +9563,18 @@ react-test-renderer@^18.0.0: scheduler "^0.23.0" react-textarea-autosize@^8.3.2: - version "8.4.1" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz#bcfc5462727014b808b14ee916c01e275e8a8335" - integrity sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q== + version "8.5.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== dependencies: "@babel/runtime" "^7.20.13" use-composed-ref "^1.3.0" use-latest "^1.2.1" react-toastify@^9.1.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.1.2.tgz#293aa1f952240129fe485ae5cb2f8d09c652cf3f" - integrity sha512-PBfzXO5jMGEtdYR5jxrORlNZZe/EuOkwvwKijMatsZZm8IZwLj01YvobeJYNjFcA6uy6CVrx2fzL9GWbhWPTDA== + version "9.1.3" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.1.3.tgz#1e798d260d606f50e0fab5ee31daaae1d628c5ff" + integrity sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg== dependencies: clsx "^1.1.1" @@ -9343,16 +9603,16 @@ react@^18.0.0: loose-envify "^1.1.0" reactflow@^11.5.5: - version "11.7.0" - resolved "https://registry.yarnpkg.com/reactflow/-/reactflow-11.7.0.tgz#821642ce9ce4a3a2fa6469053520cb032ff03ef4" - integrity sha512-bjfJV1iQZ+VwIlvsnd4TbXNs6kuJ5ONscud6fNkF8RY/oU2VUZpdjA3q1zwmgnjmJcIhxuBiBI5VLGajYx/Ozg== + version "11.9.2" + resolved "https://registry.yarnpkg.com/reactflow/-/reactflow-11.9.2.tgz#f0fe8d05a29b46dee250c2bc7d8ee62d7f420c21" + integrity sha512-hARhGVX9rcZhtRWsjBszDpF0EefsYhCzrRCk12CsB2oqWJZPLQD4OYh5eQygr9Yi3M/i+3+rcNyPs9IsFzU5iQ== dependencies: - "@reactflow/background" "11.2.0" - "@reactflow/controls" "11.1.11" - "@reactflow/core" "11.7.0" - "@reactflow/minimap" "11.5.0" - "@reactflow/node-resizer" "2.1.0" - "@reactflow/node-toolbar" "1.1.11" + "@reactflow/background" "11.3.2" + "@reactflow/controls" "11.2.2" + "@reactflow/core" "11.9.2" + "@reactflow/minimap" "11.7.2" + "@reactflow/node-resizer" "2.2.2" + "@reactflow/node-toolbar" "1.3.2" read-cache@^1.0.0: version "1.0.0" @@ -9405,10 +9665,22 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -9417,15 +9689,20 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -9434,14 +9711,14 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpp@^3.1.0: version "3.2.0" @@ -9536,12 +9813,12 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -9609,19 +9886,19 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.5.5: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -9699,19 +9976,19 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" - integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -9730,12 +10007,12 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -9803,6 +10080,15 @@ set-cookie-parser@^2.4.6: resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -9981,6 +10267,18 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + statuses@2.0.1, statuses@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -10036,45 +10334,46 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: strip-ansi "^6.0.1" string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" side-channel "^1.0.4" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -10114,9 +10413,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -10153,9 +10452,9 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-loader@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.2.tgz#eaebca714d9e462c19aa1e3599057bc363924899" - integrity sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw== + version "3.3.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" + integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== stylehacks@^5.1.1: version "5.1.1" @@ -10165,15 +10464,15 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== sucrase@^3.32.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" - integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + version "3.34.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== dependencies: "@jridgewell/gen-mapping" "^0.3.2" commander "^4.0.0" @@ -10271,9 +10570,9 @@ table@^6.0.9: strip-ansi "^6.0.1" tailwindcss@^3.0.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3" - integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== + version "3.3.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.3.tgz#90da807393a2859189e48e9e7000e6880a736daf" + integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" @@ -10295,7 +10594,6 @@ tailwindcss@^3.0.2: postcss-load-config "^4.0.1" postcss-nested "^6.0.1" postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" resolve "^1.22.2" sucrase "^3.32.0" @@ -10333,23 +10631,23 @@ terminal-link@^2.0.0: supports-hyperlinks "^2.0.0" terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: - version "5.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.5" + terser "^5.16.8" -terser@^5.0.0, terser@^5.10.0, terser@^5.16.5: - version "5.17.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" - integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== +terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: + version "5.20.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.20.0.tgz#ea42aea62578703e33def47d5c5b93c49772423e" + integrity sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -10469,7 +10767,7 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -tsconfig-paths@^3.14.1: +tsconfig-paths@^3.14.2: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== @@ -10485,9 +10783,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3, tslib@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -10543,6 +10841,36 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -10564,10 +10892,10 @@ typescript@^4.4.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -ua-parser-js@^0.7.30: - version "0.7.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307" - integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== +ua-parser-js@^1.0.35: + version "1.0.36" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.36.tgz#a9ab6b9bd3a8efb90bb0816674b412717b7c428c" + integrity sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw== unbox-primitive@^1.0.2: version "1.0.2" @@ -10579,6 +10907,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -10634,10 +10967,10 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -10721,9 +11054,9 @@ uuid@^8.3.2: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== v8-to-istanbul@^8.1.0: version "8.1.1" @@ -10828,9 +11161,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.6.0: - version "4.13.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz#9feb740b8b56b886260bae1360286818a221bae8" - integrity sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug== + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -10838,7 +11171,7 @@ webpack-dev-server@^4.6.0: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -10893,9 +11226,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.80.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.80.0.tgz#3e660b4ab572be38c5e954bdaae7e2bf76010fdc" - integrity sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA== + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -10903,10 +11236,10 @@ webpack@^5.64.4: "@webassemblyjs/wasm-edit" "^1.11.5" "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" + enhanced-resolve "^5.15.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -10916,7 +11249,7 @@ webpack@^5.64.4: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" @@ -10944,9 +11277,9 @@ whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + version "3.6.19" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" + integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== whatwg-mimetype@^2.3.0: version "2.3.0" @@ -10990,6 +11323,24 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" @@ -11000,17 +11351,16 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^1.3.1: version "1.3.1" @@ -11026,30 +11376,30 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -workbox-background-sync@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" - integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== +workbox-background-sync@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" + integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== dependencies: idb "^7.0.1" - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-broadcast-update@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" - integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== +workbox-broadcast-update@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" + integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-build@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" - integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== +workbox-build@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" + integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== dependencies: "@apideck/better-ajv-errors" "^0.3.1" "@babel/core" "^7.11.1" @@ -11073,132 +11423,141 @@ workbox-build@6.5.4: strip-comments "^2.0.1" tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "6.5.4" - workbox-broadcast-update "6.5.4" - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-google-analytics "6.5.4" - workbox-navigation-preload "6.5.4" - workbox-precaching "6.5.4" - workbox-range-requests "6.5.4" - workbox-recipes "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - workbox-streams "6.5.4" - workbox-sw "6.5.4" - workbox-window "6.5.4" - -workbox-cacheable-response@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" - integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== - dependencies: - workbox-core "6.5.4" - -workbox-core@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" - integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== - -workbox-expiration@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" - integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== + workbox-background-sync "6.6.1" + workbox-broadcast-update "6.6.1" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-google-analytics "6.6.1" + workbox-navigation-preload "6.6.1" + workbox-precaching "6.6.1" + workbox-range-requests "6.6.1" + workbox-recipes "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + workbox-streams "6.6.1" + workbox-sw "6.6.1" + workbox-window "6.6.1" + +workbox-cacheable-response@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" + integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== + dependencies: + workbox-core "6.6.1" + +workbox-core@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" + integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== + +workbox-expiration@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" + integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== dependencies: idb "^7.0.1" - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-google-analytics@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" - integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== +workbox-google-analytics@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" + integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== dependencies: - workbox-background-sync "6.5.4" - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-background-sync "6.6.1" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-navigation-preload@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" - integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== +workbox-navigation-preload@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" + integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-precaching@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" - integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== +workbox-precaching@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" + integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-range-requests@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" - integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== +workbox-range-requests@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" + integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-recipes@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" - integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== +workbox-recipes@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" + integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== dependencies: - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-precaching "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-precaching "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-routing@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" - integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== +workbox-routing@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" + integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-strategies@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" - integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== +workbox-strategies@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" + integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-streams@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" - integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== +workbox-streams@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" + integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" + workbox-core "6.6.1" + workbox-routing "6.6.1" -workbox-sw@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" - integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== +workbox-sw@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" + integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== workbox-webpack-plugin@^6.4.1: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" - integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" + integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== dependencies: fast-json-stable-stringify "^2.1.0" pretty-bytes "^5.4.1" upath "^1.2.0" webpack-sources "^1.4.3" - workbox-build "6.5.4" + workbox-build "6.6.1" -workbox-window@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" - integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== +workbox-window@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" + integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== dependencies: "@types/trusted-types" "^2.0.2" - workbox-core "6.5.4" + workbox-core "6.6.1" + +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^7.0.0: version "7.0.0" @@ -11230,9 +11589,9 @@ ws@^7.4.6: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== xml-name-validator@^3.0.0: version "3.0.0" @@ -11269,10 +11628,10 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.1.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" - integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== +yaml@^2.1.1, yaml@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== yargs-parser@^20.2.2: version "20.2.9" @@ -11298,9 +11657,9 @@ yargs@^16.2.0: yargs-parser "^20.2.2" yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -11315,9 +11674,9 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zustand@^4.3.1: - version "4.3.7" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.7.tgz#501b1f0393a7f1d103332e45ab574be5747fedce" - integrity sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ== +zustand@^4.4.1: + version "4.4.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.2.tgz#e26ad331d0a2e28a7d4aa126b00c7140b34904bb" + integrity sha512-qF3/vZHCrjPUX5DvPE3DPDZlh+FiAWRKlP9PI7SlW1MCk8q4vUCDqyWsbF8K41ne0Yx8eeeb0m1cypn1LqUMYQ== dependencies: use-sync-external-store "1.2.0" diff --git a/webhook/cmd/start.go b/webhook/cmd/start.go index 876d833df4..50b5ab0bb6 100644 --- a/webhook/cmd/start.go +++ b/webhook/cmd/start.go @@ -56,8 +56,7 @@ func Start() { } kubeClient := kubernetes.NewForConfigOrDie(restConfig) - isbSvcClient := versioned.NewForConfigOrDie(restConfig).NumaflowV1alpha1().InterStepBufferServices(namespace) - + numaClient := versioned.NewForConfigOrDie(restConfig).NumaflowV1alpha1() portStr := sharedutil.LookupEnvStringOr(portEnvVar, "443") port, err := strconv.Atoi(portStr) if err != nil { @@ -75,9 +74,9 @@ func Start() { ClientAuth: tls.VerifyClientCertIfGiven, } controller := webhook.AdmissionController{ - Client: kubeClient, - ISBSVCClient: isbSvcClient, - Options: options, + Client: kubeClient, + NumaClient: numaClient, + Options: options, Handlers: map[schema.GroupVersionKind]runtime.Object{ {Group: "numaflow.numaproj.io", Version: "v1alpha1", Kind: "InterStepBufferService"}: &dfv1.InterStepBufferService{}, {Group: "numaflow.numaproj.io", Version: "v1alpha1", Kind: "Pipeline"}: &dfv1.Pipeline{}, diff --git a/webhook/validator/isbsvc.go b/webhook/validator/isbsvc.go index aefc19fab2..93974ddf32 100644 --- a/webhook/validator/isbsvc.go +++ b/webhook/validator/isbsvc.go @@ -35,7 +35,7 @@ type isbsvcValidator struct { newISBService *dfv1.InterStepBufferService } -// returns ISBService validator +// NewISBServiceValidator returns ISBService validator func NewISBServiceValidator(client kubernetes.Interface, isbsvc v1alpha1.InterStepBufferServiceInterface, old, new *dfv1.InterStepBufferService) Validator { return &isbsvcValidator{client: client, isbscv: isbsvc, oldISBService: old, newISBService: new} } diff --git a/webhook/validator/mock_isb_client.go b/webhook/validator/mock_isb_client.go new file mode 100644 index 0000000000..ed79e4d82b --- /dev/null +++ b/webhook/validator/mock_isb_client.go @@ -0,0 +1,79 @@ +/* +Copyright 2022 The Numaproj Authors. +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. +*/ + +package validator + +import ( + "context" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + + "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1/fake" +) + +// MockInterStepBufferServices implements InterStepBufferServiceInterface +// NOTE: This is used as a mock for testing purposes only +type MockInterStepBufferServices struct { + Fake *fake.FakeNumaflowV1alpha1 +} + +// Get takes name of the interStepBufferService, and returns the corresponding interStepBufferService object, and an error if there is any. +func (c *MockInterStepBufferServices) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.InterStepBufferService, err error) { + isbsvc := fakeISBSvc() + isbsvc.Status.MarkDeployed() + return isbsvc, err +} + +// List takes label and field selectors, and returns the list of InterStepBufferServices that match those selectors. +func (c *MockInterStepBufferServices) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.InterStepBufferServiceList, err error) { + panic("implement me") +} + +// Watch returns a watch.Interface that watches the requested interStepBufferServices. +func (c *MockInterStepBufferServices) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + panic("implement me") +} + +// Create takes the representation of a interStepBufferService and creates it. Returns the server's representation of the interStepBufferService, and an error, if there is any. +func (c *MockInterStepBufferServices) Create(ctx context.Context, interStepBufferService *v1alpha1.InterStepBufferService, opts v1.CreateOptions) (result *v1alpha1.InterStepBufferService, err error) { + panic("implement me") +} + +// Update takes the representation of a interStepBufferService and updates it. Returns the server's representation of the interStepBufferService, and an error, if there is any. +func (c *MockInterStepBufferServices) Update(ctx context.Context, interStepBufferService *v1alpha1.InterStepBufferService, opts v1.UpdateOptions) (result *v1alpha1.InterStepBufferService, err error) { + panic("implement me") +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *MockInterStepBufferServices) UpdateStatus(ctx context.Context, interStepBufferService *v1alpha1.InterStepBufferService, opts v1.UpdateOptions) (*v1alpha1.InterStepBufferService, error) { + panic("implement me") +} + +// Delete takes name of the interStepBufferService and deletes it. Returns an error if one occurs. +func (c *MockInterStepBufferServices) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + panic("implement me") +} + +// DeleteCollection deletes a collection of objects. +func (c *MockInterStepBufferServices) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + panic("implement me") +} + +// Patch applies the patch and returns the patched interStepBufferService. +func (c *MockInterStepBufferServices) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.InterStepBufferService, err error) { + panic("implement me") +} diff --git a/webhook/validator/pipeline.go b/webhook/validator/pipeline.go index 0c3efbcee1..7aca54ae24 100644 --- a/webhook/validator/pipeline.go +++ b/webhook/validator/pipeline.go @@ -18,8 +18,10 @@ package validator import ( "context" + "fmt" admissionv1 "k8s.io/api/admission/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" @@ -28,22 +30,41 @@ import ( ) type pipelineValidator struct { - client kubernetes.Interface - pipeline v1alpha1.PipelineInterface + client kubernetes.Interface + pipeline v1alpha1.PipelineInterface + isbClient v1alpha1.InterStepBufferServiceInterface oldPipeline *dfv1.Pipeline newPipeline *dfv1.Pipeline } -// return PipelineValidator -func NewPipelineValidator(client kubernetes.Interface, pipeline v1alpha1.PipelineInterface, old, new *dfv1.Pipeline) Validator { - return &pipelineValidator{client: client, pipeline: pipeline, oldPipeline: old, newPipeline: new} +// NewPipelineValidator returns a new PipelineValidator +func NewPipelineValidator(client kubernetes.Interface, pipeline v1alpha1.PipelineInterface, + isbClient v1alpha1.InterStepBufferServiceInterface, old, new *dfv1.Pipeline) Validator { + return &pipelineValidator{ + client: client, + pipeline: pipeline, + isbClient: isbClient, + oldPipeline: old, + newPipeline: new, + } } func (v *pipelineValidator) ValidateCreate(ctx context.Context) *admissionv1.AdmissionResponse { if err := pipelinecontroller.ValidatePipeline(v.newPipeline); err != nil { return DeniedResponse(err.Error()) } + // Check that the ISB service exists + var isbName string + if v.newPipeline.Spec.InterStepBufferServiceName != "" { + isbName = v.newPipeline.Spec.InterStepBufferServiceName + } else { + isbName = dfv1.DefaultISBSvcName + } + + if err := v.checkISBSVCExists(ctx, isbName); err != nil { + return DeniedResponse(err.Error()) + } return AllowedResponse() } @@ -61,3 +82,15 @@ func (v *pipelineValidator) ValidateUpdate(ctx context.Context) *admissionv1.Adm return AllowedResponse() } + +// checkISBSVCExists checks that the ISB service exists in the given namespace and is valid +func (v *pipelineValidator) checkISBSVCExists(ctx context.Context, isbSvcName string) error { + isb, err := v.isbClient.Get(ctx, isbSvcName, metav1.GetOptions{}) + if err != nil { + return err + } + if !isb.Status.IsReady() { + return fmt.Errorf("ISB service %q is not ready", isbSvcName) + } + return nil +} diff --git a/webhook/validator/pipeline_test.go b/webhook/validator/pipeline_test.go index 966dec3a56..e485a67f89 100644 --- a/webhook/validator/pipeline_test.go +++ b/webhook/validator/pipeline_test.go @@ -24,17 +24,19 @@ import ( func TestValidatePipelineCreate(t *testing.T) { pipeline := fakePipeline() - v := NewPipelineValidator(fakeK8sClient, &fakePipelineClient, nil, pipeline) + fk := MockInterStepBufferServices{} + v := NewPipelineValidator(fakeK8sClient, &fakePipelineClient, &fk, nil, pipeline) r := v.ValidateCreate(contextWithLogger(t)) assert.True(t, r.Allowed) } func TestValidatePipelineUpdate(t *testing.T) { pipeline := fakePipeline() + fk := MockInterStepBufferServices{} t.Run("test Pipeline interStepBufferServiceName change", func(t *testing.T) { newPipeline := pipeline.DeepCopy() newPipeline.Spec.InterStepBufferServiceName = "change-name" - v := NewPipelineValidator(fakeK8sClient, &fakePipelineClient, pipeline, newPipeline) + v := NewPipelineValidator(fakeK8sClient, &fakePipelineClient, &fk, pipeline, newPipeline) r := v.ValidateUpdate(contextWithLogger(t)) assert.False(t, r.Allowed) }) diff --git a/webhook/validator/test_utils.go b/webhook/validator/test_utils.go new file mode 100644 index 0000000000..f011f302ac --- /dev/null +++ b/webhook/validator/test_utils.go @@ -0,0 +1,84 @@ +package validator + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + fakeClient "k8s.io/client-go/kubernetes/fake" + + dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" + "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1/fake" +) + +const ( + testNamespace = "test-ns" +) + +var ( + fakeK8sClient = fakeClient.NewSimpleClientset() + fakeISBSvcClient = fake.FakeInterStepBufferServices{} + fakePipelineClient = fake.FakePipelines{} + fakeNumaClient = fake.FakeNumaflowV1alpha1{} +) + +func fakeISBSvc() *dfv1.InterStepBufferService { + return &dfv1.InterStepBufferService{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: testNamespace, + Name: dfv1.DefaultISBSvcName, + }, + Spec: dfv1.InterStepBufferServiceSpec{ + Redis: &dfv1.RedisBufferService{ + Native: &dfv1.NativeRedis{ + Version: "6.2.6", + }, + }, + }, + } +} + +func fakeJetStreamISBSvc() *dfv1.InterStepBufferService { + return &dfv1.InterStepBufferService{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "test-ns", + Name: dfv1.DefaultISBSvcName, + }, + Spec: dfv1.InterStepBufferServiceSpec{ + JetStream: &dfv1.JetStreamBufferService{ + Version: "1.1.1", + }, + }, + } +} + +func fakePipeline() *dfv1.Pipeline { + return &dfv1.Pipeline{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pl", + Namespace: "test-ns", + }, + Spec: dfv1.PipelineSpec{ + Vertices: []dfv1.AbstractVertex{ + { + Name: "input", + Source: &dfv1.Source{ + UDTransformer: &dfv1.UDTransformer{ + Builtin: &dfv1.Transformer{Name: "filter"}, + }}, + }, + { + Name: "p1", + UDF: &dfv1.UDF{ + Builtin: &dfv1.Function{Name: "cat"}, + }, + }, + { + Name: "output", + Sink: &dfv1.Sink{}, + }, + }, + Edges: []dfv1.Edge{ + {From: "input", To: "p1"}, + {From: "p1", To: "output"}, + }, + }, + } +} diff --git a/webhook/validator/validator.go b/webhook/validator/validator.go index a54917144c..52ff41f2a8 100644 --- a/webhook/validator/validator.go +++ b/webhook/validator/validator.go @@ -37,45 +37,48 @@ type Validator interface { } // GetValidator returns a Validator instance -func GetValidator(ctx context.Context, client kubernetes.Interface, ISBSVCClient v1alpha1.InterStepBufferServiceInterface, PipelineClient v1alpha1.PipelineInterface, kind metav1.GroupVersionKind, oldBytes []byte, newBytes []byte) (Validator, error) { +func GetValidator(ctx context.Context, client kubernetes.Interface, NumaClient v1alpha1.NumaflowV1alpha1Interface, kind metav1.GroupVersionKind, oldBytes []byte, newBytes []byte) (Validator, error) { log := logging.FromContext(ctx) switch kind.Kind { case dfv1.ISBGroupVersionKind.Kind: - var new *dfv1.InterStepBufferService + var newSpec *dfv1.InterStepBufferService if len(newBytes) > 0 { - new = &dfv1.InterStepBufferService{} - if err := json.Unmarshal(newBytes, new); err != nil { + newSpec = &dfv1.InterStepBufferService{} + if err := json.Unmarshal(newBytes, newSpec); err != nil { log.Errorf("Could not unmarshal new raw object: %v", err) return nil, err } } - var old *dfv1.InterStepBufferService + var oldSpec *dfv1.InterStepBufferService if len(oldBytes) > 0 { - old = &dfv1.InterStepBufferService{} - if err := json.Unmarshal(oldBytes, old); err != nil { + oldSpec = &dfv1.InterStepBufferService{} + if err := json.Unmarshal(oldBytes, oldSpec); err != nil { log.Errorf("Could not unmarshal old raw object: %v", err) return nil, err } } - return NewISBServiceValidator(client, ISBSVCClient, old, new), nil + isbSvcClient := NumaClient.InterStepBufferServices(newSpec.Namespace) + return NewISBServiceValidator(client, isbSvcClient, oldSpec, newSpec), nil case dfv1.PipelineGroupVersionKind.Kind: - var new *dfv1.Pipeline + var newSpec *dfv1.Pipeline if len(newBytes) > 0 { - new = &dfv1.Pipeline{} - if err := json.Unmarshal(newBytes, new); err != nil { + newSpec = &dfv1.Pipeline{} + if err := json.Unmarshal(newBytes, newSpec); err != nil { log.Errorf("Could not unmarshal new raw object: %v", err) return nil, err } } - var old *dfv1.Pipeline + var oldSpec *dfv1.Pipeline if len(oldBytes) > 0 { - old = &dfv1.Pipeline{} - if err := json.Unmarshal(oldBytes, old); err != nil { + oldSpec = &dfv1.Pipeline{} + if err := json.Unmarshal(oldBytes, oldSpec); err != nil { log.Errorf("Could not unmarshal old raw object: %v", err) return nil, err } } - return NewPipelineValidator(client, PipelineClient, old, new), nil + isbSvcClient := NumaClient.InterStepBufferServices(newSpec.Namespace) + pipelineClient := NumaClient.Pipelines(newSpec.Namespace) + return NewPipelineValidator(client, pipelineClient, isbSvcClient, oldSpec, newSpec), nil default: return nil, fmt.Errorf("unrecognized kind: %v", kind) } diff --git a/webhook/validator/validator_test.go b/webhook/validator/validator_test.go index 030fcd8c5a..62137129ae 100644 --- a/webhook/validator/validator_test.go +++ b/webhook/validator/validator_test.go @@ -21,22 +21,10 @@ import ( "encoding/json" "testing" - dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1" - fake "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1/fake" - "github.com/numaproj/numaflow/pkg/shared/logging" "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - fakeClient "k8s.io/client-go/kubernetes/fake" -) - -const ( - testNamespace = "test-ns" -) -var ( - fakeK8sClient = fakeClient.NewSimpleClientset() - fakeISBSvcClient = fake.FakeInterStepBufferServices{} - fakePipelineClient = fake.FakePipelines{} + "github.com/numaproj/numaflow/pkg/shared/logging" ) func contextWithLogger(t *testing.T) context.Context { @@ -44,76 +32,12 @@ func contextWithLogger(t *testing.T) context.Context { return logging.WithLogger(context.Background(), logging.NewLogger()) } -func fakeISBSvc() *dfv1.InterStepBufferService { - return &dfv1.InterStepBufferService{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: testNamespace, - Name: dfv1.DefaultISBSvcName, - }, - Spec: dfv1.InterStepBufferServiceSpec{ - Redis: &dfv1.RedisBufferService{ - Native: &dfv1.NativeRedis{ - Version: "6.2.6", - }, - }, - }, - } -} - -func fakeJetStreamISBSvc() *dfv1.InterStepBufferService { - return &dfv1.InterStepBufferService{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "test-ns", - Name: dfv1.DefaultISBSvcName, - }, - Spec: dfv1.InterStepBufferServiceSpec{ - JetStream: &dfv1.JetStreamBufferService{ - Version: "1.1.1", - }, - }, - } -} - -func fakePipeline() *dfv1.Pipeline { - return &dfv1.Pipeline{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-pl", - Namespace: "test-ns", - }, - Spec: dfv1.PipelineSpec{ - Vertices: []dfv1.AbstractVertex{ - { - Name: "input", - Source: &dfv1.Source{ - UDTransformer: &dfv1.UDTransformer{ - Builtin: &dfv1.Transformer{Name: "filter"}, - }}, - }, - { - Name: "p1", - UDF: &dfv1.UDF{ - Builtin: &dfv1.Function{Name: "cat"}, - }, - }, - { - Name: "output", - Sink: &dfv1.Sink{}, - }, - }, - Edges: []dfv1.Edge{ - {From: "input", To: "p1"}, - {From: "p1", To: "output"}, - }, - }, - } -} - func TestGetValidator(t *testing.T) { t.Run("test get InterStepBufferService validator", func(t *testing.T) { bytes, err := json.Marshal(fakeISBSvc()) assert.NoError(t, err) assert.NotNil(t, bytes) - v, err := GetValidator(contextWithLogger(t), fakeK8sClient, &fakeISBSvcClient, &fakePipelineClient, metav1.GroupVersionKind{Group: "numaflow.numaproj.io", Version: "v1alpha1", Kind: "InterStepBufferService"}, nil, bytes) + v, err := GetValidator(contextWithLogger(t), fakeK8sClient, &fakeNumaClient, metav1.GroupVersionKind{Group: "numaflow.numaproj.io", Version: "v1alpha1", Kind: "InterStepBufferService"}, nil, bytes) assert.NoError(t, err) assert.NotNil(t, v) }) @@ -122,7 +46,7 @@ func TestGetValidator(t *testing.T) { bytes, err := json.Marshal(fakePipeline()) assert.NoError(t, err) assert.NotNil(t, bytes) - v, err := GetValidator(contextWithLogger(t), fakeK8sClient, &fakeISBSvcClient, &fakePipelineClient, metav1.GroupVersionKind{Group: "numaflow.numaproj.io", Version: "v1alpha1", Kind: "Pipeline"}, nil, bytes) + v, err := GetValidator(contextWithLogger(t), fakeK8sClient, &fakeNumaClient, metav1.GroupVersionKind{Group: "numaflow.numaproj.io", Version: "v1alpha1", Kind: "Pipeline"}, nil, bytes) assert.NoError(t, err) assert.NotNil(t, v) }) diff --git a/webhook/webhook.go b/webhook/webhook.go index 9937826e35..3ce926e7c2 100644 --- a/webhook/webhook.go +++ b/webhook/webhook.go @@ -70,9 +70,8 @@ type Options struct { // Controller for validation webhook type AdmissionController struct { - Client kubernetes.Interface - ISBSVCClient v1alpha1.InterStepBufferServiceInterface - PipelineClient v1alpha1.PipelineInterface + Client kubernetes.Interface + NumaClient v1alpha1.NumaflowV1alpha1Interface Options Options Handlers map[schema.GroupVersionKind]runtime.Object @@ -258,7 +257,7 @@ func (ac *AdmissionController) admit(ctx context.Context, request *admissionv1.A log.Infof("Operation not interested: %v %v", request.Kind, request.Operation) return &admissionv1.AdmissionResponse{Allowed: true} } - v, err := validator.GetValidator(ctx, ac.Client, ac.ISBSVCClient, ac.PipelineClient, request.Kind, request.OldObject.Raw, request.Object.Raw) + v, err := validator.GetValidator(ctx, ac.Client, ac.NumaClient, request.Kind, request.OldObject.Raw, request.Object.Raw) if err != nil { return validator.DeniedResponse("failed to get a validator: %v", err) }