From c121076a19eeee61ac1ec9329ea6138688af8ad4 Mon Sep 17 00:00:00 2001 From: Tosone Date: Sun, 21 Apr 2024 23:38:44 +0800 Subject: [PATCH] :sparkles: Remove clause lock --- pkg/dal/dal.go | 21 +++-- pkg/dal/dao/artifact.go | 14 +-- pkg/dal/dao/artifact_test.go | 5 + pkg/dal/migrate.go | 29 ++---- .../artifacts/artifacts_delete_test.go | 1 + .../distribution/base/repository_list_test.go | 2 +- .../manifest/manifest_delete_test.go | 4 +- web/package.json | 16 ++-- web/yarn.lock | 91 ++++++++++--------- 9 files changed, 90 insertions(+), 93 deletions(-) diff --git a/pkg/dal/dal.go b/pkg/dal/dal.go index d449c806..6773acbf 100644 --- a/pkg/dal/dal.go +++ b/pkg/dal/dal.go @@ -43,11 +43,12 @@ var ( // Initialize initializes the database connection func Initialize(config configs.Configuration) error { var err error + var dsn string switch config.Database.Type { case enums.DatabaseMysql: - err = connectMysql(config) + dsn, err = connectMysql(config) case enums.DatabasePostgresql: - err = connectPostgres(config) + dsn, err = connectPostgres(config) case enums.DatabaseSqlite3: err = connectSqlite3(config) default: @@ -81,9 +82,9 @@ func Initialize(config configs.Configuration) error { switch config.Database.Type { case enums.DatabaseMysql: - err = migrateMysql(config.Database.Mysql.DBName) + err = migrateMysql(dsn) case enums.DatabasePostgresql: - err = migratePostgres(config.Database.Postgresql.DBName) + err = migratePostgres(dsn) case enums.DatabaseSqlite3: err = migrateSqlite() default: @@ -106,7 +107,7 @@ func Initialize(config configs.Configuration) error { return nil } -func connectMysql(config configs.Configuration) error { +func connectMysql(config configs.Configuration) (string, error) { host := config.Database.Mysql.Host port := config.Database.Mysql.Port user := config.Database.Mysql.User @@ -123,15 +124,15 @@ func connectMysql(config configs.Configuration) error { Logger: logger.ZLogger{}, }) if err != nil { - return err + return "", err } db = db.WithContext(log.Logger.WithContext(context.Background())) DB = db - return nil + return dsn, nil } -func connectPostgres(config configs.Configuration) error { +func connectPostgres(config configs.Configuration) (string, error) { host := config.Database.Postgresql.Host port := config.Database.Postgresql.Port user := config.Database.Postgresql.User @@ -147,12 +148,12 @@ func connectPostgres(config configs.Configuration) error { Logger: logger.ZLogger{}, }) if err != nil { - return err + return "", err } db = db.WithContext(log.Logger.WithContext(context.Background())) DB = db - return nil + return fmt.Sprintf("%s:%s@%s:%d/%s?sslmode=disable", user, password, host, port, dbname), nil } func connectSqlite3(config configs.Configuration) error { diff --git a/pkg/dal/dao/artifact.go b/pkg/dal/dao/artifact.go index decc9ec9..0e94f43b 100644 --- a/pkg/dal/dao/artifact.go +++ b/pkg/dal/dao/artifact.go @@ -353,11 +353,8 @@ func (s *artifactService) UpdateVulnerability(ctx context.Context, artifactID in // GetNamespaceSize get the specific namespace size func (s *artifactService) GetNamespaceSize(ctx context.Context, namespaceID int64) (int64, error) { - q := s.tx.Artifact.WithContext(ctx).Select(s.tx.Artifact.BlobsSize.Sum().As("blobs_size")). - Where(s.tx.Artifact.NamespaceID.Eq(namespaceID)). - Clauses(clause.Locking{Strength: clause.LockingStrengthUpdate, - Table: clause.Table{Name: clause.CurrentTable}}) - res, err := q.First() + res, err := s.tx.Artifact.WithContext(ctx).Select(s.tx.Artifact.BlobsSize.Sum().As("blobs_size")). + Where(s.tx.Artifact.NamespaceID.Eq(namespaceID)).First() if err != nil { return 0, err } @@ -366,11 +363,8 @@ func (s *artifactService) GetNamespaceSize(ctx context.Context, namespaceID int6 // GetRepositorySize get the specific repository size func (s *artifactService) GetRepositorySize(ctx context.Context, repositoryID int64) (int64, error) { - q := s.tx.Artifact.WithContext(ctx).Select(s.tx.Artifact.BlobsSize.Sum().As("blobs_size")). - Where(s.tx.Artifact.RepositoryID.Eq(repositoryID)). - Clauses(clause.Locking{Strength: clause.LockingStrengthUpdate, - Table: clause.Table{Name: clause.CurrentTable}}) - res, err := q.First() + res, err := s.tx.Artifact.WithContext(ctx).Select(s.tx.Artifact.BlobsSize.Sum().As("blobs_size")). + Where(s.tx.Artifact.RepositoryID.Eq(repositoryID)).First() if err != nil { return 0, err } diff --git a/pkg/dal/dao/artifact_test.go b/pkg/dal/dao/artifact_test.go index 0c9418be..228a035b 100644 --- a/pkg/dal/dao/artifact_test.go +++ b/pkg/dal/dao/artifact_test.go @@ -72,6 +72,7 @@ func TestArtifactServiceAssociateArtifact(t *testing.T) { artifactServiceFactory := dao.NewArtifactServiceFactory() artifactService := artifactServiceFactory.New() artifactObj1 := &models.Artifact{ + NamespaceID: namespaceObj.ID, RepositoryID: repositoryObj.ID, Digest: "sha256:xxxx", Size: 123, @@ -81,6 +82,7 @@ func TestArtifactServiceAssociateArtifact(t *testing.T) { assert.NoError(t, artifactService.Create(ctx, artifactObj1)) artifactObj2 := &models.Artifact{ + NamespaceID: namespaceObj.ID, RepositoryID: repositoryObj.ID, Digest: "sha256:xxxxx", Size: 1234, @@ -120,6 +122,7 @@ func TestArtifactService(t *testing.T) { assert.NoError(t, repositoryService.Create(ctx, repositoryObj, dao.AutoCreateNamespace{UserID: userObj.ID})) artifactObj := &models.Artifact{ + NamespaceID: repositoryObj.ID, RepositoryID: repositoryObj.ID, Digest: "sha256:xxxx", Size: 123, @@ -132,6 +135,7 @@ func TestArtifactService(t *testing.T) { RepositoryID: repositoryObj.ID, Name: "latest", Artifact: &models.Artifact{ + NamespaceID: repositoryObj.ID, RepositoryID: repositoryObj.ID, Digest: "sha256:xxx", Size: 123, @@ -219,6 +223,7 @@ func TestArtifactService(t *testing.T) { dao.AutoCreateNamespace{UserID: userObj.ID})) assert.NoError(t, artifactService.Create(ctx, &models.Artifact{ + NamespaceID: repositoryObj.ID, RepositoryID: repositoryObj.ID, Digest: "sha256:xxxx", Size: 123, diff --git a/pkg/dal/migrate.go b/pkg/dal/migrate.go index 0431a244..7caf791e 100644 --- a/pkg/dal/migrate.go +++ b/pkg/dal/migrate.go @@ -19,11 +19,12 @@ import ( "fmt" "github.com/golang-migrate/migrate/v4" - "github.com/golang-migrate/migrate/v4/database/mysql" - "github.com/golang-migrate/migrate/v4/database/postgres" "github.com/golang-migrate/migrate/v4/database/sqlite3" "github.com/golang-migrate/migrate/v4/source/iofs" "github.com/rs/zerolog/log" + + _ "github.com/golang-migrate/migrate/v4/database/mysql" + _ "github.com/golang-migrate/migrate/v4/database/postgres" ) //go:embed migrations/mysql/*.sql @@ -35,20 +36,12 @@ var postgresqlFS embed.FS //go:embed migrations/sqlite3/*.sql var sqliteFS embed.FS -func migrateMysql(database string) error { +func migrateMysql(dsn string) error { d, err := iofs.New(mysqlFS, "migrations/mysql") if err != nil { return err } - rawDB, err := DB.DB() - if err != nil { - return fmt.Errorf("get raw db instance failed") - } - migrateDriver, err := mysql.WithInstance(rawDB, &mysql.Config{}) - if err != nil { - return fmt.Errorf("get migrate driver failed") - } - m, err := migrate.NewWithInstance("iofs", d, database, migrateDriver) + m, err := migrate.NewWithSourceInstance("iofs", d, fmt.Sprintf("mysql://%s", dsn)) if err != nil { return err } @@ -64,20 +57,12 @@ func migrateMysql(database string) error { return nil } -func migratePostgres(database string) error { +func migratePostgres(dsn string) error { d, err := iofs.New(postgresqlFS, "migrations/postgresql") if err != nil { return err } - rawDB, err := DB.DB() - if err != nil { - return fmt.Errorf("get raw db instance failed") - } - migrateDriver, err := postgres.WithInstance(rawDB, &postgres.Config{}) - if err != nil { - return fmt.Errorf("get migrate driver failed") - } - m, err := migrate.NewWithInstance("iofs", d, database, migrateDriver) + m, err := migrate.NewWithSourceInstance("iofs", d, fmt.Sprintf("postgres://%s", dsn)) if err != nil { return err } diff --git a/pkg/handlers/artifacts/artifacts_delete_test.go b/pkg/handlers/artifacts/artifacts_delete_test.go index faed9e75..62ee8132 100644 --- a/pkg/handlers/artifacts/artifacts_delete_test.go +++ b/pkg/handlers/artifacts/artifacts_delete_test.go @@ -76,6 +76,7 @@ func TestDeleteArtifact(t *testing.T) { artifactServiceFactory := dao.NewArtifactServiceFactory() artifactService := artifactServiceFactory.New() artifactObj := &models.Artifact{ + NamespaceID: namespaceObj.ID, RepositoryID: repositoryObj.ID, Digest: "sha256:e032eb458559f05c333b90abdeeac8ccb23bc1613137eeab2bbc0ea1224c5faf", Size: 1234, diff --git a/pkg/handlers/distribution/base/repository_list_test.go b/pkg/handlers/distribution/base/repository_list_test.go index 46044dbf..d1323874 100644 --- a/pkg/handlers/distribution/base/repository_list_test.go +++ b/pkg/handlers/distribution/base/repository_list_test.go @@ -58,7 +58,7 @@ func TestListRepositories(t *testing.T) { assert.NoError(t, dao.NewNamespaceServiceFactory().New().Create(ctx, namespaceObj)) repositoryObj := &models.Repository{Name: repositoryName, NamespaceID: namespaceObj.ID} assert.NoError(t, dao.NewRepositoryServiceFactory().New().Create(ctx, repositoryObj, dao.AutoCreateNamespace{UserID: userObj.ID})) - artifactObj := &models.Artifact{RepositoryID: repositoryObj.ID, Digest: "sha256:1234567890", Size: 1234, ContentType: "application/octet-stream", Raw: []byte("test"), PushedAt: time.Now().UnixMilli()} + artifactObj := &models.Artifact{NamespaceID: namespaceObj.ID, RepositoryID: repositoryObj.ID, Digest: "sha256:1234567890", Size: 1234, ContentType: "application/octet-stream", Raw: []byte("test"), PushedAt: time.Now().UnixMilli()} assert.NoError(t, dao.NewArtifactServiceFactory().New().Create(ctx, artifactObj)) tagObj := &models.Tag{Name: "latest", RepositoryID: repositoryObj.ID, ArtifactID: artifactObj.ID, PushedAt: time.Now().UnixMilli()} assert.NoError(t, dao.NewTagServiceFactory().New().Create(ctx, tagObj)) diff --git a/pkg/handlers/distribution/manifest/manifest_delete_test.go b/pkg/handlers/distribution/manifest/manifest_delete_test.go index c3f96307..90baba2f 100644 --- a/pkg/handlers/distribution/manifest/manifest_delete_test.go +++ b/pkg/handlers/distribution/manifest/manifest_delete_test.go @@ -30,12 +30,14 @@ import ( "github.com/go-sigma/sigma/pkg/dal" "github.com/go-sigma/sigma/pkg/dal/dao" "github.com/go-sigma/sigma/pkg/dal/models" + "github.com/go-sigma/sigma/pkg/logger" "github.com/go-sigma/sigma/pkg/tests" "github.com/go-sigma/sigma/pkg/types/enums" "github.com/go-sigma/sigma/pkg/utils/ptr" ) func TestDeleteManifest(t *testing.T) { + logger.SetLevel("debug") assert.NoError(t, tests.Initialize(t)) assert.NoError(t, tests.DB.Init()) defer func() { @@ -63,7 +65,7 @@ func TestDeleteManifest(t *testing.T) { repositoryObj := &models.Repository{NamespaceID: namespaceObj.ID, Name: repositoryName} assert.NoError(t, dao.NewRepositoryServiceFactory().New().Create(ctx, repositoryObj, dao.AutoCreateNamespace{UserID: userObj.ID})) - artifactObj := &models.Artifact{RepositoryID: repositoryObj.ID, Digest: digestName, Size: 123, ContentType: "application/vnd.oci.image.manifest.v1+json", Raw: []byte(`{"schemaVersion":2,"config":{"mediaType":"application/vnd.cncf.helm.config.v1+json","digest":"sha256:a61fd63bebd559934a60e30d1e7b832a136ac6bae3a11ca97ade20bfb3645796","size":800},"layers":[{"mediaType":"application/vnd.cncf.helm.chart.content.v1.tar+gzip","digest":"sha256:e45dd3e880e94bdb52cc88d6b4e0fbaec6876856f39a1a89f76e64d0739c2904","size":37869}],"annotations":{"category":"Infrastructure","licenses":"Apache-2.0","org.opencontainers.image.authors":"VMware, Inc.","org.opencontainers.image.description":"NGINX Open Source is a web server that can be also used as a reverse proxy, load balancer, and HTTP cache. Recommended for high-demanding sites due to its ability to provide faster content.","org.opencontainers.image.source":"https://github.com/bitnami/charts/tree/main/bitnami/nginx","org.opencontainers.image.title":"nginx","org.opencontainers.image.url":"https://bitnami.com","org.opencontainers.image.version":"15.0.2"}}`)} + artifactObj := &models.Artifact{NamespaceID: namespaceObj.ID, RepositoryID: repositoryObj.ID, Digest: digestName, Size: 123, ContentType: "application/vnd.oci.image.manifest.v1+json", Raw: []byte(`{"schemaVersion":2,"config":{"mediaType":"application/vnd.cncf.helm.config.v1+json","digest":"sha256:a61fd63bebd559934a60e30d1e7b832a136ac6bae3a11ca97ade20bfb3645796","size":800},"layers":[{"mediaType":"application/vnd.cncf.helm.chart.content.v1.tar+gzip","digest":"sha256:e45dd3e880e94bdb52cc88d6b4e0fbaec6876856f39a1a89f76e64d0739c2904","size":37869}],"annotations":{"category":"Infrastructure","licenses":"Apache-2.0","org.opencontainers.image.authors":"VMware, Inc.","org.opencontainers.image.description":"NGINX Open Source is a web server that can be also used as a reverse proxy, load balancer, and HTTP cache. Recommended for high-demanding sites due to its ability to provide faster content.","org.opencontainers.image.source":"https://github.com/bitnami/charts/tree/main/bitnami/nginx","org.opencontainers.image.title":"nginx","org.opencontainers.image.url":"https://bitnami.com","org.opencontainers.image.version":"15.0.2"}}`)} assert.NoError(t, dao.NewArtifactServiceFactory().New().Create(ctx, artifactObj)) tagObj := &models.Tag{RepositoryID: repositoryObj.ID, ArtifactID: artifactObj.ID, Name: tagName} diff --git a/web/package.json b/web/package.json index 0b5daafa..391e40f4 100644 --- a/web/package.json +++ b/web/package.json @@ -11,7 +11,7 @@ "dependencies": { "@bytemd/plugin-gfm": "^1.21.0", "@bytemd/react": "^1.21.0", - "@headlessui/react": "^1.7.18", + "@headlessui/react": "^1.7.19", "@heroicons/react": "^2.1.3", "@monaco-editor/react": "^4.6.0", "@tailwindcss/aspect-ratio": "^0.4.2", @@ -24,7 +24,7 @@ "csstype": "^3.1.3", "dayjs": "^1.11.10", "flowbite": "^2.3.0", - "flowbite-react": "^0.7.8", + "flowbite-react": "^0.9.0", "human-format": "^1.2.0", "lodash": "^4.17.21", "monaco-editor": "^0.47.0", @@ -32,7 +32,7 @@ "react-dom": "^18.2.0", "react-helmet-async": "^2.0.4", "react-hot-toast": "^2.4.1", - "react-icons": "^5.0.1", + "react-icons": "^5.1.0", "react-router-dom": "^6.22.3", "react-toastify": "^10.0.5", "react-use": "^17.5.0", @@ -41,9 +41,9 @@ "xterm-addon-fit": "^0.8.0" }, "devDependencies": { - "@types/node": "^20.12.4", - "@types/react": "^18.2.74", - "@types/react-dom": "^18.2.24", + "@types/node": "^20.12.7", + "@types/react": "^18.2.79", + "@types/react-dom": "^18.2.25", "@vitejs/plugin-react-swc": "^3.6.0", "autoprefixer": "^10.4.19", "cssnano": "^6.1.2", @@ -52,8 +52,8 @@ "postcss-import": "^16.1.0", "postcss-nesting": "^12.1.1", "tailwindcss": "^3.4.3", - "typescript": "^5.4.4", - "vite": "^5.2.8" + "typescript": "^5.4.5", + "vite": "^5.2.10" }, "packageManager": "yarn@4.1.1" } diff --git a/web/yarn.lock b/web/yarn.lock index 0df94732..4c33ccb9 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -283,16 +283,16 @@ __metadata: languageName: node linkType: hard -"@headlessui/react@npm:^1.7.18": - version: 1.7.18 - resolution: "@headlessui/react@npm:1.7.18" +"@headlessui/react@npm:^1.7.19": + version: 1.7.19 + resolution: "@headlessui/react@npm:1.7.19" dependencies: "@tanstack/react-virtual": "npm:^3.0.0-beta.60" client-only: "npm:^0.0.1" peerDependencies: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 - checksum: 10c0/2d88d10874879182d4b9ed9a7779266032214034481129ba544e858d3624c8d12333e6a9d9d8263f2f116bc823bcfd43a2d1f69800fbf6a47b34d989370346e5 + checksum: 10c0/c0ece0db6ca15092439177a5322de50b60fa5fd90354ae0f999b3e56abab0065ed54fa7b4b69994ec1bdc23adc6ae9919d7dd57f97922d0b9bb6515d27e3a7e5 languageName: node linkType: hard @@ -989,12 +989,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.12.4": - version: 20.12.4 - resolution: "@types/node@npm:20.12.4" +"@types/node@npm:^20.12.7": + version: 20.12.7 + resolution: "@types/node@npm:20.12.7" dependencies: undici-types: "npm:~5.26.4" - checksum: 10c0/9b142fcd839a48c348d6b9acfc753dfa4b3fb1f3e23ed67e8952bee9b2dfdaffdddfbcf0e4701557b88631591a5f9968433910027532ef847759f8682e27ffe7 + checksum: 10c0/dce80d63a3b91892b321af823d624995c61e39c6a223cc0ac481a44d337640cc46931d33efb3beeed75f5c85c3bda1d97cef4c5cd4ec333caf5dee59cff6eca0 languageName: node linkType: hard @@ -1012,12 +1012,12 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.2.24": - version: 18.2.24 - resolution: "@types/react-dom@npm:18.2.24" +"@types/react-dom@npm:^18.2.25": + version: 18.2.25 + resolution: "@types/react-dom@npm:18.2.25" dependencies: "@types/react": "npm:*" - checksum: 10c0/9ec38e5ab4727c56ef17bd8e938ead88748ba19db314b8d9807714a5cae430f5b799514667b221b4f2dc8d9b4ca17dd1c3da8c41c083c2de9eddcc31bec6b8ff + checksum: 10c0/87604407eca6884c5b4d4657cb511dc5ba28ea1cfa5d0ce1fc2d659a7ad1b64ae85dcda60e3f010641f9a52a6a60dfcaa6be3b0d0de9d624475052a13dae01f4 languageName: node linkType: hard @@ -1032,13 +1032,13 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.2.74": - version: 18.2.74 - resolution: "@types/react@npm:18.2.74" +"@types/react@npm:^18.2.79": + version: 18.2.79 + resolution: "@types/react@npm:18.2.79" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10c0/347e38b4c5dc20d50ff71bf04b7caaef490e5ff695e74a0088a13fbb2a0c5d125a5ecfd142adfa30f0176da0e2734942c91ba61d95ce269c43b3265bd7379361 + checksum: 10c0/c8a8a005d8830a48cc1ef93c3510c4935a2a03e5557dbecaa8f1038450cbfcb18eb206fa7fba7077d54b8da21faeb25577e897a333392770a7797f625b62c78a languageName: node linkType: hard @@ -2045,9 +2045,9 @@ __metadata: languageName: node linkType: hard -"flowbite-react@npm:^0.7.8": - version: 0.7.8 - resolution: "flowbite-react@npm:0.7.8" +"flowbite-react@npm:^0.9.0": + version: 0.9.0 + resolution: "flowbite-react@npm:0.9.0" dependencies: "@floating-ui/core": "npm:1.6.0" "@floating-ui/react": "npm:0.26.10" @@ -2060,7 +2060,7 @@ __metadata: react: ">=18" react-dom: ">=18" tailwindcss: ^3 - checksum: 10c0/fd9fcccd7c6bc26bf09c60199e0e43ceb838266e40d53ca45ce5a77f0fea7b8f0b954d911c2f620181ca92a7529f6d989ea709019a4a2bf59011a9994f990c0c + checksum: 10c0/44b9d27258dd9df4cb0a2b5086bd4957e3486b561c4bb1d6e47cae94948464e0519311af307762fe5eedcf23745f138db8fc3072268f948ccea35c75c2332030 languageName: node linkType: hard @@ -4173,7 +4173,7 @@ __metadata: languageName: node linkType: hard -"react-icons@npm:5.0.1, react-icons@npm:^5.0.1": +"react-icons@npm:5.0.1": version: 5.0.1 resolution: "react-icons@npm:5.0.1" peerDependencies: @@ -4182,6 +4182,15 @@ __metadata: languageName: node linkType: hard +"react-icons@npm:^5.1.0": + version: 5.1.0 + resolution: "react-icons@npm:5.1.0" + peerDependencies: + react: "*" + checksum: 10c0/f01648bbf37854510a568c1ac4aeb1c23f734f2ff3a9e94d624bc039ff6291d83ea83281a1380e8105b3f1819bb359a6f34326a5cefbfbced1024b4b81493e01 + languageName: node + linkType: hard + "react-router-dom@npm:^6.22.3": version: 6.22.3 resolution: "react-router-dom@npm:6.22.3" @@ -4567,16 +4576,16 @@ __metadata: dependencies: "@bytemd/plugin-gfm": "npm:^1.21.0" "@bytemd/react": "npm:^1.21.0" - "@headlessui/react": "npm:^1.7.18" + "@headlessui/react": "npm:^1.7.19" "@heroicons/react": "npm:^2.1.3" "@monaco-editor/react": "npm:^4.6.0" "@tailwindcss/aspect-ratio": "npm:^0.4.2" "@tailwindcss/forms": "npm:^0.5.7" "@tailwindcss/line-clamp": "npm:^0.4.4" "@tailwindcss/typography": "npm:^0.5.12" - "@types/node": "npm:^20.12.4" - "@types/react": "npm:^18.2.74" - "@types/react-dom": "npm:^18.2.24" + "@types/node": "npm:^20.12.7" + "@types/react": "npm:^18.2.79" + "@types/react-dom": "npm:^18.2.25" "@vitejs/plugin-react-swc": "npm:^3.6.0" autoprefixer: "npm:^10.4.19" axios: "npm:^1.6.8" @@ -4586,7 +4595,7 @@ __metadata: csstype: "npm:^3.1.3" dayjs: "npm:^1.11.10" flowbite: "npm:^2.3.0" - flowbite-react: "npm:^0.7.8" + flowbite-react: "npm:^0.9.0" human-format: "npm:^1.2.0" json-server: "npm:^1.0.0-alpha.23" lodash: "npm:^4.17.21" @@ -4598,13 +4607,13 @@ __metadata: react-dom: "npm:^18.2.0" react-helmet-async: "npm:^2.0.4" react-hot-toast: "npm:^2.4.1" - react-icons: "npm:^5.0.1" + react-icons: "npm:^5.1.0" react-router-dom: "npm:^6.22.3" react-toastify: "npm:^10.0.5" react-use: "npm:^17.5.0" tailwindcss: "npm:^3.4.3" - typescript: "npm:^5.4.4" - vite: "npm:^5.2.8" + typescript: "npm:^5.4.5" + vite: "npm:^5.2.10" xterm: "npm:^5.3.0" xterm-addon-attach: "npm:^0.9.0" xterm-addon-fit: "npm:^0.8.0" @@ -5041,23 +5050,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.4.4": - version: 5.4.4 - resolution: "typescript@npm:5.4.4" +"typescript@npm:^5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/4d8de0291204ed61ca97ad0cba2ce064e09c4988ca1c451c787e4653ba76296ba35177a52694e8a00cf4ef899d0ee83338663b926d8b7d55167ff0ba81549999 + checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.4.4#optional!builtin": - version: 5.4.4 - resolution: "typescript@patch:typescript@npm%3A5.4.4#optional!builtin::version=5.4.4&hash=5adc0c" +"typescript@patch:typescript@npm%3A^5.4.5#optional!builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/1fa41b9964a9ff0ed913b339c90b46031b2d2da3cb1a192af516610733f7f1d5f7f9754a8e22b9ac7076d3d8aedd2c4f84db3f113bad060eac3a95962443a1bf + checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9 languageName: node linkType: hard @@ -5223,9 +5232,9 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.2.8": - version: 5.2.8 - resolution: "vite@npm:5.2.8" +"vite@npm:^5.2.10": + version: 5.2.10 + resolution: "vite@npm:5.2.10" dependencies: esbuild: "npm:^0.20.1" fsevents: "npm:~2.3.3" @@ -5259,7 +5268,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/b5717bb00c2570c08ff6d8ed917655e79184efcafa9dd62d52eea19c5d6dfc5a708ec3de9ebc670a7165fc5d401c2bdf1563bb39e2748d8e51e1593d286a9a13 + checksum: 10c0/d50630ac8de807a6185cd9b5763b3969b2950a454cf6a4482f3780f183865e8d6f7e3aa57dd70ede1c493aaa861efb25b43562287efbcf8b471b7f3b88857a33 languageName: node linkType: hard