From ae086e4a55ddccf6243106773bf35b9cf8817435 Mon Sep 17 00:00:00 2001 From: Azanul Date: Tue, 27 Feb 2024 11:26:14 +0530 Subject: [PATCH 01/31] feat: mark successful triggering of workflow even without any supported resources Signed-off-by: Azanul --- go.mod | 2 +- go.sum | 20 -------------------- internal/internal.go | 1 + 3 files changed, 2 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 666a156d2..56808c5cf 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/apigateway v1.20.2 github.com/aws/aws-sdk-go-v2/service/autoscaling v1.35.1 github.com/aws/aws-sdk-go-v2/service/cloudfront v1.30.2 + github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.38.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.2 github.com/aws/aws-sdk-go-v2/service/codecommit v1.18.2 github.com/aws/aws-sdk-go-v2/service/codedeploy v1.20.3 @@ -86,7 +87,6 @@ require ( require ( cloud.google.com/go/longrunning v0.4.1 // indirect github.com/apache/arrow/go/v11 v11.0.0 // indirect - github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.38.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/google/s2a-go v0.1.4 // indirect diff --git a/go.sum b/go.sum index 732596a4a..b107cb719 100644 --- a/go.sum +++ b/go.sum @@ -62,10 +62,6 @@ github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Y github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/aws/aws-sdk-go-v2 v1.23.1 h1:qXaFsOOMA+HsZtX8WoCa+gJnbyW7qyFFBlPqvTSzbaI= -github.com/aws/aws-sdk-go-v2 v1.23.1/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2 v1.25.0 h1:sv7+1JVJxOu/dD/sz/csHX7jFqmP001TIY7aytBWDSQ= -github.com/aws/aws-sdk-go-v2 v1.25.0/go.mod h1:G104G1Aho5WqF+SR3mDIobTABQzpYV0WxMsKxlMggOA= github.com/aws/aws-sdk-go-v2 v1.25.1 h1:P7hU6A5qEdmajGwvae/zDkOq+ULLC9tQBTwqqiwFGpI= github.com/aws/aws-sdk-go-v2 v1.25.1/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1 h1:ZY3108YtBNq96jNZTICHxN1gSBSbnvIdYwwqnvCV4Mc= @@ -76,16 +72,8 @@ github.com/aws/aws-sdk-go-v2/credentials v1.16.2 h1:0sdZ5cwfOAipTzZ7eOL0gw4LAhk/ github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4 h1:9wKDWEjwSnXZre0/O3+ZwbBl1SmlgWYBbrTV10X/H1s= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4 h1:LAm3Ycm9HJfbSCd5I+wqC2S9Ej7FPrgr5CQoOljJZcE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4/go.mod h1:xEhvbJcyUf/31yfGSQBe01fukXwXJ0gxDp7rLfymWE0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0 h1:NPs/EqVO+ajwOoq56EfcGKa3L3ruWuazkIw1BqxwOPw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0/go.mod h1:D+duLy2ylgatV+yTlQ8JTuLfDD0BnFvnQRc+o6tbZ4M= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1 h1:evvi7FbTAoFxdP/mixmP7LIYzQWAmzBcwNB/es9XPNc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.1/go.mod h1:rH61DT6FDdikhPghymripNUCsf+uVF4Cnk4c4DBKH64= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 h1:4GV0kKZzUxiWxSVpn/9gwR0g21NF1Jsyduzo9rHgC/Q= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4/go.mod h1:dYvTNAggxDZy6y1AF7YDwXsPuHFy/VNEpEI/2dWK9IU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0 h1:ks7KGMVUMoDzcxNWUlEdI+/lokMFD136EL6DWmUOV80= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0/go.mod h1:hL6BWM/d/qz113fVitZjbXR0E+RCTU1+x+1Idyn5NgE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1 h1:RAnaIrbxPtlXNVI/OIlh1sidTQ3e1qM6LRjs7N0bE0I= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.1/go.mod h1:nbgAGkH5lk0RZRMh6A4K/oG6Xj11eC/1CyDow+DUAFI= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= @@ -134,16 +122,12 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.2 h1:4pOJ+1slB github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.2/go.mod h1:NatT0jYQo0MfgZnIX8ReNWnbsl4rbQjuS+uci1KNkck= github.com/aws/aws-sdk-go-v2/service/iam v1.27.2 h1:Z3a5I5kKGsuVW4kbrtHVnLGUHpEpo19zFyo6dzP2WCM= github.com/aws/aws-sdk-go-v2/service/iam v1.27.2/go.mod h1:CYRyr95Q57xVvrcKJu3vw4jVVCZhmY1SyugM+EWXlzI= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 h1:a33HuFlO0KsveiP90IUJh8Xr/cx9US2PqkSroaLc+o8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0/go.mod h1:SxIkWpByiGbhbHYTo9CMTUnx2G4p4ZQMrDPcRRy//1c= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3 h1:xbwRyCy7kXrOj89iIKLB6NfE2WCpP9HoKyk8dMDvnIQ= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.3 h1:AakYQhCXteXSRHebRAGDKf/P+3kmEWwiyE3Um/d0ecg= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.8.3/go.mod h1:wt1Ib9UX0A8fxifnkYLrv7RAlg+ziPR8Fo0NqzuJkHI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3 h1:kJOolE8xBAD13xTCgOakByZkyP4D/owNmvEiioeUNAg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 h1:SHN/umDLTmFTmYfI+gkanz6da3vK8Kvj/5wkqnTHbuA= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0/go.mod h1:l8gPU5RYGOFHJqWEpPMoRTP0VoaWQSkJdKo+hwWnnDA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3 h1:KV0z2RDc7euMtg8aUT1czv5p29zcLlXALNFsd3jkkEc= @@ -186,10 +170,6 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0 h1:/XiEU7VIFcVWRDQLabyrSjBo github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs= github.com/aws/aws-sdk-go-v2/service/sts v1.25.3 h1:M2w4kiMGJCCM6Ljmmx/l6mmpfa3gPJVpBencfnsgvqs= github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ= -github.com/aws/smithy-go v1.17.0 h1:wWJD7LX6PBV6etBUwO0zElG0nWN9rUhp0WdYeHSHAaI= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/aws/smithy-go v1.20.0 h1:6+kZsCXZwKxZS9RfISnPc4EXlHoyAkm2hPuM8X2BrrQ= -github.com/aws/smithy-go v1.20.0/go.mod h1:uo5RKksAl4PzhqaAbjd4rLgFoq5koTsQKYuGe7dklGc= github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= diff --git a/internal/internal.go b/internal/internal.go index 75a43ac6e..368ab6bad 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -300,6 +300,7 @@ func fetchResources(ctx context.Context, clients []providers.ProviderClient, reg } else if client.OVHClient != nil { workflowTrigger(client, "OVH") } + log.Println("Workflow triggered for client:", client.Name) } wwg.Wait() From e32299e802adba5d6b60ef7443173fd82a336be4 Mon Sep 17 00:00:00 2001 From: Azanul Date: Sat, 2 Mar 2024 11:34:58 +0530 Subject: [PATCH 02/31] feat: engines entry Signed-off-by: Azanul --- dashboard/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dashboard/package.json b/dashboard/package.json index 312ba57c8..5ae685ecd 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -2,6 +2,9 @@ "name": "komiser-dashboard", "version": "3.1.0", "private": true, + "engines": { + "node": ">=14.21.3" + }, "scripts": { "dev": "next dev -p 3002", "build": "next build", From 64650a2a20a612406dc94e88cefd70722aa283f0 Mon Sep 17 00:00:00 2001 From: Azanul Date: Tue, 5 Mar 2024 17:03:25 +0530 Subject: [PATCH 03/31] feat: reduce code duplication Signed-off-by: Azanul --- dashboard/pages/onboarding/choose-database.tsx | 4 ++-- dashboard/utils/providerHelper.ts | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/dashboard/pages/onboarding/choose-database.tsx b/dashboard/pages/onboarding/choose-database.tsx index 3976a3767..e27771001 100644 --- a/dashboard/pages/onboarding/choose-database.tsx +++ b/dashboard/pages/onboarding/choose-database.tsx @@ -111,14 +111,14 @@ export default function ChooseDatabase() { diff --git a/dashboard/utils/providerHelper.ts b/dashboard/utils/providerHelper.ts index e4155e737..2077ba5df 100644 --- a/dashboard/utils/providerHelper.ts +++ b/dashboard/utils/providerHelper.ts @@ -48,12 +48,11 @@ export const allProviders: { [key in ProviderKey]: Provider } = { }; export type DBProvider = 'postgres' | 'sqlite'; -type DBProviderKey = 'POSTGRES' | 'SQLITE'; -export const allDBProviders: { [key in DBProviderKey]: DBProvider } = { - POSTGRES: 'postgres', - SQLITE: 'sqlite' -}; +export enum allDBProviders { + POSTGRES = 'postgres', + SQLITE = 'sqlite' +} export enum IntegrationProvider { SLACK = 'slack', From 252bf731318ca33dd33dc6c9ae8603b8d7bec5e0 Mon Sep 17 00:00:00 2001 From: Azanul Date: Fri, 8 Mar 2024 10:00:43 +0530 Subject: [PATCH 04/31] feat: update codeowners Signed-off-by: Azanul --- .github/CODEOWNERS | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0d3c9b20d..d354b4ae6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -* @mlabouardy @ShubhamPalriwala @AvineshTripathi @greghub @Traxmaxx @Kolawole99 @Azanul @jakepage91 -docs @jakepage91 -README.md @jakepage91 -CONTRIBUTING.md @jakepage91 +* @mlabouardy @AvineshTripathi @greghub @Azanul +docs @mlabouardy +README.md @mlabouardy +CONTRIBUTING.md @mlabouardy From 6ccc4acdaf86bc3037c700b75870396346e4dd33 Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 13 Mar 2024 12:22:36 +0530 Subject: [PATCH 05/31] feat: Azure cost PoC Signed-off-by: Azanul --- go.mod | 19 ++++++----- go.sum | 37 ++++++++++++--------- providers/azure/compute/virtual_machines.go | 28 +++++++++++++++- 3 files changed, 58 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 56808c5cf..3901459b9 100644 --- a/go.mod +++ b/go.mod @@ -10,8 +10,8 @@ require ( cloud.google.com/go/monitoring v1.13.0 cloud.google.com/go/redis v1.11.0 cloud.google.com/go/storage v1.30.0 - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.1 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.1.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databox/armdatabox v1.0.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 @@ -68,7 +68,7 @@ require ( github.com/siruspen/logrus v1.7.1 github.com/slack-go/slack v0.12.1 github.com/spf13/cobra v1.6.1 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.582 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.582 github.com/uptrace/bun v1.1.8 @@ -89,6 +89,7 @@ require ( github.com/apache/arrow/go/v11 v11.0.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.0 // indirect github.com/google/s2a-go v0.1.4 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect @@ -99,8 +100,9 @@ require ( cloud.google.com/go/certificatemanager v1.6.0 cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v0.13.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement v1.1.1 + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect github.com/andybalholm/brotli v1.0.4 // indirect github.com/apache/thrift v0.16.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1 // indirect @@ -143,7 +145,6 @@ require ( github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.4.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/flatbuffers v2.0.8+incompatible // indirect @@ -151,7 +152,7 @@ require ( github.com/google/go-cmp v0.5.9 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.5.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.11.0 // indirect github.com/gorilla/websocket v1.4.2 // indirect @@ -178,7 +179,7 @@ require ( github.com/openlyinc/pointy v1.2.0 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pierrec/lz4/v4 v4.1.15 // indirect - github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect @@ -196,7 +197,7 @@ require ( golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.17.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/net v0.19.0 // indirect golang.org/x/sync v0.2.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect diff --git a/go.sum b/go.sum index b107cb719..f3558b11d 100644 --- a/go.sum +++ b/go.sum @@ -26,16 +26,18 @@ cloud.google.com/go/redis v1.11.0 h1:JoAd3SkeDt3rLFAAxEvw6wV4t+8y4ZzfZcZmddqphQ8 cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= cloud.google.com/go/storage v1.30.0 h1:g1yrbxAWOrvg/594228pETWkOi00MLTrOWfh56veU5o= cloud.google.com/go/storage v1.30.0/go.mod h1:xAVretHSROm1BQX4IIsoVgJqw0LqOyX+I/O2GzRAzdE= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.1 h1:gVXuXcWd1i4C2Ruxe321aU+IKGaStvGB/S90PUPB/W8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.1/go.mod h1:DffdKW9RFqa5VgmsjUOsS7UE7eiA5iAvYUs63bhKQ0M= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1 h1:T8quHYlUGyb/oqtSTwqlCr1ilJHrDv+ZtpSfo+hm1BU= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 h1:H3g2mkmu105ON0c/Gqx3Bm+bzoIijLom8LmV9Gjn7X0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1/go.mod h1:EAc3kjhZf9soch7yLID8PeKcE6VfKvQTllSBHYVdXd8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.1.0 h1:Vjq3Uy3JAU1DTxbA+uX6BegIhgO2pyFltbfbmDa9KdI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.1.0/go.mod h1:Q3u+T/qw3Kb1Wf3DFKiFwEZlyaAyPb4yBgWm9wq7yh8= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement v1.1.1 h1:ehSLdbLah6kk6HTVc6e/lrbmbz7MMbpNxkOd3OYlhB0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement v1.1.1/go.mod h1:Am1cUioOk0HdZIsjpXJkQ4RIeQbwYsW6LkNIc5z/5XY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databox/armdatabox v1.0.0 h1:s55dRuEFkOZTkZNbaiwkTa7qv8un39PTo/YPUpciQY0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databox/armdatabox v1.0.0/go.mod h1:43obBGNGAM/4TLKn6H25WZgNyASDm7CgnTfTDlibyvI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0 h1:lMW1lD/17LUA5z1XTURo7LcVG2ICBPlyMHjIUrcFZNQ= @@ -48,8 +50,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.0.0 h1:rycGP github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.0.0/go.mod h1:lirt6L2DmxromyM4w5Vd2QPz4PrWRV38Izy43xgkBVI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1 h1:oPdPEZFSbl7oSPEAIPMPBMUmiL+mqgzBJwM/9qYcwNg= -github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -268,8 +270,8 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= -github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= @@ -320,8 +322,9 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= @@ -432,8 +435,8 @@ github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0 github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -482,8 +485,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.582 h1:Td+y4Y5xkPq5pa7DgMK09ycp5lPnx2UZ7GMLMvhW7Ns= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.582/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.582 h1:I9ihQehFbwNzVA23auWISoKc57BcyZSdsXznEoQLb94= @@ -566,8 +570,8 @@ golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= @@ -606,6 +610,7 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/providers/azure/compute/virtual_machines.go b/providers/azure/compute/virtual_machines.go index 67b715423..22e86812b 100644 --- a/providers/azure/compute/virtual_machines.go +++ b/providers/azure/compute/virtual_machines.go @@ -6,7 +6,10 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/arm/policy" + "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4" + "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement" log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" @@ -21,6 +24,11 @@ func VirtualMachines(ctx context.Context, client providers.ProviderClient) ([]mo return resources, err } + costClient, err := armcostmanagement.NewQueryClient(client.AzureClient.Credentials, &policy.ClientOptions{}) + if err != nil { + return resources, err + } + pager := svc.NewListAllPager(nil) for pager.More() { page, err := pager.NextPage(ctx) @@ -30,6 +38,24 @@ func VirtualMachines(ctx context.Context, client providers.ProviderClient) ([]mo for _, vm := range page.VirtualMachineListResult.Value { tags := make([]models.Tag, 0) + queryResult, err := costClient.Usage(ctx, "subscriptions/"+client.AzureClient.SubscriptionId, armcostmanagement.QueryDefinition{ + Type: to.Ptr(armcostmanagement.ExportTypeUsage), + Dataset: &armcostmanagement.QueryDataset{ + Aggregation: map[string]*armcostmanagement.QueryAggregation{ + "totalCost": { + Name: to.Ptr("PreTaxCost"), + Function: to.Ptr(armcostmanagement.FunctionTypeSum), + }, + }, + Granularity: to.Ptr(armcostmanagement.GranularityType("None")), + }, + Timeframe: to.Ptr(armcostmanagement.TimeframeTypeMonthToDate), + }, nil) + if err != nil { + return resources, err + } + + cost := queryResult.Properties.Rows[0][0].(float64) for key, value := range vm.Tags { tags = append(tags, models.Tag{ @@ -44,7 +70,7 @@ func VirtualMachines(ctx context.Context, client providers.ProviderClient) ([]mo Service: "Virtual Machine", Region: *vm.Location, ResourceId: *vm.ID, - Cost: 0, + Cost: cost, Name: *vm.Name, FetchedAt: time.Now(), Tags: tags, From 98186b582b154b847ab0f6a8fb8d45c5b50d870f Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 13 Mar 2024 16:57:39 +0530 Subject: [PATCH 06/31] feat: log schema setup err Signed-off-by: Azanul --- utils/database.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/database.go b/utils/database.go index 74239fc6c..84f3daf16 100644 --- a/utils/database.go +++ b/utils/database.go @@ -35,7 +35,7 @@ func SetupSchema(db *bun.DB, c *models.Config, accounts []models.Account) error account.Status = "CONNECTED" _, err = db.NewInsert().Model(&account).Exec(context.Background()) if err != nil { - log.Warnf("%s account cannot be inserted to database", account.Provider) + log.Warnf("%s account cannot be inserted to database\n%v", account.Provider, err) } } From 5c7abbfbfaa46f157350171dddb5862d9210dd89 Mon Sep 17 00:00:00 2001 From: Azanul Date: Sat, 16 Mar 2024 04:24:09 +0530 Subject: [PATCH 07/31] feat: log usage err Signed-off-by: Azanul --- providers/azure/compute/virtual_machines.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/azure/compute/virtual_machines.go b/providers/azure/compute/virtual_machines.go index 22e86812b..48f308449 100644 --- a/providers/azure/compute/virtual_machines.go +++ b/providers/azure/compute/virtual_machines.go @@ -52,7 +52,7 @@ func VirtualMachines(ctx context.Context, client providers.ProviderClient) ([]mo Timeframe: to.Ptr(armcostmanagement.TimeframeTypeMonthToDate), }, nil) if err != nil { - return resources, err + log.Warnf("failed to query usage: %v\n", err) } cost := queryResult.Properties.Rows[0][0].(float64) From 180eee721d6e16341b21a248759524bb5aceddb3 Mon Sep 17 00:00:00 2001 From: Azanul Date: Thu, 28 Mar 2024 15:17:18 +0530 Subject: [PATCH 08/31] fix: aws config env vars support Signed-off-by: Azanul --- handlers/helper.go | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/handlers/helper.go b/handlers/helper.go index ca22e10f6..e26ccfbd9 100644 --- a/handlers/helper.go +++ b/handlers/helper.go @@ -370,10 +370,14 @@ func populateConfigFromAccount(account models.Account, config *models.Config) er switch account.Provider { case "aws": awsConfig := models.AWSConfig{ - Name: account.Name, - Profile: account.Credentials["profile"], - Path: account.Credentials["path"], - Source: account.Credentials["source"], + Name: account.Name, + Source: account.Credentials["source"], + } + if account.Credentials["source"] == "credentials-file" { + awsConfig.Profile = account.Credentials["profile"] + if path, ok := account.Credentials["path"]; ok && len(path) > 0 { + awsConfig.Path = account.Credentials["path"] + } } config.AWS = append(config.AWS, awsConfig) @@ -443,38 +447,38 @@ func populateConfigFromAccount(account models.Account, config *models.Config) er case "mongodb": mongoDBAtlasConfig := models.MongoDBAtlasConfig{ - Name: account.Name, - PublicApiKey: account.Credentials["publicKey"], - PrivateApiKey: account.Credentials["privateKey"], + Name: account.Name, + PublicApiKey: account.Credentials["publicKey"], + PrivateApiKey: account.Credentials["privateKey"], OrganizationID: account.Credentials["organizationId"], } config.MongoDBAtlas = append(config.MongoDBAtlas, mongoDBAtlasConfig) case "gcp": gcpConfig := models.GCPConfig{ - Name: account.Name, + Name: account.Name, ServiceAccountKeyPath: account.Credentials["accountKey"], } config.GCP = append(config.GCP, gcpConfig) case "ovh": ovhConfig := models.OVHConfig{ - Name: account.Name, - Endpoint: account.Credentials["endpoint"], - ApplicationKey: account.Credentials["applicationKey"], + Name: account.Name, + Endpoint: account.Credentials["endpoint"], + ApplicationKey: account.Credentials["applicationKey"], ApplicationSecret: account.Credentials["applicationSecret"], - ConsumerKey: account.Credentials["consumerKey"], + ConsumerKey: account.Credentials["consumerKey"], } config.OVH = append(config.OVH, ovhConfig) default: - return fmt.Errorf("Illegle provider") + return fmt.Errorf("illegle provider") } return nil } -func updateConfig(path string, cfg *models.Config) error { +func updateConfig(path string, cfg *models.Config) error { mu.Lock() defer mu.Unlock() @@ -491,4 +495,4 @@ func updateConfig(path string, cfg *models.Config) error { return err } return nil -} \ No newline at end of file +} From e8e57bd4b1ff1cec3e40874e25687731c050dc7c Mon Sep 17 00:00:00 2001 From: Azanul Date: Tue, 2 Apr 2024 23:47:33 +0530 Subject: [PATCH 09/31] feat: log schema setup err Signed-off-by: Azanul --- handlers/helper.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/handlers/helper.go b/handlers/helper.go index e26ccfbd9..9fc840ac9 100644 --- a/handlers/helper.go +++ b/handlers/helper.go @@ -189,7 +189,7 @@ func makeClientFromAccount(account models.Account) (*providers.ProviderClient, e Name: account.Name, }, err } - } else if account.Credentials["source"] == "environment-variables" { + } else { cfg, err := awsConfig.LoadDefaultConfig(context.Background()) if err != nil { return nil, err @@ -370,8 +370,8 @@ func populateConfigFromAccount(account models.Account, config *models.Config) er switch account.Provider { case "aws": awsConfig := models.AWSConfig{ - Name: account.Name, - Source: account.Credentials["source"], + Name: account.Name, + Source: account.Credentials["source"], } if account.Credentials["source"] == "credentials-file" { awsConfig.Profile = account.Credentials["profile"] From 14be2e1ace7b7ba6468048ad9ffdecc4a54e02da Mon Sep 17 00:00:00 2001 From: Azanul Date: Fri, 5 Apr 2024 15:15:17 +0530 Subject: [PATCH 10/31] feat: separate create config Signed-off-by: Azanul --- cmd/config.go | 28 ++-------------------------- internal/config/create.go | 38 ++++++++++++++++++++++++++++++++++++++ internal/config/load.go | 9 ++++----- 3 files changed, 44 insertions(+), 31 deletions(-) create mode 100644 internal/config/create.go diff --git a/cmd/config.go b/cmd/config.go index f50eebdb2..577df243e 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -1,12 +1,8 @@ package cmd import ( - "os" - - "github.com/BurntSushi/toml" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/internal/config" ) var configCmd = &cobra.Command{ @@ -14,30 +10,10 @@ var configCmd = &cobra.Command{ Short: "Create configuration file", Long: ``, Run: func(cmd *cobra.Command, args []string) { - c := models.Config{ - AWS: []models.AWSConfig{ - { - Name: "Demo", - Source: "CREDENTIALS_FILE", - Profile: "default", - }, - }, - SQLite: models.SQLiteConfig{ - File: "komiser.db", - }, - } - - f, err := os.Create("config.toml") + err := config.Create(nil) if err != nil { log.Fatal(err) } - if err := toml.NewEncoder(f).Encode(c); err != nil { - log.Fatal(err) - } - if err := f.Close(); err != nil { - log.Fatal(err) - - } }, } diff --git a/internal/config/create.go b/internal/config/create.go new file mode 100644 index 000000000..1ac780e6d --- /dev/null +++ b/internal/config/create.go @@ -0,0 +1,38 @@ +package config + +import ( + "os" + + "github.com/BurntSushi/toml" + "github.com/tailwarden/komiser/models" +) + +const DefaultFileName = "config.toml" + +var demoConfig = models.Config{ + AWS: []models.AWSConfig{ + { + Name: "Demo", + Source: "CREDENTIALS_FILE", + Profile: "default", + }, + }, + SQLite: models.SQLiteConfig{ + File: "komiser.db", + }, +} + +func Create(c *models.Config) error { + if c == nil { + c = &demoConfig + } + + f, err := os.Create(DefaultFileName) + if err != nil { + return err + } + if err := toml.NewEncoder(f).Encode(*c); err != nil { + return err + } + return f.Close() +} diff --git a/internal/config/load.go b/internal/config/load.go index 9bef16fd5..aadbfc8e9 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -21,7 +21,6 @@ import ( "github.com/ovh/go-ovh/ovh" "github.com/scaleway/scaleway-sdk-go/scw" "github.com/tailwarden/komiser/models" - . "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/providers" "github.com/tailwarden/komiser/utils" tccommon "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" @@ -36,7 +35,7 @@ import ( "k8s.io/client-go/tools/clientcmd" ) -func loadConfigFromFile(path string) (*Config, error) { +func loadConfigFromFile(path string) (*models.Config, error) { filename, err := filepath.Abs(path) if err != nil { return nil, err @@ -54,8 +53,8 @@ func loadConfigFromFile(path string) (*Config, error) { return loadConfigFromBytes(yamlFile) } -func loadConfigFromBytes(b []byte) (*Config, error) { - var config Config +func loadConfigFromBytes(b []byte) (*models.Config, error) { + var config models.Config err := toml.Unmarshal([]byte(b), &config) if err != nil { @@ -65,7 +64,7 @@ func loadConfigFromBytes(b []byte) (*Config, error) { return &config, nil } -func Load(configPath string, telemetry bool, analytics utils.Analytics, db *bun.DB) (*Config, []providers.ProviderClient, []models.Account, error) { +func Load(configPath string, telemetry bool, analytics utils.Analytics, db *bun.DB) (*models.Config, []providers.ProviderClient, []models.Account, error) { config, err := loadConfigFromFile(configPath) if err != nil { return nil, nil, nil, err From a9723eb0c8e1cd9396f2af7c20bb0b2352869037 Mon Sep 17 00:00:00 2001 From: Azanul Date: Fri, 5 Apr 2024 15:24:14 +0530 Subject: [PATCH 11/31] feat: use util to create config Signed-off-by: Azanul --- cmd/config.go | 2 ++ cmd/start.go | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/config.go b/cmd/config.go index 577df243e..5fd8d1e77 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -1,6 +1,8 @@ package cmd import ( + "log" + "github.com/spf13/cobra" "github.com/tailwarden/komiser/internal/config" ) diff --git a/cmd/start.go b/cmd/start.go index d88d83319..5d00dc4f7 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -10,6 +10,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/tailwarden/komiser/internal" + "github.com/tailwarden/komiser/internal/config" "github.com/tailwarden/komiser/utils" ) @@ -38,8 +39,8 @@ var startCmd = &cobra.Command{ if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) { log.Info("unable to use given config file:", err) - log.Info("Creating default config.toml") - err = os.WriteFile("config.toml", []byte{}, 0644) + log.Info("Creating default config file:", config.DefaultFileName) + err = config.Create(nil) if err != nil { return err } From f3d351e0ee1d84d5b8c3faf2ded4762a91aea0ff Mon Sep 17 00:00:00 2001 From: Azanul Date: Sat, 20 Apr 2024 10:51:36 +0530 Subject: [PATCH 12/31] refac: clean code Signed-off-by: Azanul --- internal/alerts.go | 63 +++ internal/config/load.go | 3 +- internal/internal.go | 487 +----------------- internal/report.go | 126 +++++ internal/resources.go | 121 +++++ .../{internal_test.go => resources_test.go} | 4 +- internal/server.go | 52 ++ internal/webhook.go | 116 +++++ utils/database.go | 35 ++ 9 files changed, 528 insertions(+), 479 deletions(-) create mode 100644 internal/alerts.go create mode 100644 internal/report.go create mode 100644 internal/resources.go rename internal/{internal_test.go => resources_test.go} (91%) create mode 100644 internal/server.go create mode 100644 internal/webhook.go diff --git a/internal/alerts.go b/internal/alerts.go new file mode 100644 index 000000000..1b88794a9 --- /dev/null +++ b/internal/alerts.go @@ -0,0 +1,63 @@ +package internal + +import ( + "context" + "fmt" + + log "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/models" +) + +func checkingAlerts(ctx context.Context, cfg models.Config, telemetry bool, port int, alerts []models.Alert) { + for _, alert := range alerts { + var view models.View + err := db.NewRaw(fmt.Sprintf("SELECT * FROM views WHERE id = %s", alert.ViewId)).Scan(ctx, &view) + if err != nil { + log.WithError(err).Error("scan failed") + } + + stats, err := getViewStats(ctx, view.Filters) + if err != nil { + log.Error("Couldn't get stats for view:", view.Name) + } else { + if alert.Type == "BUDGET" && alert.Budget <= stats.Costs { + if telemetry { + analytics.TrackEvent("sending_alerts", map[string]interface{}{ + "type": "budget", + }) + } + if alert.IsSlack { + log.Info("Sending Slack budget alert for view:", view.Name) + hitSlackWebhook(view.Name, port, int(view.Id), 0, stats.Costs, cfg.Slack.Webhook, alert.Type) + } else { + log.Info("Sending Custom Webhook budget alert for view:", view.Name) + hitCustomWebhook(alert.Endpoint, alert.Secret, view.Name, 0, stats.Costs, alert.Type) + } + } + if alert.Type == "USAGE" && alert.Usage <= stats.Resources { + if telemetry { + analytics.TrackEvent("sending_alerts", map[string]interface{}{ + "type": "usage", + }) + } + if alert.IsSlack { + log.Info("Sending Slack usage alert for view:", view.Name) + hitSlackWebhook(view.Name, port, int(view.Id), stats.Resources, 0, cfg.Slack.Webhook, alert.Type) + } else { + log.Info("Sending Custom Webhook usage alert for view:", view.Name) + hitCustomWebhook(alert.Endpoint, alert.Secret, view.Name, stats.Resources, 0, alert.Type) + } + } + } + } +} + +func listAlerts(ctx context.Context) ([]models.Alert, error) { + alerts := make([]models.Alert, 0) + + err := db.NewRaw("SELECT * FROM alerts").Scan(ctx, &alerts) + if err != nil { + return alerts, err + } + return alerts, nil +} diff --git a/internal/config/load.go b/internal/config/load.go index aadbfc8e9..9f11119ec 100644 --- a/internal/config/load.go +++ b/internal/config/load.go @@ -27,7 +27,6 @@ import ( "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/regions" tccvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312" - "github.com/uptrace/bun" "go.mongodb.org/atlas/mongodbatlas" "golang.org/x/oauth2" "golang.org/x/oauth2/google" @@ -64,7 +63,7 @@ func loadConfigFromBytes(b []byte) (*models.Config, error) { return &config, nil } -func Load(configPath string, telemetry bool, analytics utils.Analytics, db *bun.DB) (*models.Config, []providers.ProviderClient, []models.Account, error) { +func Load(configPath string, telemetry bool, analytics utils.Analytics) (*models.Config, []providers.ProviderClient, []models.Account, error) { config, err := loadConfigFromFile(configPath) if err != nil { return nil, nil, nil, err diff --git a/internal/internal.go b/internal/internal.go index 368ab6bad..1b2f5b763 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -1,9 +1,7 @@ package internal import ( - "bytes" "context" - "database/sql" "encoding/json" "errors" "fmt" @@ -11,39 +9,17 @@ import ( "runtime" "strconv" "strings" - "sync" "time" - "github.com/getsentry/sentry-go" - "github.com/gin-gonic/gin" "github.com/go-co-op/gocron" "github.com/hashicorp/go-version" log "github.com/sirupsen/logrus" - "github.com/slack-go/slack" "github.com/uptrace/bun/dialect" - "github.com/uptrace/bun/dialect/pgdialect" - "github.com/uptrace/bun/dialect/sqlitedialect" - "github.com/uptrace/bun/driver/pgdriver" - "github.com/uptrace/bun/driver/sqliteshim" "github.com/spf13/cobra" - v1 "github.com/tailwarden/komiser/internal/api/v1" "github.com/tailwarden/komiser/internal/config" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/providers" - "github.com/tailwarden/komiser/providers/aws" - "github.com/tailwarden/komiser/providers/azure" - "github.com/tailwarden/komiser/providers/civo" - do "github.com/tailwarden/komiser/providers/digitalocean" - "github.com/tailwarden/komiser/providers/gcp" - "github.com/tailwarden/komiser/providers/k8s" - "github.com/tailwarden/komiser/providers/linode" - "github.com/tailwarden/komiser/providers/mongodbatlas" - "github.com/tailwarden/komiser/providers/oci" - "github.com/tailwarden/komiser/providers/ovh" - - "github.com/tailwarden/komiser/providers/scaleway" - "github.com/tailwarden/komiser/providers/tencent" + "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" ) @@ -62,12 +38,12 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A ctx := context.Background() - cfg, clients, accounts, err := config.Load(configPath, telemetry, analytics, db) + cfg, clients, accounts, err := config.Load(configPath, telemetry, analytics) if err != nil { return err } - err = setupDBConnection(cfg) + err = utils.SetupDBConnection(cfg, db) if err != nil { return err } @@ -91,16 +67,17 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A } _, err = cron.Every(1).Hours().Do(func() { - alertsExist, alerts := checkIfAlertsExist(ctx) - - if alertsExist { + alerts, err := listAlerts(ctx) + if err != nil { + log.WithError(err).Error("failed to list alerts") + } + if len(alerts) > 0 { log.Info("Checking Alerts") checkingAlerts(ctx, *cfg, telemetry, port, alerts) } }) - if err != nil { - log.WithError(err).Error("setting up cron job failed") + log.WithError(err).Error("failed to setup alert checking cron job") } _, err = cron.Every(1).Friday().At("09:00").Do(func() { @@ -110,9 +87,8 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A sendCostBreakdownReport(ctx, *cfg) } }) - if err != nil { - log.WithError(err).Error("setting up cron job failed") + log.WithError(err).Error("failed to setup cron job") } cron.StartAsync() @@ -124,189 +100,9 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A if err != nil { return err } - - return nil -} - -func checkIfAlertsExist(ctx context.Context) (bool, []models.Alert) { - alerts := make([]models.Alert, 0) - - err := db.NewRaw("SELECT * FROM alerts").Scan(ctx, &alerts) - if err != nil { - log.WithError(err).Error("scan failed") - } - if len(alerts) > 0 { - return true, alerts - } - - return false, alerts -} - -func loggingMiddleware() gin.HandlerFunc { - return func(ctx *gin.Context) { - startTime := time.Now() - ctx.Next() - endTime := time.Now() - latencyTime := endTime.Sub(startTime) - reqMethod := ctx.Request.Method - reqUri := ctx.Request.RequestURI - statusCode := ctx.Writer.Status() - clientIP := ctx.ClientIP() - - log.WithFields(log.Fields{ - "method": reqMethod, - "uri": reqUri, - "status": statusCode, - "latency": latencyTime, - "ip": clientIP, - }).Info("HTTP request") - - ctx.Next() - } -} - -func runServer(address string, port int, telemetry bool, cfg models.Config, configPath string, accounts []models.Account) error { - log.Infof("Komiser version: %s, commit: %s, buildt: %s", Version, Commit, Buildtime) - - r := v1.Endpoints(context.Background(), telemetry, analytics, db, cfg, configPath, accounts) - - r.Use(loggingMiddleware()) - - if err := r.Run(fmt.Sprintf("%s:%d", address, port)); err != nil { - return err - } - - log.Infof("Server started on %s:%d", address, port) - - return nil -} - -func setupDBConnection(c *models.Config) error { - var sqldb *sql.DB - var err error - - if len(c.SQLite.File) == 0 && len(c.Postgres.URI) == 0 { - log.Println("Database wasn't configured yet") - return nil - } - - if len(c.SQLite.File) > 0 { - sqldb, err = sql.Open(sqliteshim.ShimName, fmt.Sprintf("file:%s?cache=shared", c.SQLite.File)) - if err != nil { - return err - } - sqldb.SetMaxIdleConns(1000) - sqldb.SetConnMaxLifetime(0) - - db = bun.NewDB(sqldb, sqlitedialect.New()) - - log.Println("Data will be stored in SQLite") - } else { - sqldb = sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(c.Postgres.URI))) - db = bun.NewDB(sqldb, pgdialect.New()) - log.Println("Data will be stored in PostgreSQL") - } - return nil } -func triggerFetchingWorkflow(ctx context.Context, client providers.ProviderClient, provider string, telemetry bool, regions []string, wp *providers.WorkerPool) { - localHub := sentry.CurrentHub().Clone() - - defer func() { - err := recover() - if err != nil { - log.WithField("err", err).Error(fmt.Sprintf("error fetching %s resources", provider)) - localHub.CaptureException(err.(error)) - localHub.Flush(2 * time.Second) - } - }() - - localHub.ConfigureScope(func(scope *sentry.Scope) { - scope.SetTag("provider", provider) - }) - - if telemetry { - analytics.TrackEvent("fetching_resources", map[string]interface{}{ - "provider": provider, - }) - } - - switch provider { - case "AWS": - aws.FetchResources(ctx, client, regions, db, telemetry, analytics, wp) - case "DigitalOcean": - do.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "OCI": - oci.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "Civo": - civo.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "Kubernetes": - k8s.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "Linode": - linode.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "Tencent": - tencent.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "Azure": - azure.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "Scaleway": - scaleway.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "MongoDBAtlas": - mongodbatlas.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "GCP": - gcp.FetchResources(ctx, client, db, telemetry, analytics, wp) - case "OVH": - ovh.FetchResources(ctx, client, db, telemetry, analytics, wp) - } -} - -func fetchResources(ctx context.Context, clients []providers.ProviderClient, regions []string, telemetry bool) { - numWorkers := 64 - wp := providers.NewWorkerPool(numWorkers) - wp.Start() - - var wwg sync.WaitGroup - workflowTrigger := func(client providers.ProviderClient, provider string) { - wwg.Add(1) - go func() { - defer wwg.Done() - triggerFetchingWorkflow(ctx, client, provider, telemetry, regions, wp) - }() - } - - for _, client := range clients { - if client.AWSClient != nil { - workflowTrigger(client, "AWS") - } else if client.DigitalOceanClient != nil { - workflowTrigger(client, "DigitalOcean") - } else if client.OciClient != nil { - workflowTrigger(client, "OCI") - } else if client.CivoClient != nil { - workflowTrigger(client, "Civo") - } else if client.K8sClient != nil { - workflowTrigger(client, "Kubernetes") - } else if client.LinodeClient != nil { - workflowTrigger(client, "Linode") - } else if client.TencentClient != nil { - workflowTrigger(client, "Tencent") - } else if client.AzureClient != nil { - workflowTrigger(client, "Azure") - } else if client.ScalewayClient != nil { - workflowTrigger(client, "Scaleway") - } else if client.MongoDBAtlasClient != nil { - workflowTrigger(client, "MongoDBAtlas") - } else if client.GCPClient != nil { - workflowTrigger(client, "GCP") - } else if client.OVHClient != nil { - workflowTrigger(client, "OVH") - } - log.Println("Workflow triggered for client:", client.Name) - } - - wwg.Wait() - wp.Wait() -} - func checkUpgrade() { url := "https://api.github.com/repos/tailwarden/komiser/releases/latest" type GHRelease struct { @@ -344,152 +140,6 @@ func checkUpgrade() { } } -func hitCustomWebhook(endpoint string, secret string, viewName string, resources int, cost float64, alertType string) { - var payloadJSON []byte - var err error - payload := models.CustomWebhookPayload{ - Komiser: Version, - View: viewName, - Timestamp: time.Now().Unix(), - } - - switch alertType { - case "BUDGET": - payload.Message = "Cost alert" - payload.Data = cost - case "USAGE": - payload.Message = "Usage alert" - payload.Data = float64(resources) - default: - log.Error("Invalid Alert Type") - return - } - - payloadJSON, err = json.Marshal(payload) - if err != nil { - log.Error("Couldn't encode JSON payload:", err) - return - } - - req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(payloadJSON)) - if err != nil { - log.Error("Couldn't create HTTP request for custom webhook endpoint:", err) - return - } - - req.Header.Set("Content-Type", "application/json") - if len(secret) > 0 { - req.Header.Set("Authorization", secret) - } - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - log.Error("Couldn't make HTTP request for custom webhook endpoint:", err) - return - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - log.Error("Custom Webhook with endpoint " + endpoint + " returned back a status code of " + string(rune(resp.StatusCode)) + " . Expected Status Code: 200") - return - } -} - -func hitSlackWebhook(viewName string, port int, viewId int, resources int, cost float64, webhookUrl string, alertType string) { - attachment := slack.Attachment{ - Color: "danger", - AuthorName: "Komiser", - AuthorSubname: "by Tailwarden", - AuthorLink: "https://tailwarden.com", - AuthorIcon: "https://cdn.komiser.io/images/komiser-logo.jpeg", - Footer: "Komiser", - Actions: []slack.AttachmentAction{ - { - Name: "open", - Text: "Open view", - Type: "button", - URL: fmt.Sprintf("http://localhost:%d/inventory?view=%d", port, viewId), - }, - }, - Fields: []slack.AttachmentField{ - { - Title: "View", - Value: viewName, - }, - }, - FooterIcon: "https://github.com/tailwarden/komiser", - Ts: json.Number(strconv.FormatInt(time.Now().Unix(), 10)), - } - - if alertType == "BUDGET" { - attachment.Text = "Cost alert :warning:" - attachment.Fields = append(attachment.Fields, slack.AttachmentField{ - Title: "Cost", - Value: fmt.Sprintf("%.2f$", cost), - }) - } else if alertType == "USAGE" { - attachment.Text = "Usage alert :warning:" - attachment.Fields = append(attachment.Fields, slack.AttachmentField{ - Title: "Resources", - Value: fmt.Sprintf("%d", resources), - }) - } - - msg := slack.WebhookMessage{ - Attachments: []slack.Attachment{attachment}, - } - - err := slack.PostWebhook(webhookUrl, &msg) - if err != nil { - log.Warn(err) - } - -} - -func checkingAlerts(ctx context.Context, cfg models.Config, telemetry bool, port int, alerts []models.Alert) { - for _, alert := range alerts { - var view models.View - err := db.NewRaw(fmt.Sprintf("SELECT * FROM views WHERE id = %s", alert.ViewId)).Scan(ctx, &view) - if err != nil { - log.WithError(err).Error("scan failed") - } - - stats, err := getViewStats(ctx, view.Filters) - if err != nil { - log.Error("Couldn't get stats for view:", view.Name) - } else { - if alert.Type == "BUDGET" && alert.Budget <= stats.Costs { - if telemetry { - analytics.TrackEvent("sending_alerts", map[string]interface{}{ - "type": "budget", - }) - } - if alert.IsSlack { - log.Info("Sending Slack budget alert for view:", view.Name) - hitSlackWebhook(view.Name, port, int(view.Id), 0, stats.Costs, cfg.Slack.Webhook, alert.Type) - } else { - log.Info("Sending Custom Webhook budget alert for view:", view.Name) - hitCustomWebhook(alert.Endpoint, alert.Secret, view.Name, 0, stats.Costs, alert.Type) - } - } - if alert.Type == "USAGE" && alert.Usage <= stats.Resources { - if telemetry { - analytics.TrackEvent("sending_alerts", map[string]interface{}{ - "type": "usage", - }) - } - if alert.IsSlack { - log.Info("Sending Slack usage alert for view:", view.Name) - hitSlackWebhook(view.Name, port, int(view.Id), stats.Resources, 0, cfg.Slack.Webhook, alert.Type) - } else { - log.Info("Sending Custom Webhook usage alert for view:", view.Name) - hitCustomWebhook(alert.Endpoint, alert.Secret, view.Name, stats.Resources, 0, alert.Type) - } - } - } - } -} - func getViewStats(ctx context.Context, filters []models.Filter) (models.ViewStat, error) { filterWithTags := false whereQueries := make([]string, 0) @@ -566,7 +216,7 @@ func getViewStats(ctx context.Context, filters []models.Filter) (models.ViewStat whereQueries = append(whereQueries, fmt.Sprintf("((res->>'key' = '%s') AND (res->>'value' != ''))", key)) } default: - return models.ViewStat{}, errors.New("Operation is invalid or not supported") + return models.ViewStat{}, errors.New("operation is invalid or not supported") } } else if filter.Field == "tags" { switch filter.Operator { @@ -583,7 +233,7 @@ func getViewStats(ctx context.Context, filters []models.Filter) (models.ViewStat whereQueries = append(whereQueries, "jsonb_array_length(tags) != 0") } default: - return models.ViewStat{}, errors.New("Operation is invalid or not supported") + return models.ViewStat{}, errors.New("operation is invalid or not supported") } } else if filter.Field == "cost" { switch filter.Operator { @@ -685,116 +335,3 @@ func getViewStats(ctx context.Context, filters []models.Filter) (models.ViewStat return output, nil } } - -func sendTagsCoverageReport(ctx context.Context, cfg models.Config) { - tags := make([]struct { - Total int `bun:"total"` - Label models.Tag `bun:"label"` - }, 0) - - err := db.NewRaw("SELECT count(*) as total, value as label FROM resources CROSS JOIN json_each(tags) GROUP BY value ORDER BY total DESC").Scan(ctx, &tags) - if err != nil { - log.WithError(err).Error("scan failed") - } - - fields := make([]slack.AttachmentField, 0) - - for _, tag := range tags { - fields = append(fields, slack.AttachmentField{ - Title: fmt.Sprintf("%s:%s", tag.Label.Key, tag.Label.Value), - Value: fmt.Sprintf("%d", tag.Total), - Short: true, - }) - } - - output := struct { - Total int `bun:"total"` - }{} - - err = db.NewRaw("SELECT COUNT(*) as total FROM resources where json_array_length(tags) = 0;").Scan(ctx, &output) - if err != nil { - log.WithError(err).Error("scan failed") - } - - currentTime := time.Now() - - attachment := slack.Attachment{ - Color: "good", - AuthorName: "Komiser", - AuthorSubname: "by Tailwarden", - AuthorLink: "https://tailwarden.com", - AuthorIcon: "https://cdn.komiser.io/images/komiser-logo.jpeg", - Text: fmt.Sprintf("On %s %d: *%d* of your resources are untagged. Below list of most used key/value pairs:", currentTime.Month(), currentTime.Day(), output.Total), - Footer: "Komiser", - Fields: fields, - FooterIcon: "https://github.com/tailwarden/komiser", - Ts: json.Number(strconv.FormatInt(time.Now().Unix(), 10)), - } - msg := slack.WebhookMessage{ - Attachments: []slack.Attachment{attachment}, - } - - err = slack.PostWebhook(cfg.Slack.Webhook, &msg) - if err != nil { - log.Warn(err) - } -} - -func sendCostBreakdownReport(ctx context.Context, cfg models.Config) { - groups := make([]models.OutputCostByField, 0) - currentTime := time.Now() - - for _, field := range []string{"service", "provider", "account", "region"} { - err := db.NewRaw(fmt.Sprintf("SELECT %s as label, SUM(cost) as total FROM resources GROUP BY %s ORDER by total desc;", field, field)).Scan(ctx, &groups) - if err != nil { - log.WithError(err).Error("scan failed") - } - - segments := groups - - if len(groups) > 3 { - segments = groups[:4] - if len(groups) > 4 { - sum := 0.0 - for i := 4; i < len(groups); i++ { - sum += groups[i].Total - } - - segments = append(segments, models.OutputCostByField{ - Label: "Others", - Total: sum, - }) - } - } - - fields := make([]slack.AttachmentField, 0) - for _, segment := range segments { - fields = append(fields, slack.AttachmentField{ - Title: segment.Label, - Value: fmt.Sprintf("%.2f", segment.Total), - Short: true, - }) - } - - attachment := slack.Attachment{ - Color: "good", - AuthorName: "Komiser", - AuthorSubname: "by Tailwarden", - AuthorLink: "https://tailwarden.com", - AuthorIcon: "https://cdn.komiser.io/images/komiser-logo.jpeg", - Text: fmt.Sprintf("On %s %d: cost breakdown by cloud %s", currentTime.Month(), currentTime.Day(), field), - Footer: "Komiser", - Fields: fields, - FooterIcon: "https://github.com/tailwarden/komiser", - Ts: json.Number(strconv.FormatInt(time.Now().Unix(), 10)), - } - msg := slack.WebhookMessage{ - Attachments: []slack.Attachment{attachment}, - } - - err = slack.PostWebhook(cfg.Slack.Webhook, &msg) - if err != nil { - log.Warn(err) - } - } -} diff --git a/internal/report.go b/internal/report.go new file mode 100644 index 000000000..894de5c92 --- /dev/null +++ b/internal/report.go @@ -0,0 +1,126 @@ +package internal + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "time" + + log "github.com/sirupsen/logrus" + "github.com/slack-go/slack" + "github.com/tailwarden/komiser/models" +) + +func sendTagsCoverageReport(ctx context.Context, cfg models.Config) { + tags := make([]struct { + Total int `bun:"total"` + Label models.Tag `bun:"label"` + }, 0) + + err := db.NewRaw("SELECT count(*) as total, value as label FROM resources CROSS JOIN json_each(tags) GROUP BY value ORDER BY total DESC").Scan(ctx, &tags) + if err != nil { + log.WithError(err).Error("scan failed") + } + + fields := make([]slack.AttachmentField, 0) + + for _, tag := range tags { + fields = append(fields, slack.AttachmentField{ + Title: fmt.Sprintf("%s:%s", tag.Label.Key, tag.Label.Value), + Value: fmt.Sprintf("%d", tag.Total), + Short: true, + }) + } + + output := struct { + Total int `bun:"total"` + }{} + + err = db.NewRaw("SELECT COUNT(*) as total FROM resources where json_array_length(tags) = 0;").Scan(ctx, &output) + if err != nil { + log.WithError(err).Error("scan failed") + } + + currentTime := time.Now() + + attachment := slack.Attachment{ + Color: "good", + AuthorName: "Komiser", + AuthorSubname: "by Tailwarden", + AuthorLink: "https://tailwarden.com", + AuthorIcon: "https://cdn.komiser.io/images/komiser-logo.jpeg", + Text: fmt.Sprintf("On %s %d: *%d* of your resources are untagged. Below list of most used key/value pairs:", currentTime.Month(), currentTime.Day(), output.Total), + Footer: "Komiser", + Fields: fields, + FooterIcon: "https://github.com/tailwarden/komiser", + Ts: json.Number(strconv.FormatInt(time.Now().Unix(), 10)), + } + msg := slack.WebhookMessage{ + Attachments: []slack.Attachment{attachment}, + } + + err = slack.PostWebhook(cfg.Slack.Webhook, &msg) + if err != nil { + log.Warn(err) + } +} + +func sendCostBreakdownReport(ctx context.Context, cfg models.Config) { + groups := make([]models.OutputCostByField, 0) + currentTime := time.Now() + + for _, field := range []string{"service", "provider", "account", "region"} { + err := db.NewRaw(fmt.Sprintf("SELECT %s as label, SUM(cost) as total FROM resources GROUP BY %s ORDER by total desc;", field, field)).Scan(ctx, &groups) + if err != nil { + log.WithError(err).Error("scan failed") + } + + segments := groups + + if len(groups) > 3 { + segments = groups[:4] + if len(groups) > 4 { + sum := 0.0 + for i := 4; i < len(groups); i++ { + sum += groups[i].Total + } + + segments = append(segments, models.OutputCostByField{ + Label: "Others", + Total: sum, + }) + } + } + + fields := make([]slack.AttachmentField, 0) + for _, segment := range segments { + fields = append(fields, slack.AttachmentField{ + Title: segment.Label, + Value: fmt.Sprintf("%.2f", segment.Total), + Short: true, + }) + } + + attachment := slack.Attachment{ + Color: "good", + AuthorName: "Komiser", + AuthorSubname: "by Tailwarden", + AuthorLink: "https://tailwarden.com", + AuthorIcon: "https://cdn.komiser.io/images/komiser-logo.jpeg", + Text: fmt.Sprintf("On %s %d: cost breakdown by cloud %s", currentTime.Month(), currentTime.Day(), field), + Footer: "Komiser", + Fields: fields, + FooterIcon: "https://github.com/tailwarden/komiser", + Ts: json.Number(strconv.FormatInt(time.Now().Unix(), 10)), + } + msg := slack.WebhookMessage{ + Attachments: []slack.Attachment{attachment}, + } + + err = slack.PostWebhook(cfg.Slack.Webhook, &msg) + if err != nil { + log.Warn(err) + } + } +} diff --git a/internal/resources.go b/internal/resources.go new file mode 100644 index 000000000..ab4037c4e --- /dev/null +++ b/internal/resources.go @@ -0,0 +1,121 @@ +package internal + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/getsentry/sentry-go" + log "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/providers" + "github.com/tailwarden/komiser/providers/aws" + "github.com/tailwarden/komiser/providers/azure" + "github.com/tailwarden/komiser/providers/civo" + "github.com/tailwarden/komiser/providers/digitalocean" + "github.com/tailwarden/komiser/providers/gcp" + "github.com/tailwarden/komiser/providers/k8s" + "github.com/tailwarden/komiser/providers/linode" + "github.com/tailwarden/komiser/providers/mongodbatlas" + "github.com/tailwarden/komiser/providers/oci" + "github.com/tailwarden/komiser/providers/ovh" + "github.com/tailwarden/komiser/providers/scaleway" + "github.com/tailwarden/komiser/providers/tencent" +) + +func fetchResources(ctx context.Context, clients []providers.ProviderClient, regions []string, telemetry bool) { + numWorkers := 64 + wp := providers.NewWorkerPool(numWorkers) + wp.Start() + + var wwg sync.WaitGroup + workflowTrigger := func(client providers.ProviderClient, provider string) { + wwg.Add(1) + go func() { + defer wwg.Done() + triggerFetchingWorkflow(ctx, client, provider, telemetry, regions, wp) + }() + } + + for _, client := range clients { + if client.AWSClient != nil { + workflowTrigger(client, "AWS") + } else if client.DigitalOceanClient != nil { + workflowTrigger(client, "DigitalOcean") + } else if client.OciClient != nil { + workflowTrigger(client, "OCI") + } else if client.CivoClient != nil { + workflowTrigger(client, "Civo") + } else if client.K8sClient != nil { + workflowTrigger(client, "Kubernetes") + } else if client.LinodeClient != nil { + workflowTrigger(client, "Linode") + } else if client.TencentClient != nil { + workflowTrigger(client, "Tencent") + } else if client.AzureClient != nil { + workflowTrigger(client, "Azure") + } else if client.ScalewayClient != nil { + workflowTrigger(client, "Scaleway") + } else if client.MongoDBAtlasClient != nil { + workflowTrigger(client, "MongoDBAtlas") + } else if client.GCPClient != nil { + workflowTrigger(client, "GCP") + } else if client.OVHClient != nil { + workflowTrigger(client, "OVH") + } + log.Println("Workflow triggered for client:", client.Name) + } + + wwg.Wait() + wp.Wait() +} + +func triggerFetchingWorkflow(ctx context.Context, client providers.ProviderClient, provider string, telemetry bool, regions []string, wp *providers.WorkerPool) { + localHub := sentry.CurrentHub().Clone() + + defer func() { + err := recover() + if err != nil { + log.WithField("err", err).Error(fmt.Sprintf("error fetching %s resources", provider)) + localHub.CaptureException(err.(error)) + localHub.Flush(2 * time.Second) + } + }() + + localHub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("provider", provider) + }) + + if telemetry { + analytics.TrackEvent("fetching_resources", map[string]interface{}{ + "provider": provider, + }) + } + + switch provider { + case "AWS": + aws.FetchResources(ctx, client, regions, db, telemetry, analytics, wp) + case "DigitalOcean": + digitalocean.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "OCI": + oci.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "Civo": + civo.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "Kubernetes": + k8s.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "Linode": + linode.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "Tencent": + tencent.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "Azure": + azure.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "Scaleway": + scaleway.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "MongoDBAtlas": + mongodbatlas.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "GCP": + gcp.FetchResources(ctx, client, db, telemetry, analytics, wp) + case "OVH": + ovh.FetchResources(ctx, client, db, telemetry, analytics, wp) + } +} diff --git a/internal/internal_test.go b/internal/resources_test.go similarity index 91% rename from internal/internal_test.go rename to internal/resources_test.go index f8bfc9ee9..c9bdf4cd6 100644 --- a/internal/internal_test.go +++ b/internal/resources_test.go @@ -17,11 +17,11 @@ func BenchmarkFetchResources(b *testing.B) { ctx := context.TODO() log.SetOutput(io.Discard) analytics.Init() - cfg, clients, accounts, err := config.Load("/workspaces/komiser/config.toml", false, analytics, db) + cfg, clients, accounts, err := config.Load("/workspaces/komiser/config.toml", false, analytics) if err != nil { b.Fatalf("Error during config setup: %v", err) } - err = setupDBConnection(cfg) + err = utils.SetupDBConnection(cfg, db) if err != nil { b.Fatalf("Error during DB setup: %v", err) } diff --git a/internal/server.go b/internal/server.go new file mode 100644 index 000000000..93fc865a9 --- /dev/null +++ b/internal/server.go @@ -0,0 +1,52 @@ +package internal + +import ( + "context" + "fmt" + "time" + + log "github.com/sirupsen/logrus" + + "github.com/gin-gonic/gin" + v1 "github.com/tailwarden/komiser/internal/api/v1" + "github.com/tailwarden/komiser/models" +) + +func loggingMiddleware() gin.HandlerFunc { + return func(ctx *gin.Context) { + startTime := time.Now() + ctx.Next() + endTime := time.Now() + latencyTime := endTime.Sub(startTime) + reqMethod := ctx.Request.Method + reqUri := ctx.Request.RequestURI + statusCode := ctx.Writer.Status() + clientIP := ctx.ClientIP() + + log.WithFields(log.Fields{ + "method": reqMethod, + "uri": reqUri, + "status": statusCode, + "latency": latencyTime, + "ip": clientIP, + }).Info("HTTP request") + + ctx.Next() + } +} + +func runServer(address string, port int, telemetry bool, cfg models.Config, configPath string, accounts []models.Account) error { + log.Infof("Komiser version: %s, commit: %s, buildt: %s", Version, Commit, Buildtime) + + r := v1.Endpoints(context.Background(), telemetry, analytics, db, cfg, configPath, accounts) + + r.Use(loggingMiddleware()) + + if err := r.Run(fmt.Sprintf("%s:%d", address, port)); err != nil { + return err + } + + log.Infof("Server started on %s:%d", address, port) + + return nil +} diff --git a/internal/webhook.go b/internal/webhook.go new file mode 100644 index 000000000..46c7b0ce0 --- /dev/null +++ b/internal/webhook.go @@ -0,0 +1,116 @@ +package internal + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" + + log "github.com/sirupsen/logrus" + "github.com/slack-go/slack" + "github.com/tailwarden/komiser/models" +) + +func hitCustomWebhook(endpoint string, secret string, viewName string, resources int, cost float64, alertType string) { + var payloadJSON []byte + var err error + payload := models.CustomWebhookPayload{ + Komiser: Version, + View: viewName, + Timestamp: time.Now().Unix(), + } + + switch alertType { + case "BUDGET": + payload.Message = "Cost alert" + payload.Data = cost + case "USAGE": + payload.Message = "Usage alert" + payload.Data = float64(resources) + default: + log.Error("Invalid Alert Type") + return + } + + payloadJSON, err = json.Marshal(payload) + if err != nil { + log.Error("Couldn't encode JSON payload:", err) + return + } + + req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(payloadJSON)) + if err != nil { + log.Error("Couldn't create HTTP request for custom webhook endpoint:", err) + return + } + + req.Header.Set("Content-Type", "application/json") + if len(secret) > 0 { + req.Header.Set("Authorization", secret) + } + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + log.Error("Couldn't make HTTP request for custom webhook endpoint:", err) + return + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + log.Error("Custom Webhook with endpoint " + endpoint + " returned back a status code of " + string(rune(resp.StatusCode)) + " . Expected Status Code: 200") + return + } +} + +func hitSlackWebhook(viewName string, port int, viewId int, resources int, cost float64, webhookUrl string, alertType string) { + attachment := slack.Attachment{ + Color: "danger", + AuthorName: "Komiser", + AuthorSubname: "by Tailwarden", + AuthorLink: "https://tailwarden.com", + AuthorIcon: "https://cdn.komiser.io/images/komiser-logo.jpeg", + Footer: "Komiser", + Actions: []slack.AttachmentAction{ + { + Name: "open", + Text: "Open view", + Type: "button", + URL: fmt.Sprintf("http://localhost:%d/inventory?view=%d", port, viewId), + }, + }, + Fields: []slack.AttachmentField{ + { + Title: "View", + Value: viewName, + }, + }, + FooterIcon: "https://github.com/tailwarden/komiser", + Ts: json.Number(strconv.FormatInt(time.Now().Unix(), 10)), + } + + if alertType == "BUDGET" { + attachment.Text = "Cost alert :warning:" + attachment.Fields = append(attachment.Fields, slack.AttachmentField{ + Title: "Cost", + Value: fmt.Sprintf("%.2f$", cost), + }) + } else if alertType == "USAGE" { + attachment.Text = "Usage alert :warning:" + attachment.Fields = append(attachment.Fields, slack.AttachmentField{ + Title: "Resources", + Value: fmt.Sprintf("%d", resources), + }) + } + + msg := slack.WebhookMessage{ + Attachments: []slack.Attachment{attachment}, + } + + err := slack.PostWebhook(webhookUrl, &msg) + if err != nil { + log.Warn(err) + } + +} diff --git a/utils/database.go b/utils/database.go index 84f3daf16..ecea30704 100644 --- a/utils/database.go +++ b/utils/database.go @@ -2,14 +2,49 @@ package utils import ( "context" + "database/sql" + "fmt" log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/migrations" "github.com/tailwarden/komiser/models" "github.com/uptrace/bun" + "github.com/uptrace/bun/dialect/pgdialect" + "github.com/uptrace/bun/dialect/sqlitedialect" + "github.com/uptrace/bun/driver/pgdriver" + "github.com/uptrace/bun/driver/sqliteshim" "github.com/uptrace/bun/migrate" ) +func SetupDBConnection(c *models.Config, db *bun.DB) error { + var sqldb *sql.DB + var err error + + if len(c.SQLite.File) == 0 && len(c.Postgres.URI) == 0 { + log.Println("Database wasn't configured yet") + return nil + } + + if len(c.SQLite.File) > 0 { + sqldb, err = sql.Open(sqliteshim.ShimName, fmt.Sprintf("file:%s?cache=shared", c.SQLite.File)) + if err != nil { + return err + } + sqldb.SetMaxIdleConns(1000) + sqldb.SetConnMaxLifetime(0) + + *db = *bun.NewDB(sqldb, sqlitedialect.New()) + + log.Println("Data will be stored in SQLite") + } else { + sqldb = sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(c.Postgres.URI))) + *db = *bun.NewDB(sqldb, pgdialect.New()) + log.Println("Data will be stored in PostgreSQL") + } + + return nil +} + func SetupSchema(db *bun.DB, c *models.Config, accounts []models.Account) error { _, err := db.NewCreateTable().Model((*models.Resource)(nil)).IfNotExists().Exec(context.Background()) if err != nil { From cd1d7d26911d10fe22eb09158acaefd5af818d05 Mon Sep 17 00:00:00 2001 From: Azanul Date: Sat, 20 Apr 2024 10:56:56 +0530 Subject: [PATCH 13/31] refac: seperate errors Signed-off-by: Azanul --- internal/errors.go | 9 +++++++++ internal/internal.go | 21 ++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 internal/errors.go diff --git a/internal/errors.go b/internal/errors.go new file mode 100644 index 000000000..389945af2 --- /dev/null +++ b/internal/errors.go @@ -0,0 +1,9 @@ +package internal + +import "errors" + +var ( + errInvalidField = errors.New("field is invalid or not supported") + errInvalidOperation = errors.New("operation is invalid or not supported") + errNumberValue = errors.New("the value should be a number") +) diff --git a/internal/internal.go b/internal/internal.go index 1b2f5b763..d70f8e6a3 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -3,7 +3,6 @@ package internal import ( "context" "encoding/json" - "errors" "fmt" "net/http" "runtime" @@ -177,7 +176,7 @@ func getViewStats(ctx context.Context, filters []models.Filter) (models.ViewStat case "IS_NOT_EMPTY": whereQueries = append(whereQueries, fmt.Sprintf("((coalesce(%s, '') != ''))", filter.Field)) default: - return models.ViewStat{}, errors.New("Operation is invalid or not supported") + return models.ViewStat{}, errInvalidOperation } } else if strings.HasPrefix(filter.Field, "tag:") { filterWithTags = true @@ -216,7 +215,7 @@ func getViewStats(ctx context.Context, filters []models.Filter) (models.ViewStat whereQueries = append(whereQueries, fmt.Sprintf("((res->>'key' = '%s') AND (res->>'value' != ''))", key)) } default: - return models.ViewStat{}, errors.New("operation is invalid or not supported") + return models.ViewStat{}, errInvalidOperation } } else if filter.Field == "tags" { switch filter.Operator { @@ -233,44 +232,44 @@ func getViewStats(ctx context.Context, filters []models.Filter) (models.ViewStat whereQueries = append(whereQueries, "jsonb_array_length(tags) != 0") } default: - return models.ViewStat{}, errors.New("operation is invalid or not supported") + return models.ViewStat{}, errInvalidOperation } } else if filter.Field == "cost" { switch filter.Operator { case "EQUAL": cost, err := strconv.ParseFloat(filter.Values[0], 64) if err != nil { - return models.ViewStat{}, errors.New("The value should be a number") + return models.ViewStat{}, errNumberValue } whereQueries = append(whereQueries, fmt.Sprintf("(cost = %f)", cost)) case "BETWEEN": min, err := strconv.ParseFloat(filter.Values[0], 64) if err != nil { - return models.ViewStat{}, errors.New("The value should be a number") + return models.ViewStat{}, errNumberValue } max, err := strconv.ParseFloat(filter.Values[1], 64) if err != nil { - return models.ViewStat{}, errors.New("The value should be a number") + return models.ViewStat{}, errNumberValue } whereQueries = append(whereQueries, fmt.Sprintf("(cost >= %f AND cost <= %f)", min, max)) case "GREATER_THAN": cost, err := strconv.ParseFloat(filter.Values[0], 64) if err != nil { - return models.ViewStat{}, errors.New("The value should be a number") + return models.ViewStat{}, errNumberValue } whereQueries = append(whereQueries, fmt.Sprintf("(cost > %f)", cost)) case "LESS_THAN": cost, err := strconv.ParseFloat(filter.Values[0], 64) if err != nil { - return models.ViewStat{}, errors.New("The value should be a number") + return models.ViewStat{}, errNumberValue } whereQueries = append(whereQueries, fmt.Sprintf("(cost < %f)", cost)) default: - return models.ViewStat{}, errors.New("Operation is invalid or not supported") + return models.ViewStat{}, errInvalidOperation } } else { - return models.ViewStat{}, errors.New("Field is invalid or not supported") + return models.ViewStat{}, errInvalidField } } From e5084b46a15725c283cc9d6d2da82c8b9137e861 Mon Sep 17 00:00:00 2001 From: Azanul Date: Sat, 20 Apr 2024 11:57:14 +0530 Subject: [PATCH 14/31] refac: seperate jobs Signed-off-by: Azanul --- internal/errors.go | 12 +++++++++- internal/internal.go | 40 +--------------------------------- internal/jobs.go | 52 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 40 deletions(-) create mode 100644 internal/jobs.go diff --git a/internal/errors.go b/internal/errors.go index 389945af2..797253252 100644 --- a/internal/errors.go +++ b/internal/errors.go @@ -1,9 +1,19 @@ package internal -import "errors" +import ( + "errors" + + log "github.com/sirupsen/logrus" +) var ( errInvalidField = errors.New("field is invalid or not supported") errInvalidOperation = errors.New("operation is invalid or not supported") errNumberValue = errors.New("the value should be a number") ) + +func handleError(err error, msg string) { + if err != nil { + log.WithError(err).Error(msg) + } +} diff --git a/internal/internal.go b/internal/internal.go index d70f8e6a3..30cc4805e 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -10,7 +10,6 @@ import ( "strings" "time" - "github.com/go-co-op/gocron" "github.com/hashicorp/go-version" log "github.com/sirupsen/logrus" "github.com/uptrace/bun/dialect" @@ -53,44 +52,7 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A return err } - cron := gocron.NewScheduler(time.UTC) - - _, err = cron.Every(1).Hours().Do(func() { - log.Info("Fetching resources workflow has started") - - fetchResources(ctx, clients, regions, telemetry) - }) - - if err != nil { - log.WithError(err).Error("setting up cron job failed") - } - - _, err = cron.Every(1).Hours().Do(func() { - alerts, err := listAlerts(ctx) - if err != nil { - log.WithError(err).Error("failed to list alerts") - } - if len(alerts) > 0 { - log.Info("Checking Alerts") - checkingAlerts(ctx, *cfg, telemetry, port, alerts) - } - }) - if err != nil { - log.WithError(err).Error("failed to setup alert checking cron job") - } - - _, err = cron.Every(1).Friday().At("09:00").Do(func() { - if len(cfg.Slack.Webhook) > 0 && cfg.Slack.Reporting { - log.Info("Sending weekly reporting") - sendTagsCoverageReport(ctx, *cfg) - sendCostBreakdownReport(ctx, *cfg) - } - }) - if err != nil { - log.WithError(err).Error("failed to setup cron job") - } - - cron.StartAsync() + scheduleJobs(ctx, cfg, clients, regions, port, telemetry) } go checkUpgrade() diff --git a/internal/jobs.go b/internal/jobs.go new file mode 100644 index 000000000..a7d45a70b --- /dev/null +++ b/internal/jobs.go @@ -0,0 +1,52 @@ +package internal + +import ( + "context" + "time" + + "github.com/go-co-op/gocron" + log "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/providers" +) + +func scheduleJobs(ctx context.Context, cfg *models.Config, clients []providers.ProviderClient, regions []string, port int, telemetry bool) { + cron := gocron.NewScheduler(time.UTC) + setupResourceFetchingJob(ctx, cron, clients, regions, telemetry) + setupAlertCheckingJob(ctx, cron, cfg, port, telemetry) + setupReportingJob(ctx, cron, cfg) + cron.StartAsync() +} + +func setupResourceFetchingJob(ctx context.Context, cron *gocron.Scheduler, clients []providers.ProviderClient, regions []string, telemetry bool) { + _, err := cron.Every(1).Hours().Do(func() { + log.Info("Fetching resources workflow has started") + fetchResources(ctx, clients, regions, telemetry) + }) + handleError(err, "setting up resource fetching cron job failed") +} + +func setupAlertCheckingJob(ctx context.Context, cron *gocron.Scheduler, cfg *models.Config, port int, telemetry bool) { + _, err := cron.Every(1).Hours().Do(func() { + alerts, err := listAlerts(ctx) + if err != nil { + log.WithError(err).Error("failed to list alerts") + } + if len(alerts) > 0 { + log.Info("Checking Alerts") + checkingAlerts(ctx, *cfg, telemetry, port, alerts) + } + }) + handleError(err, "failed to setup alert checking cron job") +} + +func setupReportingJob(ctx context.Context, cron *gocron.Scheduler, cfg *models.Config) { + _, err := cron.Every(1).Friday().At("09:00").Do(func() { + if len(cfg.Slack.Webhook) > 0 && cfg.Slack.Reporting { + log.Info("Sending weekly reporting") + sendTagsCoverageReport(ctx, *cfg) + sendCostBreakdownReport(ctx, *cfg) + } + }) + handleError(err, "failed to setup cron job") +} From f0a94929bd7f6b5db3368e149be6070508d251e5 Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 6 May 2024 16:51:19 +0530 Subject: [PATCH 15/31] feat: accounts controller Signed-off-by: Azanul --- controller/accounts.go | 48 ++++++++++++++++++++ controller/controller.go | 20 +++++++++ handlers/accounts_handler.go | 83 +++++++++++++++-------------------- handlers/resources_handler.go | 8 +--- 4 files changed, 105 insertions(+), 54 deletions(-) create mode 100644 controller/accounts.go create mode 100644 controller/controller.go diff --git a/controller/accounts.go b/controller/accounts.go new file mode 100644 index 000000000..7505f0e34 --- /dev/null +++ b/controller/accounts.go @@ -0,0 +1,48 @@ +package controller + +import ( + "context" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository" +) + +type totalOutput struct { + Total int `bun:"total" json:"total"` +} + +func (ctrl *Controller) ListAccounts(c context.Context) (accounts []models.Account, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &accounts, nil) + return +} + +func (ctrl *Controller) CountResources(c context.Context, provider, name string) (output totalOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ResourceCountKey, &output, [][3]string{{"provider", "=", provider}, {"account", "=", name}}) + return +} + +func (ctrl *Controller) InsertAccount(c context.Context, account models.Account) (lastId int64, err error) { + result, err := ctrl.repo.HandleQuery(c, repository.InsertKey, &account, nil) + if err != nil { + return + } + return result.LastInsertId() +} + +func (ctrl *Controller) RescanAccount(c context.Context, account *models.Account, accountId string) (rows int64, err error) { + res, err := ctrl.repo.HandleQuery(c, repository.ReScanAccountKey, account, [][3]string{{"id", "=", accountId}, {"status", "=", "CONNECTED"}}) + if err != nil { + return 0, err + } + return res.RowsAffected() +} + +func (ctrl *Controller) DeleteAccount(c context.Context, accountId string) (err error) { + _, err = ctrl.repo.HandleQuery(c, repository.DeleteKey, new(models.Account), [][3]string{{"id", "=", accountId}}) + return +} + +func (ctrl *Controller) UpdateAccount(c context.Context, account models.Account, accountId string) (err error) { + _, err = ctrl.repo.HandleQuery(c, repository.UpdateAccountKey, &account, [][3]string{{"id", "=", accountId}}) + return +} diff --git a/controller/controller.go b/controller/controller.go new file mode 100644 index 000000000..1464897df --- /dev/null +++ b/controller/controller.go @@ -0,0 +1,20 @@ +package controller + +import ( + "context" + "database/sql" + + "github.com/tailwarden/komiser/repository" +) + +type Repository interface { + HandleQuery(context.Context, repository.QueryType, interface{}, [][3]string) (sql.Result, error) +} + +type Controller struct { + repo Repository +} + +func New(repo Repository) *Controller { + return &Controller{repo} +} diff --git a/handlers/accounts_handler.go b/handlers/accounts_handler.go index 038d8844d..2b1ad729f 100644 --- a/handlers/accounts_handler.go +++ b/handlers/accounts_handler.go @@ -11,7 +11,6 @@ import ( "github.com/go-co-op/gocron" log "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/pgdialect" @@ -37,13 +36,10 @@ func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { return } - accounts := make([]models.Account, 0) - - _, err := handler.repo.HandleQuery(c, repository.ListKey, &accounts, nil) + accounts, err := handler.ctrl.ListAccounts(c) if err != nil { log.WithError(err).Error("scan failed") c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) - return } if len(accounts) > 0 { @@ -51,19 +47,16 @@ func (handler *ApiHandler) IsOnboardedHandler(c *gin.Context) { } else { output.Status = "PENDING_ACCOUNTS" } - c.JSON(http.StatusOK, output) } func (handler *ApiHandler) ListCloudAccountsHandler(c *gin.Context) { - accounts := make([]models.Account, 0) - if handler.db == nil { c.JSON(http.StatusOK, unsavedAccounts) return } - _, err := handler.repo.HandleQuery(c, repository.ListKey, &accounts, nil) + accounts, err := handler.ctrl.ListAccounts(c) if err != nil { log.WithError(err).Error("scan failed") c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) @@ -71,13 +64,9 @@ func (handler *ApiHandler) ListCloudAccountsHandler(c *gin.Context) { } for i, account := range accounts { - output := struct { - Total int `bun:"total" json:"total"` - }{} - - _, err := handler.repo.HandleQuery(c, repository.ResourceCountKey, &output, [][3]string{{"provider", "=", account.Provider}, {"account", "=", account.Name}}) + output, err := handler.ctrl.CountResources(c, account.Provider, account.Name) if err != nil { - fmt.Println(err) + log.WithError(err).Error("scan failed") c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) return } @@ -106,40 +95,40 @@ func (handler *ApiHandler) NewCloudAccountHandler(c *gin.Context) { } unsavedAccounts = append(unsavedAccounts, account) - } else { + } - result, err := handler.repo.HandleQuery(c, repository.InsertKey, &account, nil) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) - return - } - accountId, _ := result.LastInsertId() - account.Id = accountId + accountId, err := handler.ctrl.InsertAccount(c, account) + if err != nil { + log.WithError(err).Error("insert failed") + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } - err = populateConfigFromAccount(account, &handler.cfg) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) - return - } + account.Id = accountId - err = updateConfig(handler.configPath, &handler.cfg) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) - return - } + err = populateConfigFromAccount(account, &handler.cfg) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } - cron := gocron.NewScheduler(time.UTC) - _, err = cron.Every(1).Hours().Do(func() { - log.Info("Fetching resources workflow has started") + err = updateConfig(handler.configPath, &handler.cfg) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } - fetchResourcesForAccount(c, account, handler.db, []string{}) - }) - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) - return - } - cron.StartAsync() + cron := gocron.NewScheduler(time.UTC) + _, err = cron.Every(1).Hours().Do(func() { + log.Info("Fetching resources workflow has started") + + fetchResourcesForAccount(c, account, handler.db, []string{}) + }) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return } + cron.StartAsync() if handler.telemetry { handler.analytics.TrackEvent("creating_alert", map[string]interface{}{ @@ -156,12 +145,11 @@ func (handler *ApiHandler) ReScanAccount(c *gin.Context) { account := new(models.Account) account.Status = "SCANNING" - res, err := handler.repo.HandleQuery(c, repository.ReScanAccountKey, account, [][3]string{{"id", "=", accountId}, {"status", "=", "CONNECTED"}}) + rows, err := handler.ctrl.RescanAccount(c, account, accountId) if err != nil { log.Error("Couldn't set status", err) return } - rows, _ := res.RowsAffected() if rows > 0 { go fetchResourcesForAccount(handler.ctx, *account, handler.db, []string{}) } @@ -172,8 +160,7 @@ func (handler *ApiHandler) ReScanAccount(c *gin.Context) { func (handler *ApiHandler) DeleteCloudAccountHandler(c *gin.Context) { accountId := c.Param("id") - account := new(models.Account) - _, err := handler.repo.HandleQuery(c, repository.DeleteKey, account, [][3]string{{"id", "=", accountId}}) + err := handler.ctrl.DeleteAccount(c, accountId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -192,7 +179,7 @@ func (handler *ApiHandler) UpdateCloudAccountHandler(c *gin.Context) { return } - _, err = handler.repo.HandleQuery(c, repository.UpdateAccountKey, &account, [][3]string{{"id", "=", accountId}}) + err = handler.ctrl.UpdateAccount(c, account, accountId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return diff --git a/handlers/resources_handler.go b/handlers/resources_handler.go index e3b0ac6f5..82e2d3ec7 100644 --- a/handlers/resources_handler.go +++ b/handlers/resources_handler.go @@ -2,7 +2,6 @@ package handlers import ( "context" - "database/sql" "encoding/json" "fmt" "net/http" @@ -11,6 +10,7 @@ import ( "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" + "github.com/tailwarden/komiser/controller" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/repository" "github.com/tailwarden/komiser/utils" @@ -20,7 +20,7 @@ import ( type ApiHandler struct { db *bun.DB - repo Repository + ctrl *controller.Controller ctx context.Context telemetry bool cfg models.Config @@ -29,10 +29,6 @@ type ApiHandler struct { accounts []models.Account } -type Repository interface { - HandleQuery(context.Context, repository.QueryType, interface{}, [][3]string) (sql.Result, error) -} - func NewApiHandler(ctx context.Context, telemetry bool, analytics utils.Analytics, db *bun.DB, cfg models.Config, configPath string, accounts []models.Account) *ApiHandler { handler := ApiHandler{ db: db, From cfe16577c3738b0f66c987767c68261f68bef2a0 Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 6 May 2024 17:03:06 +0530 Subject: [PATCH 16/31] feat: resources controller Signed-off-by: Azanul --- controller/resources.go | 13 +++++++++++++ handlers/resources_handler.go | 6 ++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 controller/resources.go diff --git a/controller/resources.go b/controller/resources.go new file mode 100644 index 000000000..90bcce134 --- /dev/null +++ b/controller/resources.go @@ -0,0 +1,13 @@ +package controller + +import ( + "context" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository" +) + +func (ctrl *Controller) GetResource(c context.Context, resourceId string) (resource models.Resource, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &resource, [][3]string{{"resource_id", "=", resourceId}}) + return +} diff --git a/handlers/resources_handler.go b/handlers/resources_handler.go index 82e2d3ec7..aecc52247 100644 --- a/handlers/resources_handler.go +++ b/handlers/resources_handler.go @@ -12,7 +12,6 @@ import ( "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/controller" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect" @@ -438,11 +437,10 @@ func (handler *ApiHandler) RelationStatsHandler(c *gin.Context) { func (handler *ApiHandler) GetResourceByIdHandler(c *gin.Context) { resourceId := c.Query("resourceId") - var resource models.Resource - - _, err := handler.repo.HandleQuery(c, repository.ListKey, &resource, [][3]string{{"resource_id", "=", resourceId}}) + resource, err := handler.ctrl.GetResource(c, resourceId) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Resource not found"}) + return } c.JSON(http.StatusOK, resource) From 6b70baa389f955d9b19094cf705e97e2090ec45b Mon Sep 17 00:00:00 2001 From: Azanul Date: Mon, 6 May 2024 18:30:18 +0530 Subject: [PATCH 17/31] feat: tags controller Signed-off-by: Azanul --- controller/tags.go | 15 +++++++++++++++ handlers/tags_handler.go | 9 ++------- 2 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 controller/tags.go diff --git a/controller/tags.go b/controller/tags.go new file mode 100644 index 000000000..c2d0fb5ff --- /dev/null +++ b/controller/tags.go @@ -0,0 +1,15 @@ +package controller + +import ( + "context" + "fmt" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository" +) + +func (ctrl *Controller) UpdateTags(c context.Context, tags []models.Tag, resourceId string) (resource models.Resource, err error) { + resource.Tags = tags + _, err = ctrl.repo.HandleQuery(c, repository.UpdateTagsKey, &resource, [][3]string{{"id", "=", fmt.Sprint(resourceId)}}) + return +} diff --git a/handlers/tags_handler.go b/handlers/tags_handler.go index c69412ed9..63736e2a3 100644 --- a/handlers/tags_handler.go +++ b/handlers/tags_handler.go @@ -7,7 +7,6 @@ import ( "github.com/gin-gonic/gin" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" ) func (handler *ApiHandler) BulkUpdateTagsHandler(c *gin.Context) { @@ -19,10 +18,8 @@ func (handler *ApiHandler) BulkUpdateTagsHandler(c *gin.Context) { return } - resource := models.Resource{Tags: input.Tags} - for _, resourceId := range input.Resources { - _, err = handler.repo.HandleQuery(c, repository.UpdateTagsKey, &resource, [][3]string{{"id", "=", fmt.Sprint(resourceId)}}) + _, err = handler.ctrl.UpdateTags(c, input.Tags, fmt.Sprint(resourceId)) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "error while updating tags"}) return @@ -47,9 +44,7 @@ func (handler *ApiHandler) UpdateTagsHandler(c *gin.Context) { return } - resource := models.Resource{Tags: tags} - - _, err = handler.repo.HandleQuery(c, repository.UpdateTagsKey, &resource, [][3]string{{"id", "=", fmt.Sprint(resourceId)}}) + _, err = handler.ctrl.UpdateTags(c, tags, resourceId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "error while updating tags"}) return From b99742f2472fce810360e5755e7834d53b2841dc Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 8 May 2024 12:08:12 +0530 Subject: [PATCH 18/31] feat: csv controller Signed-off-by: Azanul --- controller/resources.go | 5 +++++ controller/views.go | 13 +++++++++++++ handlers/csv_handler.go | 7 ++----- 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 controller/views.go diff --git a/controller/resources.go b/controller/resources.go index 90bcce134..8998efaec 100644 --- a/controller/resources.go +++ b/controller/resources.go @@ -11,3 +11,8 @@ func (ctrl *Controller) GetResource(c context.Context, resourceId string) (resou _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &resource, [][3]string{{"resource_id", "=", resourceId}}) return } + +func (ctrl *Controller) ListResources(c context.Context) (resources []models.Resource, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &resources, [][3]string{}) + return +} diff --git a/controller/views.go b/controller/views.go new file mode 100644 index 000000000..e8ada2e0d --- /dev/null +++ b/controller/views.go @@ -0,0 +1,13 @@ +package controller + +import ( + "context" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository" +) + +func (ctrl *Controller) GetView(c context.Context, viewId string) (view models.View, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &view, [][3]string{{"id", "=", viewId}}) + return +} diff --git a/handlers/csv_handler.go b/handlers/csv_handler.go index afcb24b25..1c59ac5e8 100644 --- a/handlers/csv_handler.go +++ b/handlers/csv_handler.go @@ -14,13 +14,11 @@ import ( "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" "github.com/uptrace/bun/dialect" ) func (handler *ApiHandler) DownloadInventoryCSV(c *gin.Context) { - resources := make([]models.Resource, 0) - _, err := handler.repo.HandleQuery(c, repository.ListKey, &resources, [][3]string{}) + resources, err := handler.ctrl.ListResources(c) if err != nil { logrus.WithError(err).Error("Could not read from DB") c.JSON(http.StatusInternalServerError, gin.H{"error": "cloud not read from DB"}) @@ -37,8 +35,7 @@ func (handler *ApiHandler) DownloadInventoryCSV(c *gin.Context) { func (handler *ApiHandler) DownloadInventoryCSVForView(c *gin.Context) { viewId := c.Param("viewId") - view := new(models.View) - _, err := handler.repo.HandleQuery(c, repository.ListKey, view, [][3]string{{"id", "=", fmt.Sprint(viewId)}}) + view, err := handler.ctrl.GetView(c, viewId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return From 72e8aa13902661aa37e3b3f2f48a1dec352464f1 Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 8 May 2024 12:21:06 +0530 Subject: [PATCH 19/31] feat: alerts controller Signed-off-by: Azanul --- controller/alerts.go | 26 ++++++++++++++++++++++++++ handlers/alerts_handler.go | 10 +++------- 2 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 controller/alerts.go diff --git a/controller/alerts.go b/controller/alerts.go new file mode 100644 index 000000000..75a96cf49 --- /dev/null +++ b/controller/alerts.go @@ -0,0 +1,26 @@ +package controller + +import ( + "context" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository" +) + +func (ctrl *Controller) InsertAlert(c context.Context, alert models.Alert) (alertId int64, err error) { + result, err := ctrl.repo.HandleQuery(c, repository.InsertKey, &alert, nil) + if err != nil { + return + } + return result.LastInsertId() +} + +func (ctrl *Controller) UpdateAlert(c context.Context, alert models.Alert, alertId string) (err error) { + _, err = ctrl.repo.HandleQuery(c, repository.UpdateAlertKey, &alert, [][3]string{{"id", "=", alertId}}) + return +} + +func (ctrl *Controller) DeleteAlert(c context.Context, alertId string) (err error) { + _, err = ctrl.repo.HandleQuery(c, repository.DeleteKey, new(models.Alert), [][3]string{{"id", "=", alertId}}) + return +} diff --git a/handlers/alerts_handler.go b/handlers/alerts_handler.go index b7a401096..c76627111 100644 --- a/handlers/alerts_handler.go +++ b/handlers/alerts_handler.go @@ -3,13 +3,11 @@ package handlers import ( "bytes" "encoding/json" - "fmt" "net/http" "time" "github.com/gin-gonic/gin" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" ) func (handler *ApiHandler) IsSlackEnabledHandler(c *gin.Context) { @@ -34,13 +32,12 @@ func (handler *ApiHandler) NewAlertHandler(c *gin.Context) { return } - result, err := handler.repo.HandleQuery(c, repository.InsertKey, &alert, nil) + alertId, err := handler.ctrl.InsertAlert(c, alert) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - alertId, _ := result.LastInsertId() alert.Id = alertId if handler.telemetry { @@ -63,7 +60,7 @@ func (handler *ApiHandler) UpdateAlertHandler(c *gin.Context) { return } - _, err = handler.repo.HandleQuery(c, repository.UpdateAlertKey, &alert, [][3]string{{"id", "=", fmt.Sprint(alertId)}}) + err = handler.ctrl.UpdateAlert(c, alert, alertId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -75,8 +72,7 @@ func (handler *ApiHandler) UpdateAlertHandler(c *gin.Context) { func (handler *ApiHandler) DeleteAlertHandler(c *gin.Context) { alertId := c.Param("id") - alert := new(models.Alert) - _, err := handler.repo.HandleQuery(c, repository.DeleteKey, alert, [][3]string{{"id", "=", fmt.Sprint(alertId)}}) + err := handler.ctrl.DeleteAlert(c, alertId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return From 7987186c901598d8fd1aae6279ff3df0eefd5aa0 Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 8 May 2024 14:15:56 +0530 Subject: [PATCH 20/31] feat: dashboard controller Signed-off-by: Azanul --- controller/accounts.go | 13 ++++++---- controller/controller.go | 8 ++++++ controller/resources.go | 15 +++++++++++ controller/stats.go | 13 ++++++++++ handlers/dashboard_handler.go | 47 +++++++++++------------------------ repository/sql/sql.go | 2 +- repository/sqlite/sqlite.go | 2 +- 7 files changed, 60 insertions(+), 40 deletions(-) create mode 100644 controller/stats.go diff --git a/controller/accounts.go b/controller/accounts.go index 7505f0e34..1bda29326 100644 --- a/controller/accounts.go +++ b/controller/accounts.go @@ -7,17 +7,20 @@ import ( "github.com/tailwarden/komiser/repository" ) -type totalOutput struct { - Total int `bun:"total" json:"total"` -} - func (ctrl *Controller) ListAccounts(c context.Context) (accounts []models.Account, err error) { _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &accounts, nil) return } func (ctrl *Controller) CountResources(c context.Context, provider, name string) (output totalOutput, err error) { - _, err = ctrl.repo.HandleQuery(c, repository.ResourceCountKey, &output, [][3]string{{"provider", "=", provider}, {"account", "=", name}}) + conditions := [][3]string{} + if provider != "" { + conditions = append(conditions, [3]string{"provider", "=", provider}) + } + if name != "" { + conditions = append(conditions, [3]string{"account", "=", name}) + } + _, err = ctrl.repo.HandleQuery(c, repository.ResourceCountKey, &output, conditions) return } diff --git a/controller/controller.go b/controller/controller.go index 1464897df..30602a755 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -7,6 +7,14 @@ import ( "github.com/tailwarden/komiser/repository" ) +type totalOutput struct { + Total int `bun:"total" json:"total"` +} + +type costOutput struct { + Total float64 `bun:"sum" json:"total"` +} + type Repository interface { HandleQuery(context.Context, repository.QueryType, interface{}, [][3]string) (sql.Result, error) } diff --git a/controller/resources.go b/controller/resources.go index 8998efaec..9563fe4c9 100644 --- a/controller/resources.go +++ b/controller/resources.go @@ -16,3 +16,18 @@ func (ctrl *Controller) ListResources(c context.Context) (resources []models.Res _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &resources, [][3]string{}) return } + +func (ctrl *Controller) CountRegionsFromResources(c context.Context) (regions totalOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.RegionResourceCountKey, ®ions, [][3]string{}) + return +} + +func (ctrl *Controller) CountRegionsFromAccounts(c context.Context) (accounts totalOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.AccountsResourceCountKey, &accounts, [][3]string{}) + return +} + +func (ctrl *Controller) SumResourceCost(c context.Context) (cost costOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ResourceCostSumKey, &cost, [][3]string{}) + return +} diff --git a/controller/stats.go b/controller/stats.go new file mode 100644 index 000000000..b6d4df100 --- /dev/null +++ b/controller/stats.go @@ -0,0 +1,13 @@ +package controller + +import ( + "context" + + "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository" +) + +func (ctrl *Controller) LocationStatsBreakdown(c context.Context) (groups []models.OutputResources, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.LocationBreakdownStatKey, &groups, [][3]string{}) + return +} diff --git a/handlers/dashboard_handler.go b/handlers/dashboard_handler.go index 8400c718b..ada1d8793 100644 --- a/handlers/dashboard_handler.go +++ b/handlers/dashboard_handler.go @@ -11,7 +11,6 @@ import ( "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" ) @@ -29,38 +28,22 @@ func (handler *ApiHandler) DashboardStatsHandler(c *gin.Context) { return } - regions := struct { - Count int `bun:"count" json:"total"` - }{} - - _, err := handler.repo.HandleQuery(c, repository.RegionResourceCountKey, ®ions, [][3]string{}) + regions, err := handler.ctrl.CountRegionsFromResources(c) if err != nil { logrus.WithError(err).Error("scan failed") } - resources := struct { - Count int `bun:"total" json:"total"` - }{} - - _, err = handler.repo.HandleQuery(c, repository.ResourceCountKey, &resources, [][3]string{}) + resources, err := handler.ctrl.CountResources(c, "", "") if err != nil { logrus.WithError(err).Error("scan failed") } - cost := struct { - Sum float64 `bun:"sum" json:"total"` - }{} - - _, err = handler.repo.HandleQuery(c, repository.ResourceCostSumKey, &cost, [][3]string{}) + cost, err := handler.ctrl.SumResourceCost(c) if err != nil { logrus.WithError(err).Error("scan failed") } - accounts := struct { - Count int `bun:"count" json:"total"` - }{} - - _, err = handler.repo.HandleQuery(c, repository.RegionResourceCountKey, ®ions, [][3]string{}) + accounts, err := handler.ctrl.CountRegionsFromAccounts(c) if err != nil { logrus.WithError(err).Error("scan failed") } @@ -71,18 +54,18 @@ func (handler *ApiHandler) DashboardStatsHandler(c *gin.Context) { Costs float64 `json:"costs"` Accounts int `json:"accounts"` }{ - Resources: resources.Count, - Regions: regions.Count, - Costs: cost.Sum, - Accounts: accounts.Count, + Resources: resources.Total, + Regions: regions.Total, + Costs: cost.Total, + Accounts: accounts.Total, } if handler.telemetry { handler.analytics.TrackEvent("global_stats", map[string]interface{}{ - "regions": regions.Count, - "resources": resources.Count, - "accounts": accounts.Count, - "cost": cost.Sum, + "regions": regions.Total, + "resources": resources.Total, + "accounts": accounts.Total, + "cost": cost.Total, }) } @@ -138,13 +121,12 @@ func (handler *ApiHandler) ResourcesBreakdownStatsHandler(c *gin.Context) { } func (handler *ApiHandler) LocationBreakdownStatsHandler(c *gin.Context) { - groups := make([]models.OutputResources, 0) - if handler.db == nil { c.JSON(http.StatusInternalServerError, []models.OutputLocations{}) return } - _, err := handler.repo.HandleQuery(c, repository.LocationBreakdownStatKey, &groups, [][3]string{}) + + groups, err := handler.ctrl.LocationStatsBreakdown(c) if err != nil { logrus.WithError(err).Error("scan failed") } @@ -152,7 +134,6 @@ func (handler *ApiHandler) LocationBreakdownStatsHandler(c *gin.Context) { locations := make([]models.OutputLocations, 0) for _, group := range groups { - location := utils.GetLocationFromRegion(group.Label) if location.Label != "" { diff --git a/repository/sql/sql.go b/repository/sql/sql.go index e5aaed810..b216bcb67 100644 --- a/repository/sql/sql.go +++ b/repository/sql/sql.go @@ -59,7 +59,7 @@ var Queries = map[string]repository.Object{ Type: repository.RAW, }, repository.RegionResourceCountKey: { - Query: "SELECT COUNT(*) as count FROM (SELECT DISTINCT region FROM resources) AS temp", + Query: "SELECT COUNT(*) as total FROM (SELECT DISTINCT region FROM resources) AS temp", Type: repository.RAW, }, repository.FilterResourceCountKey: { diff --git a/repository/sqlite/sqlite.go b/repository/sqlite/sqlite.go index b175900dc..cf329c43c 100644 --- a/repository/sqlite/sqlite.go +++ b/repository/sqlite/sqlite.go @@ -60,7 +60,7 @@ var Queries = map[string]repository.Object{ Type: repository.RAW, }, repository.RegionResourceCountKey: { - Query: "SELECT COUNT(*) as count FROM (SELECT DISTINCT region FROM resources) AS temp", + Query: "SELECT COUNT(*) as total FROM (SELECT DISTINCT region FROM resources) AS temp", Type: repository.RAW, }, repository.FilterResourceCountKey: { From 724ebb6a86eeae9ece14851a6f79b482f8114207 Mon Sep 17 00:00:00 2001 From: Azanul Date: Thu, 9 May 2024 10:06:53 +0530 Subject: [PATCH 21/31] feat: stats controller Signed-off-by: Azanul --- controller/controller.go | 16 +++++++++++ controller/stats.go | 20 +++++++++++++ handlers/stats_handler.go | 59 +++++++++------------------------------ 3 files changed, 49 insertions(+), 46 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 30602a755..55cefc42e 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -15,6 +15,22 @@ type costOutput struct { Total float64 `bun:"sum" json:"total"` } +type regionOutput struct { + Region string `bun:"region" json:"region"` +} + +type providerOutput struct { + Provider string `bun:"provider" json:"provider"` +} + +type serviceOutput struct { + Service string `bun:"service" json:"service"` +} + +type accountOutput struct { + Account string `bun:"account" json:"account"` +} + type Repository interface { HandleQuery(context.Context, repository.QueryType, interface{}, [][3]string) (sql.Result, error) } diff --git a/controller/stats.go b/controller/stats.go index b6d4df100..cf484fd3d 100644 --- a/controller/stats.go +++ b/controller/stats.go @@ -11,3 +11,23 @@ func (ctrl *Controller) LocationStatsBreakdown(c context.Context) (groups []mode _, err = ctrl.repo.HandleQuery(c, repository.LocationBreakdownStatKey, &groups, [][3]string{}) return } + +func (ctrl *Controller) ListRegions(c context.Context) (regions []regionOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListRegionsKey, ®ions, nil) + return +} + +func (ctrl *Controller) ListProviders(c context.Context) (providers []providerOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListProvidersKey, &providers, nil) + return +} + +func (ctrl *Controller) ListServices(c context.Context) (services []serviceOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListServicesKey, &services, nil) + return +} + +func (ctrl *Controller) ListAccountNames(c context.Context) (accounts []accountOutput, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListAccountsKey, &accounts, nil) + return +} diff --git a/handlers/stats_handler.go b/handlers/stats_handler.go index fe2fd2d63..0e945ceb3 100644 --- a/handlers/stats_handler.go +++ b/handlers/stats_handler.go @@ -10,31 +10,21 @@ import ( "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" "github.com/uptrace/bun/dialect" ) func (handler *ApiHandler) StatsHandler(c *gin.Context) { - regions := struct { - Count int `bun:"count" json:"total"` - }{} - _, err := handler.repo.HandleQuery(c, repository.RegionResourceCountKey, ®ions, nil) + regions, err := handler.ctrl.CountRegionsFromResources(c) if err != nil { logrus.WithError(err).Error("scan failed") } - resources := struct { - Count int `bun:"total" json:"total"` - }{} - _, err = handler.repo.HandleQuery(c, repository.ResourceCountKey, &resources, nil) + resources, err := handler.ctrl.CountResources(c, "", "") if err != nil { logrus.WithError(err).Error("scan failed") } - cost := struct { - Sum float64 `bun:"sum" json:"total"` - }{} - _, err = handler.repo.HandleQuery(c, repository.ResourceCostSumKey, &cost, nil) + cost, err := handler.ctrl.SumResourceCost(c) if err != nil { logrus.WithError(err).Error("scan failed") } @@ -44,16 +34,16 @@ func (handler *ApiHandler) StatsHandler(c *gin.Context) { Regions int `json:"regions"` Costs float64 `json:"costs"` }{ - Resources: resources.Count, - Regions: regions.Count, - Costs: cost.Sum, + Resources: resources.Total, + Regions: regions.Total, + Costs: cost.Total, } if handler.telemetry { handler.analytics.TrackEvent("global_stats", map[string]interface{}{ - "costs": cost.Sum, - "regions": regions.Count, - "resources": resources.Count, + "costs": cost.Total, + "regions": regions.Total, + "resources": resources.Total, }) } @@ -314,18 +304,12 @@ func (handler *ApiHandler) FilterStatsHandler(c *gin.Context) { } func (handler *ApiHandler) ListRegionsHandler(c *gin.Context) { - type Output struct { - Region string `bun:"region" json:"region"` - } - - outputs := make([]Output, 0) - _, err := handler.repo.HandleQuery(c, repository.ListRegionsKey, &outputs, nil) + outputs, err := handler.ctrl.ListRegions(c) if err != nil { logrus.WithError(err).Error("scan failed") } regions := make([]string, 0) - for _, o := range outputs { regions = append(regions, o.Region) } @@ -334,23 +318,17 @@ func (handler *ApiHandler) ListRegionsHandler(c *gin.Context) { } func (handler *ApiHandler) ListProvidersHandler(c *gin.Context) { - type Output struct { - Provider string `bun:"provider" json:"provider"` - } - if handler.db == nil { c.JSON(http.StatusInternalServerError, []string{}) return } - outputs := make([]Output, 0) - _, err := handler.repo.HandleQuery(c, repository.ListProvidersKey, &outputs, nil) + outputs, err := handler.ctrl.ListProviders(c) if err != nil { logrus.WithError(err).Error("scan failed") } providers := make([]string, 0) - for _, o := range outputs { providers = append(providers, o.Provider) } @@ -359,18 +337,12 @@ func (handler *ApiHandler) ListProvidersHandler(c *gin.Context) { } func (handler *ApiHandler) ListServicesHandler(c *gin.Context) { - type Output struct { - Service string `bun:"service" json:"service"` - } - - outputs := make([]Output, 0) - _, err := handler.repo.HandleQuery(c, repository.ListServicesKey, &outputs, nil) + outputs, err := handler.ctrl.ListServices(c) if err != nil { logrus.WithError(err).Error("scan failed") } services := make([]string, 0) - for _, o := range outputs { services = append(services, o.Service) } @@ -379,17 +351,12 @@ func (handler *ApiHandler) ListServicesHandler(c *gin.Context) { } func (handler *ApiHandler) ListAccountsHandler(c *gin.Context) { - type Output struct { - Account string `bun:"account" json:"account"` - } - if handler.db == nil { c.JSON(http.StatusInternalServerError, []string{}) return } - outputs := make([]Output, 0) - _, err := handler.repo.HandleQuery(c, repository.ListAccountsKey, &outputs, nil) + outputs, err := handler.ctrl.ListAccountNames(c) if err != nil { logrus.WithError(err).Error("scan failed") } From 4d035b044e62648e0e663acb0cbe795e78ac9df8 Mon Sep 17 00:00:00 2001 From: Azanul Date: Thu, 9 May 2024 12:07:05 +0530 Subject: [PATCH 22/31] feat: views controller Signed-off-by: Azanul --- controller/resources.go | 6 ++++++ controller/views.go | 33 +++++++++++++++++++++++++++++++++ handlers/views_handler.go | 32 +++++++++++--------------------- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/controller/resources.go b/controller/resources.go index 9563fe4c9..5bcc74598 100644 --- a/controller/resources.go +++ b/controller/resources.go @@ -2,6 +2,7 @@ package controller import ( "context" + "strings" "github.com/tailwarden/komiser/models" "github.com/tailwarden/komiser/repository" @@ -12,6 +13,11 @@ func (ctrl *Controller) GetResource(c context.Context, resourceId string) (resou return } +func (ctrl *Controller) GetResources(c context.Context, idList string) (resources []models.Resource, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &resources, [][3]string{{"id", "IN", "(" + strings.Trim(idList, "[]") + ")"}}) + return +} + func (ctrl *Controller) ListResources(c context.Context) (resources []models.Resource, err error) { _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &resources, [][3]string{}) return diff --git a/controller/views.go b/controller/views.go index e8ada2e0d..6c26b9bf8 100644 --- a/controller/views.go +++ b/controller/views.go @@ -11,3 +11,36 @@ func (ctrl *Controller) GetView(c context.Context, viewId string) (view models.V _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &view, [][3]string{{"id", "=", viewId}}) return } + +func (ctrl *Controller) ListViews(c context.Context) (views []models.View, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &views, [][3]string{}) + return +} + +func (ctrl *Controller) InsertView(c context.Context, view models.View) (viewId int64, err error) { + result, err := ctrl.repo.HandleQuery(c, repository.InsertKey, &view, nil) + if err != nil { + return + } + return result.LastInsertId() +} + +func (ctrl *Controller) UpdateView(c context.Context, view models.View, viewId string) (err error) { + _, err = ctrl.repo.HandleQuery(c, repository.UpdateViewKey, &view, [][3]string{{"id", "=", viewId}}) + return +} + +func (ctrl *Controller) DeleteView(c context.Context, viewId string) (err error) { + _, err = ctrl.repo.HandleQuery(c, repository.DeleteKey, new(models.View), [][3]string{{"id", "=", viewId}}) + return +} + +func (ctrl *Controller) UpdateViewExclude(c context.Context, view models.View, viewId string) (err error) { + _, err = ctrl.repo.HandleQuery(c, repository.UpdateViewExcludeKey, &view, [][3]string{{"id", "=", viewId}}) + return +} + +func (ctrl *Controller) ListViewAlerts(c context.Context, viewId string) (alerts []models.Alert, err error) { + _, err = ctrl.repo.HandleQuery(c, repository.ListKey, &alerts, [][3]string{{"view_id", "=", viewId}}) + return +} diff --git a/handlers/views_handler.go b/handlers/views_handler.go index 7a77faad1..04c605c86 100644 --- a/handlers/views_handler.go +++ b/handlers/views_handler.go @@ -2,14 +2,11 @@ package handlers import ( "encoding/json" - "fmt" "net/http" - "strings" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/models" - "github.com/tailwarden/komiser/repository" ) func (handler *ApiHandler) NewViewHandler(c *gin.Context) { @@ -20,13 +17,12 @@ func (handler *ApiHandler) NewViewHandler(c *gin.Context) { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - result, err := handler.repo.HandleQuery(c, repository.InsertKey, &view, [][3]string{}) + viewId, err := handler.ctrl.InsertView(c, view) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - viewId, _ := result.LastInsertId() view.Id = viewId if handler.telemetry { @@ -37,9 +33,7 @@ func (handler *ApiHandler) NewViewHandler(c *gin.Context) { } func (handler *ApiHandler) ListViewsHandler(c *gin.Context) { - views := make([]models.View, 0) - - _, err := handler.repo.HandleQuery(c, repository.ListKey, &views, [][3]string{}) + views, err := handler.ctrl.ListViews(c) if err != nil { logrus.WithError(err).Error("scan failed") c.JSON(http.StatusInternalServerError, gin.H{"error": "scan failed"}) @@ -59,7 +53,7 @@ func (handler *ApiHandler) UpdateViewHandler(c *gin.Context) { return } - _, err = handler.repo.HandleQuery(c, repository.UpdateViewKey, &view, [][3]string{{"id", "=", fmt.Sprint(viewId)}}) + err = handler.ctrl.UpdateView(c, view, viewId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -71,8 +65,7 @@ func (handler *ApiHandler) UpdateViewHandler(c *gin.Context) { func (handler *ApiHandler) DeleteViewHandler(c *gin.Context) { viewId := c.Param("id") - view := new(models.View) - _, err := handler.repo.HandleQuery(c, repository.DeleteKey, view, [][3]string{{"id", "=", fmt.Sprint(viewId)}}) + err := handler.ctrl.DeleteView(c, viewId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -90,7 +83,8 @@ func (handler *ApiHandler) HideResourcesFromViewHandler(c *gin.Context) { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - _, err = handler.repo.HandleQuery(c, repository.UpdateViewExcludeKey, &view, [][3]string{{"id", "=", fmt.Sprint(viewId)}}) + + err = handler.ctrl.UpdateViewExclude(c, view, viewId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -108,7 +102,7 @@ func (handler *ApiHandler) UnhideResourcesFromViewHandler(c *gin.Context) { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - _, err = handler.repo.HandleQuery(c, repository.UpdateViewExcludeKey, &view, [][3]string{{"id", "=", fmt.Sprint(viewId)}}) + err = handler.ctrl.UpdateViewExclude(c, view, viewId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return @@ -120,19 +114,17 @@ func (handler *ApiHandler) UnhideResourcesFromViewHandler(c *gin.Context) { func (handler *ApiHandler) ListHiddenResourcesHandler(c *gin.Context) { viewId := c.Param("id") - view := new(models.View) - _, err := handler.repo.HandleQuery(c, repository.ListKey, &view, [][3]string{{"id", "=", fmt.Sprint(viewId)}}) + view, err := handler.ctrl.GetView(c, viewId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } - resources := make([]models.Resource, len(view.Exclude)) - + var resources []models.Resource if len(view.Exclude) > 0 { s, _ := json.Marshal(view.Exclude) - _, err = handler.repo.HandleQuery(c, repository.ListKey, &resources, [][3]string{{"id", "IN", strings.Trim(string(s), "[]")}}) + resources, err = handler.ctrl.GetResources(c, string(s)) if err != nil { logrus.WithError(err).Error("scan failed") } @@ -145,9 +137,7 @@ func (handler *ApiHandler) ListHiddenResourcesHandler(c *gin.Context) { func (handler *ApiHandler) ListViewAlertsHandler(c *gin.Context) { viewId := c.Param("id") - alerts := make([]models.Alert, 0) - - _, err := handler.repo.HandleQuery(c, repository.ListKey, &alerts, [][3]string{{"view_id", "=", fmt.Sprint(viewId)}}) + alerts, err := handler.ctrl.ListViewAlerts(c, viewId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return From 29c5bcd273b5a6a5d072d82a5eed81dd5b715bee Mon Sep 17 00:00:00 2001 From: Azanul Date: Thu, 9 May 2024 12:27:00 +0530 Subject: [PATCH 23/31] feat: sql -> postgres Signed-off-by: Azanul --- repository/{sql/sql.go => postgres/postgres.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename repository/{sql/sql.go => postgres/postgres.go} (100%) diff --git a/repository/sql/sql.go b/repository/postgres/postgres.go similarity index 100% rename from repository/sql/sql.go rename to repository/postgres/postgres.go From 11580ca05897806b2bcd75bfd2d09ce533f5868c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 23:26:37 +0000 Subject: [PATCH 24/31] chore(deps-dev): bump @storybook/nextjs in /dashboard Bumps [@storybook/nextjs](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/nextjs) from 7.5.2 to 8.0.10. - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.0.10/code/frameworks/nextjs) --- updated-dependencies: - dependency-name: "@storybook/nextjs" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 3634 ++++++++++++++++++++--------------- dashboard/package.json | 2 +- 2 files changed, 2113 insertions(+), 1523 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index df2273b97..7243ae13e 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -38,7 +38,7 @@ "@storybook/addon-links": "^8.0.4", "@storybook/addons": "^7.4.6", "@storybook/blocks": "^7.6.4", - "@storybook/nextjs": "^7.5.2", + "@storybook/nextjs": "^8.0.10", "@storybook/preview-api": "^7.6.17", "@storybook/react": "^7.4.6", "@storybook/testing-library": "^0.2.2", @@ -126,105 +126,41 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -238,11 +174,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -252,13 +183,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -289,13 +220,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -312,19 +243,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dev": true, "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-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -370,9 +301,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -417,38 +348,38 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "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-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -470,9 +401,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "engines": { "node": ">=6.9.0" } @@ -495,13 +426,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -512,11 +443,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -535,75 +466,76 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -674,9 +606,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -684,13 +616,29 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -700,14 +648,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -716,6 +664,22 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -871,12 +835,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -886,12 +850,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -925,11 +889,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1041,12 +1005,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1072,12 +1036,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1087,14 +1051,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1105,14 +1069,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1122,12 +1086,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1137,12 +1101,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1152,13 +1116,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1168,13 +1132,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.4", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1185,19 +1149,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dev": true, "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", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -1208,13 +1171,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1224,12 +1187,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1239,13 +1202,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1255,12 +1218,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1270,12 +1233,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1286,13 +1249,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1302,12 +1265,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1334,12 +1297,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1349,14 +1313,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1366,12 +1330,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1382,12 +1346,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1397,12 +1361,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1413,12 +1377,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1428,13 +1392,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1444,13 +1408,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -1461,15 +1425,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1479,13 +1443,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1511,12 +1475,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1526,12 +1490,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1542,12 +1506,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1558,16 +1522,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1577,13 +1540,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1593,12 +1556,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1609,12 +1572,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1626,12 +1589,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1641,13 +1604,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1657,14 +1620,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dev": true, "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/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1675,12 +1638,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1690,12 +1653,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", - "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1705,16 +1668,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "dependencies": { "@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-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" @@ -1739,13 +1702,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", - "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1755,12 +1718,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1771,12 +1734,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1786,16 +1749,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", - "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", "dev": true, "dependencies": { - "@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", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -1815,12 +1778,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1830,12 +1793,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -1846,12 +1809,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1861,12 +1824,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1876,12 +1839,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1891,15 +1854,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", + "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", "dev": true, "dependencies": { "@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/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1909,12 +1872,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1924,13 +1887,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1940,13 +1903,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1956,13 +1919,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1972,25 +1935,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", - "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", - "dev": true, - "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", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@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.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", "@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", @@ -2002,59 +1967,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@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-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.5", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.5", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", "@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/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@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", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2106,17 +2070,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", - "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", "dev": true, "dependencies": { - "@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/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2126,16 +2090,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz", - "integrity": "sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", "dev": true, "dependencies": { - "@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.22.15", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2307,9 +2271,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2319,32 +2283,32 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -2352,12 +2316,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3226,6 +3190,16 @@ "node": ">=10.0.0" } }, + "node_modules/@emnapi/runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.1.1.tgz", + "integrity": "sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", @@ -3482,198 +3456,648 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.3.tgz", + "integrity": "sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.2" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.3.tgz", + "integrity": "sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.2" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", + "integrity": "sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", + "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", + "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", + "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", + "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", + "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", + "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", + "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.3.tgz", + "integrity": "sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.3.tgz", + "integrity": "sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.3.tgz", + "integrity": "sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.3.tgz", + "integrity": "sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.3.tgz", + "integrity": "sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.3.tgz", + "integrity": "sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.3.tgz", + "integrity": "sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.1.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.3.tgz", + "integrity": "sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.3.tgz", + "integrity": "sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -3950,13 +4374,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -3971,9 +4395,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -3994,9 +4418,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4268,16 +4692,14 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.13.tgz", + "integrity": "sha512-odZVYXly+JwzYri9rKqqUAk0cY6zLpv4dxoKinhoJNShV36Gpxf+CyDIILJ4tYsJ1ZxIWs233Y39iVnynvDA/g==", "dev": true, "dependencies": { "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", @@ -4292,7 +4714,7 @@ "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -5076,284 +5498,93 @@ "integrity": "sha512-XjnyE6ORREz9kBWWHdXaIjS9P2Wo7uEw+y23vfLQwzV0Nx3xJ+FG4dwf8onyIoeCZDKbz7cqQIbugU1gkgUtZw==", "dependencies": { "@sentry/core": "7.70.0", - "@sentry/types": "7.70.0", - "@sentry/utils": "7.70.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sentry/tracing": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.70.0.tgz", - "integrity": "sha512-IBEkYl+RZD8QnRXi2vIa2nC2hueYeK6nK3hxsZNXmNC7x+OzRl/5n1kCH97Zoob2cnuSu9ap/duujC6odiB4Mw==", - "dependencies": { - "@sentry-internal/tracing": "7.70.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/types": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.70.0.tgz", - "integrity": "sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.70.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.70.0.tgz", - "integrity": "sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==", - "dependencies": { - "@sentry/types": "7.70.0", - "tslib": "^2.4.1 || ^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@storybook/addon-actions": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.5.2.tgz", - "integrity": "sha512-jKF3rrMEu42TgZ5AEszADpVdASDu1S4Ozp1Ymf4akHLkaMOv+yzzD7LV6YGjJz8S2IryndZqE47e6stF0T99uA==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/components": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "polished": "^4.2.2", - "prop-types": "^15.7.2", - "react-inspector": "^6.0.0", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0", - "uuid": "^9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/channels": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.5.2.tgz", - "integrity": "sha512-3SgqWq9NS0XX1QxK3riuaOLrReHWwVhI63u6q1ryDD3SttpmAezZETibOAtzDuk2FKgsyHTmAlmcGQf4ZxhOJA==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/client-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.5.2.tgz", - "integrity": "sha512-7YgLItlmiYDzWYexTaRNuHhtFarh9krsI+8l7Yjn9ryoHSTJUcTWx+yPJm1II+PQR8v/x5UgsxzultjgEurfRQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/components": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.5.2.tgz", - "integrity": "sha512-OP+o6AoxoQDbqjk/jdQ1arlc1T8601eCL+rS1dJY9EtAFq7Z0LEFtafhEW/Lx8FotfVGjfCNptH9ODhHU6e5Jw==", - "dev": true, - "dependencies": { - "@radix-ui/react-select": "^1.2.2", - "@radix-ui/react-toolbar": "^1.0.4", - "@storybook/client-logger": "7.5.2", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", - "memoizerific": "^1.11.3", - "use-resize-observer": "^9.1.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "@sentry/types": "7.70.0", + "@sentry/utils": "7.70.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "engines": { + "node": ">=12" } }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/core-events": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.5.2.tgz", - "integrity": "sha512-DV8bFEFVKDEvaH87KYPXDE0YEV+Y9yjFv2xxmC9pF8l+MWCtVW72RBLhB+gU5NM1bkHrRDNb0lOJfVGKlhxOog==", - "dev": true, + "node_modules/@sentry/tracing": { + "version": "7.70.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.70.0.tgz", + "integrity": "sha512-IBEkYl+RZD8QnRXi2vIa2nC2hueYeK6nK3hxsZNXmNC7x+OzRl/5n1kCH97Zoob2cnuSu9ap/duujC6odiB4Mw==", "dependencies": { - "ts-dedent": "^2.0.0" + "@sentry-internal/tracing": "7.70.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": ">=8" } }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/manager-api": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.5.2.tgz", - "integrity": "sha512-WX8GjBkITRQzhQ08WEAVjdDW8QqqIQhWOpFzXUYCxCNzt1eSALI31QQ+M1/MYymw+TOkotC/SMcn/puIAm4rdA==", - "dev": true, + "node_modules/@sentry/types": { + "version": "7.70.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.70.0.tgz", + "integrity": "sha512-rY4DqpiDBtXSk4MDNBH3dwWqfPbNBI/9GA7Y5WJSIcObBtfBKp0fzYliHJZD0pgM7d4DPFrDn42K9Iiumgymkw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.70.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.70.0.tgz", + "integrity": "sha512-0cChMH0lsGp+5I3D4wOHWwjFN19HVrGUs7iWTLTO5St3EaVbdeLbI1vFXHxMxvopbwgpeZafbreHw/loIdZKpw==", "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/router": "7.5.2", - "@storybook/theming": "7.5.2", - "@storybook/types": "7.5.2", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "semver": "^7.3.7", - "store2": "^2.14.2", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "@sentry/types": "7.70.0", + "tslib": "^2.4.1 || ^1.9.3" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/preview-api": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.5.2.tgz", - "integrity": "sha512-rpmHR/09UBSnorDBTcE7JgHUQjZLO146NCI+vbI7Pqfb4QX/8lhwkFr4cuHRAR16mv6DAJbDVoPETO0Z/CH9aw==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.5.2", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "type-detect": "4.0.8" } }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/router": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.5.2.tgz", - "integrity": "sha512-jlh48TVUlqvGkU8MnkVp9SrCHomWGtQGx1WMK94NMyOPVPTLWzM6LjIybgmHz0MTe4lpzmbiIOfSlU3pPX054w==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "memoizerific": "^1.11.3", - "qs": "^6.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/theming": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.5.2.tgz", - "integrity": "sha512-DZBTcYErSYvmTYsGz7lKtiIcBe8flBw5Ojp52r3O4GcRYG4AbuUwwVvehz+O1cWaS+UW3HavrcgapERH7ZHd1A==", + "node_modules/@storybook/addon-actions": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.0.10.tgz", + "integrity": "sha512-IEuc30UAFl7Ws0GwaY/whjBnGaViVEVjmPc+MXUym2wwwJbnCbI+BKJxPoYi/I7QJb5aUNToAE6pl2pDda2g3Q==", "dev": true, "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.5.2", + "@storybook/core-events": "8.0.10", "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/types": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.5.2.tgz", - "integrity": "sha512-RDKHo6WUES+4nt7uZMfankjxdpYX2EI2GpJ2n2RPcnhzmb/ub1huNTjbzDEYMqY24SppljZeIN57m3Ar6L6f9A==", + "node_modules/@storybook/addon-actions/node_modules/@storybook/core-events": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.10.tgz", + "integrity": "sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", @@ -6686,45 +6917,43 @@ "dev": true }, "node_modules/@storybook/builder-webpack5": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.5.2.tgz", - "integrity": "sha512-eGMbwyw65z1Fmsq6U/rXPjywBCDwtI5ZvV9zendxxeAVNLpzTFioxlRNYsYZqcLEfE6GoNYjIOkn4S9UV0N+VA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.22.0", - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/core-webpack": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/preview": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@swc/core": "^1.3.82", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.0.10.tgz", + "integrity": "sha512-FrETNEPu9UcZD8yRIQhszcmdMMS73yXRbZFldeZzJ2b8lKNJG+tmqRwh5d5xEMzMrENYkDY+sXheOLSjKfvq9g==", + "dev": true, + "dependencies": { + "@storybook/channels": "8.0.10", + "@storybook/client-logger": "8.0.10", + "@storybook/core-common": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/core-webpack": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/preview": "8.0.10", + "@storybook/preview-api": "8.0.10", "@types/node": "^18.0.0", "@types/semver": "^7.3.4", - "babel-loader": "^9.0.0", - "babel-plugin-named-exports-order": "^0.0.2", "browser-assert": "^1.2.1", "case-sensitive-paths-webpack-plugin": "^2.4.0", + "cjs-module-lexer": "^1.2.3", "constants-browserify": "^1.0.0", "css-loader": "^6.7.1", + "es-module-lexer": "^1.4.1", "express": "^4.17.3", "fork-ts-checker-webpack-plugin": "^8.0.0", "fs-extra": "^11.1.0", "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", "path-browserify": "^1.0.1", "process": "^0.11.10", "semver": "^7.3.7", "style-loader": "^3.3.1", - "swc-loader": "^0.2.3", "terser-webpack-plugin": "^5.3.1", "ts-dedent": "^2.0.0", "url": "^0.11.0", "util": "^0.12.4", "util-deprecate": "^1.0.2", "webpack": "5", - "webpack-dev-middleware": "^6.1.1", + "webpack-dev-middleware": "^6.1.2", "webpack-hot-middleware": "^2.25.1", "webpack-virtual-modules": "^0.5.0" }, @@ -6739,15 +6968,14 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@storybook/channels": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.5.2.tgz", - "integrity": "sha512-3SgqWq9NS0XX1QxK3riuaOLrReHWwVhI63u6q1ryDD3SttpmAezZETibOAtzDuk2FKgsyHTmAlmcGQf4ZxhOJA==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.0.10.tgz", + "integrity": "sha512-3JLxfD7czlx31dAGvAYJ4J4BNE/Y2+hhj/dsV3xlQTHKVpnWknaoeYEC1a6YScyfsH6W+XmP2rzZKzH4EkLSGQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "8.0.10", + "@storybook/core-events": "8.0.10", "@storybook/global": "^5.0.0", - "qs": "^6.10.0", "telejson": "^7.2.0", "tiny-invariant": "^1.3.1" }, @@ -6757,9 +6985,9 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@storybook/client-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.5.2.tgz", - "integrity": "sha512-7YgLItlmiYDzWYexTaRNuHhtFarh9krsI+8l7Yjn9ryoHSTJUcTWx+yPJm1II+PQR8v/x5UgsxzultjgEurfRQ==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.0.10.tgz", + "integrity": "sha512-u38SbZNAunZzxZNHMJb9jkUwFkLyWxmvp4xtiRM3u9sMUShXoTnzbw1yKrxs+kYJjg+58UQPZ1JhEBRcHt5Oww==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -6770,21 +6998,22 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@storybook/core-common": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.5.2.tgz", - "integrity": "sha512-js7fIH4wHS08dBuIVsr3JnwMtKn5O1Izc/Zor4t6PntLWkGGX4X/GxbOkasGX5SkCT1qUtB9RpdPd1sUkLhIgw==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.0.10.tgz", + "integrity": "sha512-hsFlPieputaDQoxstnPa3pykTc4bUwEDgCHf8U43+/Z7qmLOQ9fpG+2CFW930rsCRghYpPreOvsmhY7lsGKWLQ==", "dev": true, "dependencies": { - "@storybook/core-events": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/types": "7.5.2", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", + "@storybook/core-events": "8.0.10", + "@storybook/csf-tools": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/types": "8.0.10", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", "chalk": "^4.1.0", - "esbuild": "^0.18.0", + "cross-spawn": "^7.0.3", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", "esbuild-register": "^3.5.0", + "execa": "^5.0.0", "file-system-cache": "2.3.0", "find-cache-dir": "^3.0.0", "find-up": "^5.0.0", @@ -6797,7 +7026,11 @@ "pkg-dir": "^5.0.0", "pretty-hrtime": "^1.0.3", "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" + "semver": "^7.3.7", + "tempy": "^1.0.1", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4" }, "funding": { "type": "opencollective", @@ -6805,11 +7038,32 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@storybook/core-events": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.5.2.tgz", - "integrity": "sha512-DV8bFEFVKDEvaH87KYPXDE0YEV+Y9yjFv2xxmC9pF8l+MWCtVW72RBLhB+gU5NM1bkHrRDNb0lOJfVGKlhxOog==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.10.tgz", + "integrity": "sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@storybook/csf-tools": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.0.10.tgz", + "integrity": "sha512-xUc6fVIKoCujf/7JZhkYjrVXeNsTSoDrZFNmqLEmtfktJVqYdXY4LuSAtlBmAIyETi09ULTuuVexrcKFwjzuBA==", "dev": true, "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "@storybook/csf": "^0.1.4", + "@storybook/types": "8.0.10", + "fs-extra": "^11.1.0", + "recast": "^0.23.5", "ts-dedent": "^2.0.0" }, "funding": { @@ -6818,9 +7072,9 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@storybook/node-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.5.2.tgz", - "integrity": "sha512-VIBuwPJOylu8vJofk1VfmqxlhXgbBgV0pCTo/UzdQAbc3w5y+qNRemf8goWxYEY+L9p6oUXqm/i9+bNGyX7/Mw==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.10.tgz", + "integrity": "sha512-UMmaUaA3VOX/mKLsSvOnbZre2/1tZ6hazA6H0eAnClKb51jRD1AJrsBYK+uHr/CAp7t710bB5U8apPov7hayDw==", "dev": true, "funding": { "type": "opencollective", @@ -6828,23 +7082,23 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@storybook/preview-api": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.5.2.tgz", - "integrity": "sha512-rpmHR/09UBSnorDBTcE7JgHUQjZLO146NCI+vbI7Pqfb4QX/8lhwkFr4cuHRAR16mv6DAJbDVoPETO0Z/CH9aw==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.0.10.tgz", + "integrity": "sha512-uZ6btF7Iloz9TnDcKLQ5ydi2YK0cnulv/8FLQhBCwSrzLLLb+T2DGz0cAeuWZEvMUNWNmkWJ9PAFQFs09/8p/Q==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/csf": "^0.1.0", + "@storybook/channels": "8.0.10", + "@storybook/client-logger": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/csf": "^0.1.4", "@storybook/global": "^5.0.0", - "@storybook/types": "7.5.2", + "@storybook/types": "8.0.10", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", + "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" }, @@ -6854,13 +7108,12 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@storybook/types": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.5.2.tgz", - "integrity": "sha512-RDKHo6WUES+4nt7uZMfankjxdpYX2EI2GpJ2n2RPcnhzmb/ub1huNTjbzDEYMqY24SppljZeIN57m3Ar6L6f9A==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.10.tgz", + "integrity": "sha512-S/hKS7+SqNnYIehwxdQ4M2nnlfGDdYWAXdtPCVJCmS+YF2amgAxeuisiHbUg7eypds6VL0Oxk/j2nPEHOHk9pg==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@types/babel__core": "^7.0.0", + "@storybook/channels": "8.0.10", "@types/express": "^4.7.0", "file-system-cache": "2.3.0" }, @@ -6870,9 +7123,9 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -7802,14 +8055,14 @@ "dev": true }, "node_modules/@storybook/core-webpack": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.5.2.tgz", - "integrity": "sha512-2Z6EkiiDIbwHY6w9ye8hbm7GicJbUYsFOFFx/96uKKxHB4DPcKK3A3bAT5eNBVQlN+7DMolFuJAZA7pz87KUhA==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.0.10.tgz", + "integrity": "sha512-nfhdhulKk0BTQA2e5cuoEpu+mdZawMr7DNnpc29gkTl8sRsED+4TR5HTjWUVCRqMb/a1UNbY4QVe7ozM/rVNdQ==", "dev": true, "dependencies": { - "@storybook/core-common": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/types": "7.5.2", + "@storybook/core-common": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/types": "8.0.10", "@types/node": "^18.0.0", "ts-dedent": "^2.0.0" }, @@ -7819,15 +8072,14 @@ } }, "node_modules/@storybook/core-webpack/node_modules/@storybook/channels": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.5.2.tgz", - "integrity": "sha512-3SgqWq9NS0XX1QxK3riuaOLrReHWwVhI63u6q1ryDD3SttpmAezZETibOAtzDuk2FKgsyHTmAlmcGQf4ZxhOJA==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.0.10.tgz", + "integrity": "sha512-3JLxfD7czlx31dAGvAYJ4J4BNE/Y2+hhj/dsV3xlQTHKVpnWknaoeYEC1a6YScyfsH6W+XmP2rzZKzH4EkLSGQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "8.0.10", + "@storybook/core-events": "8.0.10", "@storybook/global": "^5.0.0", - "qs": "^6.10.0", "telejson": "^7.2.0", "tiny-invariant": "^1.3.1" }, @@ -7837,9 +8089,9 @@ } }, "node_modules/@storybook/core-webpack/node_modules/@storybook/client-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.5.2.tgz", - "integrity": "sha512-7YgLItlmiYDzWYexTaRNuHhtFarh9krsI+8l7Yjn9ryoHSTJUcTWx+yPJm1II+PQR8v/x5UgsxzultjgEurfRQ==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.0.10.tgz", + "integrity": "sha512-u38SbZNAunZzxZNHMJb9jkUwFkLyWxmvp4xtiRM3u9sMUShXoTnzbw1yKrxs+kYJjg+58UQPZ1JhEBRcHt5Oww==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -7850,21 +8102,22 @@ } }, "node_modules/@storybook/core-webpack/node_modules/@storybook/core-common": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.5.2.tgz", - "integrity": "sha512-js7fIH4wHS08dBuIVsr3JnwMtKn5O1Izc/Zor4t6PntLWkGGX4X/GxbOkasGX5SkCT1qUtB9RpdPd1sUkLhIgw==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.0.10.tgz", + "integrity": "sha512-hsFlPieputaDQoxstnPa3pykTc4bUwEDgCHf8U43+/Z7qmLOQ9fpG+2CFW930rsCRghYpPreOvsmhY7lsGKWLQ==", "dev": true, "dependencies": { - "@storybook/core-events": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/types": "7.5.2", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", + "@storybook/core-events": "8.0.10", + "@storybook/csf-tools": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/types": "8.0.10", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", "chalk": "^4.1.0", - "esbuild": "^0.18.0", + "cross-spawn": "^7.0.3", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", "esbuild-register": "^3.5.0", + "execa": "^5.0.0", "file-system-cache": "2.3.0", "find-cache-dir": "^3.0.0", "find-up": "^5.0.0", @@ -7877,6 +8130,23 @@ "pkg-dir": "^5.0.0", "pretty-hrtime": "^1.0.3", "resolve-from": "^5.0.0", + "semver": "^7.3.7", + "tempy": "^1.0.1", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-webpack/node_modules/@storybook/core-events": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.10.tgz", + "integrity": "sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==", + "dev": true, + "dependencies": { "ts-dedent": "^2.0.0" }, "funding": { @@ -7884,12 +8154,20 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-webpack/node_modules/@storybook/core-events": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.5.2.tgz", - "integrity": "sha512-DV8bFEFVKDEvaH87KYPXDE0YEV+Y9yjFv2xxmC9pF8l+MWCtVW72RBLhB+gU5NM1bkHrRDNb0lOJfVGKlhxOog==", + "node_modules/@storybook/core-webpack/node_modules/@storybook/csf-tools": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.0.10.tgz", + "integrity": "sha512-xUc6fVIKoCujf/7JZhkYjrVXeNsTSoDrZFNmqLEmtfktJVqYdXY4LuSAtlBmAIyETi09ULTuuVexrcKFwjzuBA==", "dev": true, "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "@storybook/csf": "^0.1.4", + "@storybook/types": "8.0.10", + "fs-extra": "^11.1.0", + "recast": "^0.23.5", "ts-dedent": "^2.0.0" }, "funding": { @@ -7898,9 +8176,9 @@ } }, "node_modules/@storybook/core-webpack/node_modules/@storybook/node-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.5.2.tgz", - "integrity": "sha512-VIBuwPJOylu8vJofk1VfmqxlhXgbBgV0pCTo/UzdQAbc3w5y+qNRemf8goWxYEY+L9p6oUXqm/i9+bNGyX7/Mw==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.10.tgz", + "integrity": "sha512-UMmaUaA3VOX/mKLsSvOnbZre2/1tZ6hazA6H0eAnClKb51jRD1AJrsBYK+uHr/CAp7t710bB5U8apPov7hayDw==", "dev": true, "funding": { "type": "opencollective", @@ -7908,13 +8186,12 @@ } }, "node_modules/@storybook/core-webpack/node_modules/@storybook/types": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.5.2.tgz", - "integrity": "sha512-RDKHo6WUES+4nt7uZMfankjxdpYX2EI2GpJ2n2RPcnhzmb/ub1huNTjbzDEYMqY24SppljZeIN57m3Ar6L6f9A==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.10.tgz", + "integrity": "sha512-S/hKS7+SqNnYIehwxdQ4M2nnlfGDdYWAXdtPCVJCmS+YF2amgAxeuisiHbUg7eypds6VL0Oxk/j2nPEHOHk9pg==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@types/babel__core": "^7.0.0", + "@storybook/channels": "8.0.10", "@types/express": "^4.7.0", "file-system-cache": "2.3.0" }, @@ -7924,9 +8201,9 @@ } }, "node_modules/@storybook/core-webpack/node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8400,17 +8677,336 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/manager-api/node_modules/@storybook/theming": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.0.5.tgz", - "integrity": "sha512-Hy4hJaKg6UUyivkUM77nCHccv4/lO++ZG9F88qBFVPdBlCwMHHnUrR7Hgje5cCVAy0jK6LyYlD3cWO6nS9OR8w==", + "node_modules/@storybook/manager-api/node_modules/@storybook/theming": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.0.5.tgz", + "integrity": "sha512-Hy4hJaKg6UUyivkUM77nCHccv4/lO++ZG9F88qBFVPdBlCwMHHnUrR7Hgje5cCVAy0jK6LyYlD3cWO6nS9OR8w==", + "dev": true, + "dependencies": { + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@storybook/client-logger": "8.0.5", + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/manager-api/node_modules/@storybook/types": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.5.tgz", + "integrity": "sha512-lYXwYF9qooQhYJkg3HWr6PD/vnQK+iO8fSKS8jtntwgJUKJvTbGZKAhNnS8WzNEI9jIp5QXFsSA367NjIDPaeQ==", + "dev": true, + "dependencies": { + "@storybook/channels": "8.0.5", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-8.0.10.tgz", + "integrity": "sha512-8925hXUwxvxwkibEqJl3ZkAn4/jl9DzJmhs0O8dU6FQGi5iuJ5cuhtSHAEIi22VBFXzGtJ4DmrKNB3xmBfY44g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.2", + "@babel/runtime": "^7.23.2", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", + "@storybook/addon-actions": "8.0.10", + "@storybook/builder-webpack5": "8.0.10", + "@storybook/core-common": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/preset-react-webpack": "8.0.10", + "@storybook/preview-api": "8.0.10", + "@storybook/react": "8.0.10", + "@storybook/types": "8.0.10", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "babel-loader": "^9.1.3", + "css-loader": "^6.7.3", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "image-size": "^1.0.0", + "loader-utils": "^3.2.1", + "node-polyfill-webpack-plugin": "^2.0.1", + "pnp-webpack-plugin": "^1.7.0", + "postcss": "^8.4.21", + "postcss-loader": "^7.0.2", + "react-refresh": "^0.14.0", + "resolve-url-loader": "^5.0.0", + "sass-loader": "^12.4.0", + "semver": "^7.3.5", + "style-loader": "^3.3.1", + "styled-jsx": "5.1.1", + "ts-dedent": "^2.0.0", + "tsconfig-paths": "^4.0.0", + "tsconfig-paths-webpack-plugin": "^4.0.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "optionalDependencies": { + "sharp": "^0.33.3" + }, + "peerDependencies": { + "next": "^13.5.0 || ^14.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/channels": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.0.10.tgz", + "integrity": "sha512-3JLxfD7czlx31dAGvAYJ4J4BNE/Y2+hhj/dsV3xlQTHKVpnWknaoeYEC1a6YScyfsH6W+XmP2rzZKzH4EkLSGQ==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/global": "^5.0.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/client-logger": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.0.10.tgz", + "integrity": "sha512-u38SbZNAunZzxZNHMJb9jkUwFkLyWxmvp4xtiRM3u9sMUShXoTnzbw1yKrxs+kYJjg+58UQPZ1JhEBRcHt5Oww==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/core-common": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.0.10.tgz", + "integrity": "sha512-hsFlPieputaDQoxstnPa3pykTc4bUwEDgCHf8U43+/Z7qmLOQ9fpG+2CFW930rsCRghYpPreOvsmhY7lsGKWLQ==", + "dev": true, + "dependencies": { + "@storybook/core-events": "8.0.10", + "@storybook/csf-tools": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/types": "8.0.10", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "cross-spawn": "^7.0.3", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", + "esbuild-register": "^3.5.0", + "execa": "^5.0.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "semver": "^7.3.7", + "tempy": "^1.0.1", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/core-events": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.10.tgz", + "integrity": "sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==", + "dev": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/csf-tools": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.0.10.tgz", + "integrity": "sha512-xUc6fVIKoCujf/7JZhkYjrVXeNsTSoDrZFNmqLEmtfktJVqYdXY4LuSAtlBmAIyETi09ULTuuVexrcKFwjzuBA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "@storybook/csf": "^0.1.4", + "@storybook/types": "8.0.10", + "fs-extra": "^11.1.0", + "recast": "^0.23.5", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/docs-tools": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.0.10.tgz", + "integrity": "sha512-rg9KS81vEh13VMr4mAgs+7L4kYqoRtG7kVfV1WHxzJxjR3wYcVR0kP9gPTWV4Xha/TA3onHu9sxKxMTWha0urQ==", + "dev": true, + "dependencies": { + "@storybook/core-common": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/preview-api": "8.0.10", + "@storybook/types": "8.0.10", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/node-logger": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.10.tgz", + "integrity": "sha512-UMmaUaA3VOX/mKLsSvOnbZre2/1tZ6hazA6H0eAnClKb51jRD1AJrsBYK+uHr/CAp7t710bB5U8apPov7hayDw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/preview-api": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.0.10.tgz", + "integrity": "sha512-uZ6btF7Iloz9TnDcKLQ5ydi2YK0cnulv/8FLQhBCwSrzLLLb+T2DGz0cAeuWZEvMUNWNmkWJ9PAFQFs09/8p/Q==", + "dev": true, + "dependencies": { + "@storybook/channels": "8.0.10", + "@storybook/client-logger": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/csf": "^0.1.4", + "@storybook/global": "^5.0.0", + "@storybook/types": "8.0.10", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/react": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.0.10.tgz", + "integrity": "sha512-/MIMc02TNmiNXDzk55dm9+ujfNE5LVNeqqK+vxXWLlCZ0aXRAd1/ZLYeRFuYLgEETB7mh7IP8AXjvM68NX5HYg==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "8.0.10", + "@storybook/docs-tools": "8.0.10", + "@storybook/global": "^5.0.0", + "@storybook/preview-api": "8.0.10", + "@storybook/react-dom-shim": "8.0.10", + "@storybook/types": "8.0.10", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^18.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "semver": "^7.3.7", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "typescript": ">= 4.2.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/nextjs/node_modules/@storybook/react-dom-shim": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.0.10.tgz", + "integrity": "sha512-3x8EWEkZebpWpp1pwXEzdabGINwOQt8odM5+hsOlDRtFZBmUqmmzK0rtn7orlcGlOXO4rd6QuZj4Tc5WV28dVQ==", "dev": true, - "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@storybook/client-logger": "8.0.5", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -8418,23 +9014,15 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } } }, - "node_modules/@storybook/manager-api/node_modules/@storybook/types": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.5.tgz", - "integrity": "sha512-lYXwYF9qooQhYJkg3HWr6PD/vnQK+iO8fSKS8jtntwgJUKJvTbGZKAhNnS8WzNEI9jIp5QXFsSA367NjIDPaeQ==", + "node_modules/@storybook/nextjs/node_modules/@storybook/types": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.10.tgz", + "integrity": "sha512-S/hKS7+SqNnYIehwxdQ4M2nnlfGDdYWAXdtPCVJCmS+YF2amgAxeuisiHbUg7eypds6VL0Oxk/j2nPEHOHk9pg==", "dev": true, "dependencies": { - "@storybook/channels": "8.0.5", + "@storybook/channels": "8.0.10", "@types/express": "^4.7.0", "file-system-cache": "2.3.0" }, @@ -8443,91 +9031,73 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.5.2.tgz", - "integrity": "sha512-dpc85lG15cZCWOwKn7bhvU/QhQcxHM0f7lGjfSNnXweoYiSoR6L+5e4C0NX9oWgPlaP3zWAZXXdIKqQ/3U3jeQ==", + "node_modules/@storybook/nextjs/node_modules/@types/node": { + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@storybook/addon-actions": "7.5.2", - "@storybook/builder-webpack5": "7.5.2", - "@storybook/core-common": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/preset-react-webpack": "7.5.2", - "@storybook/preview-api": "7.5.2", - "@storybook/react": "7.5.2", + "undici-types": "~5.26.4" + } + }, + "node_modules/@storybook/node-logger": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.5.tgz", + "integrity": "sha512-ssT8YCcCqgc89ee+EeExCxcOpueOsU05iek2roR+NCZnoCL1DmzcUp8H9t0utLaK/ngPV8zatlzSDVgKTHSIJw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/preset-react-webpack": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.0.10.tgz", + "integrity": "sha512-+I0x8snLl9sfc3xXh51YLXwp0Km4Jhri+JJeT2r+zSI3k/fdu5bLz5NFPcxDmRm5ZPpaQyiLc2Mge4txMkFsZw==", + "dev": true, + "dependencies": { + "@storybook/core-webpack": "8.0.10", + "@storybook/docs-tools": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/react": "8.0.10", + "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", "@types/node": "^18.0.0", - "css-loader": "^6.7.3", + "@types/semver": "^7.3.4", "find-up": "^5.0.0", "fs-extra": "^11.1.0", - "image-size": "^1.0.0", - "loader-utils": "^3.2.0", - "node-polyfill-webpack-plugin": "^2.0.1", - "pnp-webpack-plugin": "^1.7.0", - "postcss": "^8.4.21", - "postcss-loader": "^7.0.2", - "resolve-url-loader": "^5.0.0", - "sass-loader": "^12.4.0", - "semver": "^7.3.5", - "style-loader": "^3.3.1", - "styled-jsx": "5.1.1", - "ts-dedent": "^2.0.0", - "tsconfig-paths": "^4.0.0", - "tsconfig-paths-webpack-plugin": "^4.0.1" + "magic-string": "^0.30.5", + "react-docgen": "^7.0.0", + "resolve": "^1.22.8", + "semver": "^7.3.7", + "tsconfig-paths": "^4.2.0", + "webpack": "5" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@next/font": "^13.0.0|| ^14.0.0", - "next": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "webpack": "^5.0.0" + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { - "@next/font": { - "optional": true - }, - "@storybook/addon-actions": { - "optional": true - }, "typescript": { "optional": true - }, - "webpack": { - "optional": true } } }, - "node_modules/@storybook/nextjs/node_modules/@storybook/channels": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.5.2.tgz", - "integrity": "sha512-3SgqWq9NS0XX1QxK3riuaOLrReHWwVhI63u6q1ryDD3SttpmAezZETibOAtzDuk2FKgsyHTmAlmcGQf4ZxhOJA==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/channels": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.0.10.tgz", + "integrity": "sha512-3JLxfD7czlx31dAGvAYJ4J4BNE/Y2+hhj/dsV3xlQTHKVpnWknaoeYEC1a6YScyfsH6W+XmP2rzZKzH4EkLSGQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", + "@storybook/client-logger": "8.0.10", + "@storybook/core-events": "8.0.10", "@storybook/global": "^5.0.0", - "qs": "^6.10.0", "telejson": "^7.2.0", "tiny-invariant": "^1.3.1" }, @@ -8536,10 +9106,10 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/@storybook/client-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.5.2.tgz", - "integrity": "sha512-7YgLItlmiYDzWYexTaRNuHhtFarh9krsI+8l7Yjn9ryoHSTJUcTWx+yPJm1II+PQR8v/x5UgsxzultjgEurfRQ==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/client-logger": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.0.10.tgz", + "integrity": "sha512-u38SbZNAunZzxZNHMJb9jkUwFkLyWxmvp4xtiRM3u9sMUShXoTnzbw1yKrxs+kYJjg+58UQPZ1JhEBRcHt5Oww==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -8549,22 +9119,23 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/@storybook/core-common": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.5.2.tgz", - "integrity": "sha512-js7fIH4wHS08dBuIVsr3JnwMtKn5O1Izc/Zor4t6PntLWkGGX4X/GxbOkasGX5SkCT1qUtB9RpdPd1sUkLhIgw==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/core-common": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.0.10.tgz", + "integrity": "sha512-hsFlPieputaDQoxstnPa3pykTc4bUwEDgCHf8U43+/Z7qmLOQ9fpG+2CFW930rsCRghYpPreOvsmhY7lsGKWLQ==", "dev": true, "dependencies": { - "@storybook/core-events": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/types": "7.5.2", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", + "@storybook/core-events": "8.0.10", + "@storybook/csf-tools": "8.0.10", + "@storybook/node-logger": "8.0.10", + "@storybook/types": "8.0.10", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", "chalk": "^4.1.0", - "esbuild": "^0.18.0", + "cross-spawn": "^7.0.3", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", "esbuild-register": "^3.5.0", + "execa": "^5.0.0", "file-system-cache": "2.3.0", "find-cache-dir": "^3.0.0", "find-up": "^5.0.0", @@ -8577,17 +9148,21 @@ "pkg-dir": "^5.0.0", "pretty-hrtime": "^1.0.3", "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" + "semver": "^7.3.7", + "tempy": "^1.0.1", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/@storybook/core-events": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.5.2.tgz", - "integrity": "sha512-DV8bFEFVKDEvaH87KYPXDE0YEV+Y9yjFv2xxmC9pF8l+MWCtVW72RBLhB+gU5NM1bkHrRDNb0lOJfVGKlhxOog==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/core-events": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.10.tgz", + "integrity": "sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -8597,144 +9172,171 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/@storybook/node-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.5.2.tgz", - "integrity": "sha512-VIBuwPJOylu8vJofk1VfmqxlhXgbBgV0pCTo/UzdQAbc3w5y+qNRemf8goWxYEY+L9p6oUXqm/i9+bNGyX7/Mw==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/csf-tools": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.0.10.tgz", + "integrity": "sha512-xUc6fVIKoCujf/7JZhkYjrVXeNsTSoDrZFNmqLEmtfktJVqYdXY4LuSAtlBmAIyETi09ULTuuVexrcKFwjzuBA==", "dev": true, + "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "@storybook/csf": "^0.1.4", + "@storybook/types": "8.0.10", + "fs-extra": "^11.1.0", + "recast": "^0.23.5", + "ts-dedent": "^2.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/@storybook/preview-api": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.5.2.tgz", - "integrity": "sha512-rpmHR/09UBSnorDBTcE7JgHUQjZLO146NCI+vbI7Pqfb4QX/8lhwkFr4cuHRAR16mv6DAJbDVoPETO0Z/CH9aw==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/docs-tools": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.0.10.tgz", + "integrity": "sha512-rg9KS81vEh13VMr4mAgs+7L4kYqoRtG7kVfV1WHxzJxjR3wYcVR0kP9gPTWV4Xha/TA3onHu9sxKxMTWha0urQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.5.2", - "@storybook/client-logger": "7.5.2", - "@storybook/core-events": "7.5.2", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.5.2", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" + "@storybook/core-common": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/preview-api": "8.0.10", + "@storybook/types": "8.0.10", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/@storybook/types": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.5.2.tgz", - "integrity": "sha512-RDKHo6WUES+4nt7uZMfankjxdpYX2EI2GpJ2n2RPcnhzmb/ub1huNTjbzDEYMqY24SppljZeIN57m3Ar6L6f9A==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/node-logger": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.10.tgz", + "integrity": "sha512-UMmaUaA3VOX/mKLsSvOnbZre2/1tZ6hazA6H0eAnClKb51jRD1AJrsBYK+uHr/CAp7t710bB5U8apPov7hayDw==", "dev": true, - "dependencies": { - "@storybook/channels": "7.5.2", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/nextjs/node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/preview-api": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.0.10.tgz", + "integrity": "sha512-uZ6btF7Iloz9TnDcKLQ5ydi2YK0cnulv/8FLQhBCwSrzLLLb+T2DGz0cAeuWZEvMUNWNmkWJ9PAFQFs09/8p/Q==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@storybook/node-logger": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.5.tgz", - "integrity": "sha512-ssT8YCcCqgc89ee+EeExCxcOpueOsU05iek2roR+NCZnoCL1DmzcUp8H9t0utLaK/ngPV8zatlzSDVgKTHSIJw==", - "dev": true, + "@storybook/channels": "8.0.10", + "@storybook/client-logger": "8.0.10", + "@storybook/core-events": "8.0.10", + "@storybook/csf": "^0.1.4", + "@storybook/global": "^5.0.0", + "@storybook/types": "8.0.10", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/preset-react-webpack": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.5.2.tgz", - "integrity": "sha512-d0RY45ixWDArW4OSoGYrbm0oZbE6Z3kOi6Z64ed4E1ERQfEizq1EAgW/n7QqDMBKfPMNdNncDyGRiiSIdgyuBg==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/react": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.0.10.tgz", + "integrity": "sha512-/MIMc02TNmiNXDzk55dm9+ujfNE5LVNeqqK+vxXWLlCZ0aXRAd1/ZLYeRFuYLgEETB7mh7IP8AXjvM68NX5HYg==", "dev": true, "dependencies": { - "@babel/preset-flow": "^7.22.5", - "@babel/preset-react": "^7.22.5", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.5", - "@storybook/core-webpack": "7.5.2", - "@storybook/docs-tools": "7.5.2", - "@storybook/node-logger": "7.5.2", - "@storybook/react": "7.5.2", - "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@storybook/client-logger": "8.0.10", + "@storybook/docs-tools": "8.0.10", + "@storybook/global": "^5.0.0", + "@storybook/preview-api": "8.0.10", + "@storybook/react-dom-shim": "8.0.10", + "@storybook/types": "8.0.10", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", "@types/node": "^18.0.0", - "@types/semver": "^7.3.4", - "babel-plugin-add-react-displayname": "^0.0.5", - "babel-plugin-react-docgen": "^4.2.1", - "fs-extra": "^11.1.0", - "react-refresh": "^0.11.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", "semver": "^7.3.7", - "webpack": "5" + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@babel/core": "^7.22.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, "typescript": { "optional": true } } }, - "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/node-logger": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.5.2.tgz", - "integrity": "sha512-VIBuwPJOylu8vJofk1VfmqxlhXgbBgV0pCTo/UzdQAbc3w5y+qNRemf8goWxYEY+L9p6oUXqm/i9+bNGyX7/Mw==", + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/react-dom-shim": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.0.10.tgz", + "integrity": "sha512-3x8EWEkZebpWpp1pwXEzdabGINwOQt8odM5+hsOlDRtFZBmUqmmzK0rtn7orlcGlOXO4rd6QuZj4Tc5WV28dVQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/preset-react-webpack/node_modules/@storybook/types": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.10.tgz", + "integrity": "sha512-S/hKS7+SqNnYIehwxdQ4M2nnlfGDdYWAXdtPCVJCmS+YF2amgAxeuisiHbUg7eypds6VL0Oxk/j2nPEHOHk9pg==", "dev": true, + "dependencies": { + "@storybook/channels": "8.0.10", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, "node_modules/@storybook/preset-react-webpack/node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@storybook/preview": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.5.2.tgz", - "integrity": "sha512-dA5VpHp0D9nh9/wOzWP8At1wtz/SiaMBbwaiEOFTFUGcPerrkroEWadIlSSB7vgQJ9yWiD4l3KDaS8ANzHWtPQ==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.0.10.tgz", + "integrity": "sha512-op7gZqop8PSFyPA4tc1Zds8jG6VnskwpYUUsa44pZoEez9PKEFCf4jE+7AQwbBS3hnuCb0CKBfASN8GRyoznbw==", "dev": true, "funding": { "type": "opencollective", @@ -9293,6 +9895,8 @@ "integrity": "sha512-bEXUtm37bcmJ3q+geG7Zy4rJNUzpxalXQUrrqX1ZoGj3HRtzdeVZ0L/um3fG2j16qe61t8TX/OIZ2G6j6dkG/w==", "dev": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "@swc/types": "^0.1.4" }, @@ -9336,6 +9940,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=10" } @@ -9352,7 +9957,9 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@t3-oss/env-core": { "version": "0.9.2", @@ -9953,9 +10560,9 @@ "dev": true }, "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/@types/pretty-hrtime": { @@ -10024,6 +10631,12 @@ "@types/react": "*" } }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true + }, "node_modules/@types/scheduler": { "version": "0.16.3", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", @@ -11098,18 +11711,6 @@ "node": "*" } }, - "node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -11389,12 +11990,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-add-react-displayname": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", - "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==", - "dev": true - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -11426,20 +12021,14 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/babel-plugin-named-exports-order": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-named-exports-order/-/babel-plugin-named-exports-order-0.0.2.tgz", - "integrity": "sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==", - "dev": true - }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -11456,41 +12045,30 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-react-docgen": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.2.1.tgz", - "integrity": "sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.14.2", - "lodash": "^4.17.15", - "react-docgen": "^5.0.0" - } - }, "node_modules/babel-plugin-styled-components": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", @@ -11972,111 +12550,6 @@ "node": ">= 0.8" } }, - "node_modules/c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/c8/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/c8/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/c8/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/c8/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/c8/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -12320,9 +12793,9 @@ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -12515,6 +12988,20 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -12533,6 +13020,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -12783,8 +13281,7 @@ "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { "version": "0.6.0", @@ -12802,12 +13299,12 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", - "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dev": true, "dependencies": { - "browserslist": "^4.21.10" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -12815,9 +13312,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", - "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.0.tgz", + "integrity": "sha512-d3BrpyFr5eD4KcbRvQ3FTUx/KWmaDesr7+a3+1+P46IUnNoEt+oiLijPINZMEon7w9oGkIINWxrBAU9DEciwFQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -13026,19 +13523,19 @@ } }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -13048,7 +13545,44 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, "node_modules/css-select": { @@ -13538,6 +14072,16 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -14114,9 +14658,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -14928,20 +15472,6 @@ "node": ">=4.0" } }, - "node_modules/estree-to-babel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/estree-to-babel/-/estree-to-babel-3.2.1.tgz", - "integrity": "sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.1.6", - "@babel/types": "^7.2.0", - "c8": "^7.6.0" - }, - "engines": { - "node": ">=8.3.0" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -15676,9 +16206,9 @@ "dev": true }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "node_modules/fs.realpath": { @@ -16352,9 +16882,9 @@ } }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, "funding": [ { @@ -16412,9 +16942,9 @@ "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" }, "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -16431,7 +16961,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -18943,6 +19482,15 @@ "lz-string": "bin/bin.js" } }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -19285,9 +19833,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -20307,9 +20855,9 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -20319,9 +20867,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -20336,9 +20884,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -20961,27 +21509,24 @@ } }, "node_modules/react-docgen": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz", - "integrity": "sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz", + "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==", "dev": true, "dependencies": { - "@babel/core": "^7.7.5", - "@babel/generator": "^7.12.11", - "@babel/runtime": "^7.7.6", - "ast-types": "^0.14.2", - "commander": "^2.19.0", + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", "doctrine": "^3.0.0", - "estree-to-babel": "^3.1.0", - "neo-async": "^2.6.1", - "node-dir": "^0.1.10", - "strip-indent": "^3.0.0" - }, - "bin": { - "react-docgen": "bin/react-docgen.js" + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=16.14.0" } }, "node_modules/react-docgen-typescript": { @@ -20993,12 +21538,27 @@ "typescript": ">= 4.3.x" } }, - "node_modules/react-docgen/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "node_modules/react-docgen/node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", "dev": true }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -21045,24 +21605,15 @@ "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", "dev": true }, - "node_modules/react-inspector": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.2.tgz", - "integrity": "sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==", - "dev": true, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -21575,9 +22126,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -22117,6 +22668,47 @@ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, + "node_modules/sharp": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.3.tgz", + "integrity": "sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.0" + }, + "engines": { + "libvips": ">=8.15.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.3", + "@img/sharp-darwin-x64": "0.33.3", + "@img/sharp-libvips-darwin-arm64": "1.0.2", + "@img/sharp-libvips-darwin-x64": "1.0.2", + "@img/sharp-libvips-linux-arm": "1.0.2", + "@img/sharp-libvips-linux-arm64": "1.0.2", + "@img/sharp-libvips-linux-s390x": "1.0.2", + "@img/sharp-libvips-linux-x64": "1.0.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", + "@img/sharp-libvips-linuxmusl-x64": "1.0.2", + "@img/sharp-linux-arm": "0.33.3", + "@img/sharp-linux-arm64": "0.33.3", + "@img/sharp-linux-s390x": "0.33.3", + "@img/sharp-linux-x64": "0.33.3", + "@img/sharp-linuxmusl-arm64": "0.33.3", + "@img/sharp-linuxmusl-x64": "0.33.3", + "@img/sharp-wasm32": "0.33.3", + "@img/sharp-win32-ia32": "0.33.3", + "@img/sharp-win32-x64": "0.33.3" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -22158,6 +22750,23 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true, + "optional": true + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -22195,9 +22804,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -22633,9 +23242,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -22793,16 +23402,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swc-loader": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.3.tgz", - "integrity": "sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==", - "dev": true, - "peerDependencies": { - "@swc/core": "^1.2.147", - "webpack": ">=2" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -24213,9 +24812,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", - "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz", + "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -24260,9 +24859,9 @@ } }, "node_modules/webpack-hot-middleware": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.4.tgz", - "integrity": "sha512-IRmTspuHM06aZh98OhBJtqLpeWFM8FXJS5UYpKYxCJzyFoyWj1w6VGFfomZU7OPA55dMLrQK0pRT1eQ3PACr4w==", + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", + "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", "dev": true, "dependencies": { "ansi-html-community": "0.0.8", @@ -24676,15 +25275,6 @@ "node": ">=12" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", diff --git a/dashboard/package.json b/dashboard/package.json index 1d24fada1..25474abb9 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -48,7 +48,7 @@ "@storybook/addon-links": "^8.0.4", "@storybook/addons": "^7.4.6", "@storybook/blocks": "^7.6.4", - "@storybook/nextjs": "^7.5.2", + "@storybook/nextjs": "^8.0.10", "@storybook/preview-api": "^7.6.17", "@storybook/react": "^7.4.6", "@storybook/testing-library": "^0.2.2", From 08c597fb511ede3d7a85e9159bc7ef0e7b9feb1b Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 15 May 2024 09:17:24 +0530 Subject: [PATCH 25/31] fix: uninitialized controller and repo Signed-off-by: Azanul --- controller/controller.go | 4 +--- handlers/resources_handler.go | 3 +++ repository/postgres/postgres.go | 7 ++++--- repository/sqlite/sqlite.go | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 55cefc42e..fad69a862 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -3,8 +3,6 @@ package controller import ( "context" "database/sql" - - "github.com/tailwarden/komiser/repository" ) type totalOutput struct { @@ -32,7 +30,7 @@ type accountOutput struct { } type Repository interface { - HandleQuery(context.Context, repository.QueryType, interface{}, [][3]string) (sql.Result, error) + HandleQuery(context.Context, string, interface{}, [][3]string) (sql.Result, error) } type Controller struct { diff --git a/handlers/resources_handler.go b/handlers/resources_handler.go index aecc52247..8d4d3585e 100644 --- a/handlers/resources_handler.go +++ b/handlers/resources_handler.go @@ -12,6 +12,7 @@ import ( "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/controller" "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository/sqlite" "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect" @@ -29,8 +30,10 @@ type ApiHandler struct { } func NewApiHandler(ctx context.Context, telemetry bool, analytics utils.Analytics, db *bun.DB, cfg models.Config, configPath string, accounts []models.Account) *ApiHandler { + repo := sqlite.NewRepository(db) handler := ApiHandler{ db: db, + ctrl: controller.New(repo), ctx: ctx, telemetry: telemetry, cfg: cfg, diff --git a/repository/postgres/postgres.go b/repository/postgres/postgres.go index b216bcb67..356722cd5 100644 --- a/repository/postgres/postgres.go +++ b/repository/postgres/postgres.go @@ -1,4 +1,4 @@ -package sql +package postgres import ( "context" @@ -9,11 +9,12 @@ import ( ) type Repository struct { - db *bun.DB + db *bun.DB + queries map[string]repository.Object } func NewRepository(db *bun.DB) *Repository { - return &Repository{db: db} + return &Repository{db: db, queries: Queries} } var Queries = map[string]repository.Object{ diff --git a/repository/sqlite/sqlite.go b/repository/sqlite/sqlite.go index cf329c43c..b7b8cb65d 100644 --- a/repository/sqlite/sqlite.go +++ b/repository/sqlite/sqlite.go @@ -1,4 +1,4 @@ -package sql +package sqlite import ( "context" From 5beea9822e6e6783472a829458aab5719fd10cc9 Mon Sep 17 00:00:00 2001 From: Azanul Date: Wed, 15 May 2024 11:51:11 +0530 Subject: [PATCH 26/31] feat: handle dialect Signed-off-by: Azanul --- handlers/resources_handler.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/handlers/resources_handler.go b/handlers/resources_handler.go index 8d4d3585e..84f4f5ae3 100644 --- a/handlers/resources_handler.go +++ b/handlers/resources_handler.go @@ -12,6 +12,7 @@ import ( "github.com/sirupsen/logrus" "github.com/tailwarden/komiser/controller" "github.com/tailwarden/komiser/models" + "github.com/tailwarden/komiser/repository/postgres" "github.com/tailwarden/komiser/repository/sqlite" "github.com/tailwarden/komiser/utils" "github.com/uptrace/bun" @@ -30,7 +31,13 @@ type ApiHandler struct { } func NewApiHandler(ctx context.Context, telemetry bool, analytics utils.Analytics, db *bun.DB, cfg models.Config, configPath string, accounts []models.Account) *ApiHandler { - repo := sqlite.NewRepository(db) + var repo controller.Repository + if db.Dialect().Name() == dialect.SQLite { + repo = sqlite.NewRepository(db) + } else { + repo = postgres.NewRepository(db) + } + handler := ApiHandler{ db: db, ctrl: controller.New(repo), From 9d0135f7c72df5b45612cdeb584461d4597bfa03 Mon Sep 17 00:00:00 2001 From: AvineshTripathi Date: Fri, 17 May 2024 01:52:44 +0530 Subject: [PATCH 27/31] fix: db nil error during initiation --- internal/internal.go | 2 +- internal/resources_test.go | 2 +- utils/database.go | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/internal.go b/internal/internal.go index 30cc4805e..64288a8cc 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -41,7 +41,7 @@ func Exec(address string, port int, configPath string, telemetry bool, a utils.A return err } - err = utils.SetupDBConnection(cfg, db) + db, err = utils.SetupDBConnection(cfg) if err != nil { return err } diff --git a/internal/resources_test.go b/internal/resources_test.go index c9bdf4cd6..dbd3af9c0 100644 --- a/internal/resources_test.go +++ b/internal/resources_test.go @@ -21,7 +21,7 @@ func BenchmarkFetchResources(b *testing.B) { if err != nil { b.Fatalf("Error during config setup: %v", err) } - err = utils.SetupDBConnection(cfg, db) + db, err = utils.SetupDBConnection(cfg) if err != nil { b.Fatalf("Error during DB setup: %v", err) } diff --git a/utils/database.go b/utils/database.go index ecea30704..79d95b129 100644 --- a/utils/database.go +++ b/utils/database.go @@ -16,33 +16,34 @@ import ( "github.com/uptrace/bun/migrate" ) -func SetupDBConnection(c *models.Config, db *bun.DB) error { +func SetupDBConnection(c *models.Config) (*bun.DB, error) { var sqldb *sql.DB var err error + var db *bun.DB if len(c.SQLite.File) == 0 && len(c.Postgres.URI) == 0 { log.Println("Database wasn't configured yet") - return nil + return nil, nil } if len(c.SQLite.File) > 0 { sqldb, err = sql.Open(sqliteshim.ShimName, fmt.Sprintf("file:%s?cache=shared", c.SQLite.File)) if err != nil { - return err + return nil, err } sqldb.SetMaxIdleConns(1000) sqldb.SetConnMaxLifetime(0) - *db = *bun.NewDB(sqldb, sqlitedialect.New()) + db = bun.NewDB(sqldb, sqlitedialect.New()) log.Println("Data will be stored in SQLite") } else { sqldb = sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(c.Postgres.URI))) - *db = *bun.NewDB(sqldb, pgdialect.New()) + db = bun.NewDB(sqldb, pgdialect.New()) log.Println("Data will be stored in PostgreSQL") } - return nil + return db, nil } func SetupSchema(db *bun.DB, c *models.Config, accounts []models.Account) error { From 83a276f2b6c6a01a8f57b4f27948e6944af82e6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 23:43:32 +0000 Subject: [PATCH 28/31] chore(deps): bump @formbricks/js from 1.6.2 to 2.0.0 in /dashboard Bumps [@formbricks/js](https://github.com/formbricks/formbricks) from 1.6.2 to 2.0.0. - [Release notes](https://github.com/formbricks/formbricks/releases) - [Commits](https://github.com/formbricks/formbricks/commits/v2.0.0) --- updated-dependencies: - dependency-name: "@formbricks/js" dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 51 +++---------------------------------- dashboard/package.json | 2 +- 2 files changed, 5 insertions(+), 48 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 7243ae13e..83247f841 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -8,7 +8,7 @@ "name": "komiser-dashboard", "version": "3.1.0", "dependencies": { - "@formbricks/js": "^1.6.2", + "@formbricks/js": "^2.0.0", "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", "@tippyjs/react": "^4.2.6", @@ -3416,12 +3416,9 @@ "dev": true }, "node_modules/@formbricks/js": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@formbricks/js/-/js-1.6.2.tgz", - "integrity": "sha512-bx8DJmRk3nfXzRqhvfEZTlYo+bvRA+GCdehwU6C4QH7SIVw5oeh4TF3gwvHu/Hpr5nm5NTkLwyLD7Ne0vx3cyw==", - "dependencies": { - "@t3-oss/env-nextjs": "^0.9.2" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@formbricks/js/-/js-2.0.0.tgz", + "integrity": "sha512-1T0i1zxU3cKDQ3Rxw9DXGoWwLNBEJT2pO2ELuwbGg36u6ijazLA4j61HbNUMuHgEoiyhVtLcTOZF5FquQVzr/A==" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -9961,37 +9958,6 @@ "optional": true, "peer": true }, - "node_modules/@t3-oss/env-core": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@t3-oss/env-core/-/env-core-0.9.2.tgz", - "integrity": "sha512-KgWXljUTHgO3o7GMZQPAD5+P+HqpauMNNHowlm7V2b9IeMitSUpNKwG6xQrup/xARWHTdxRVIl0mSI4wCevQhQ==", - "peerDependencies": { - "typescript": ">=5.0.0", - "zod": "^3.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@t3-oss/env-nextjs": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@t3-oss/env-nextjs/-/env-nextjs-0.9.2.tgz", - "integrity": "sha512-dklHrgKLESStNVB67Jdbu6osxDYA+xNKaPBRerlnkEvzbCccSKMvZENx6EZebJuR4snqB3/yRykNMn/bdIAyiQ==", - "dependencies": { - "@t3-oss/env-core": "0.9.2" - }, - "peerDependencies": { - "typescript": ">=5.0.0", - "zod": "^3.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@testing-library/dom": { "version": "9.3.4", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", @@ -25336,15 +25302,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/dashboard/package.json b/dashboard/package.json index 25474abb9..8fcb7020a 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -18,7 +18,7 @@ "test:watch": "jest --watch" }, "dependencies": { - "@formbricks/js": "^1.6.2", + "@formbricks/js": "^2.0.0", "@sentry/react": "^7.41.0", "@sentry/tracing": "^7.41.0", "@tippyjs/react": "^4.2.6", From 9c4fbdc5a589e1f5746776d219e0664122cd474b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 23:43:37 +0000 Subject: [PATCH 29/31] --- updated-dependencies: - dependency-name: react dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package-lock.json | 23 ++++++++--------------- dashboard/package.json | 4 ++-- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 7243ae13e..60ea92d3c 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -21,7 +21,7 @@ "html-to-image": "^1.11.11", "next": "^14.1.3", "next-transpile-modules": "^10.0.1", - "react": "18.2.0", + "react": "18.3.1", "react-chartjs-2": "^5.2.0", "react-cytoscapejs": "^2.0.0", "react-dom": "18.2.0", @@ -49,7 +49,7 @@ "@types/cytoscape-popper": "^2.0.3", "@types/jest": "^29.5.12", "@types/node": "20.11.21", - "@types/react": "18.2.70", + "@types/react": "18.3.2", "@types/react-cytoscapejs": "^1.2.5", "@types/react-dom": "18.2.18", "@types/react-simple-maps": "^3.0.2", @@ -10590,13 +10590,12 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.70", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.70.tgz", - "integrity": "sha512-hjlM2hho2vqklPhopNkXkdkeq6Lv8WSZTpr7956zY+3WS5cfYUewtCzsJLsbW5dEv3lfSeQ4W14ZFeKC437JRQ==", + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", + "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", "dev": true, "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, @@ -10637,12 +10636,6 @@ "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", "dev": true }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", @@ -21467,9 +21460,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, diff --git a/dashboard/package.json b/dashboard/package.json index 25474abb9..17bd5570e 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -31,7 +31,7 @@ "html-to-image": "^1.11.11", "next": "^14.1.3", "next-transpile-modules": "^10.0.1", - "react": "18.2.0", + "react": "18.3.1", "react-chartjs-2": "^5.2.0", "react-cytoscapejs": "^2.0.0", "react-dom": "18.2.0", @@ -59,7 +59,7 @@ "@types/cytoscape-popper": "^2.0.3", "@types/jest": "^29.5.12", "@types/node": "20.11.21", - "@types/react": "18.2.70", + "@types/react": "18.3.2", "@types/react-cytoscapejs": "^1.2.5", "@types/react-dom": "18.2.18", "@types/react-simple-maps": "^3.0.2", From 9772a76c93a3ea0c4bccdc2f5530aab6b80e4e11 Mon Sep 17 00:00:00 2001 From: Azanul Date: Fri, 24 May 2024 08:42:49 +0530 Subject: [PATCH 30/31] feat: migrate formbricks Signed-off-by: Azanul --- dashboard/pages/_app.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/pages/_app.tsx b/dashboard/pages/_app.tsx index d7d75e84c..b49b213ec 100644 --- a/dashboard/pages/_app.tsx +++ b/dashboard/pages/_app.tsx @@ -1,6 +1,6 @@ import '../styles/globals.css'; import type { AppProps } from 'next/app'; -import formbricks from '@formbricks/js'; +import formbricks from '@formbricks/js/website'; import { useRouter } from 'next/router'; import { useEffect } from 'react'; import Layout from '../components/layout/Layout'; From 338895d90ba39c5d10917439aa1bcb92e1281fbc Mon Sep 17 00:00:00 2001 From: Azanul Date: Fri, 24 May 2024 10:28:03 +0530 Subject: [PATCH 31/31] fix: formbricks module undetected Signed-off-by: Azanul --- dashboard/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard/tsconfig.json b/dashboard/tsconfig.json index 15d7d31d3..148616296 100644 --- a/dashboard/tsconfig.json +++ b/dashboard/tsconfig.json @@ -10,7 +10,7 @@ "noEmit": true, "esModuleInterop": true, "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve",