Skip to content

Commit

Permalink
✨ Remove clause lock
Browse files Browse the repository at this point in the history
  • Loading branch information
tosone committed Apr 22, 2024
1 parent 6758f55 commit f5007d1
Show file tree
Hide file tree
Showing 14 changed files with 102 additions and 98 deletions.
21 changes: 11 additions & 10 deletions pkg/dal/dal.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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 {
Expand Down
14 changes: 4 additions & 10 deletions pkg/dal/dao/artifact.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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()

Check warning on line 367 in pkg/dal/dao/artifact.go

View check run for this annotation

Codecov / codecov/patch

pkg/dal/dao/artifact.go#L366-L367

Added lines #L366 - L367 were not covered by tests
if err != nil {
return 0, err
}
Expand Down
5 changes: 5 additions & 0 deletions pkg/dal/dao/artifact_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
9 changes: 6 additions & 3 deletions pkg/dal/dao/tag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func TestTagService(t *testing.T) {
userService := dao.NewUserServiceFactory().New()
namespaceService := dao.NewNamespaceServiceFactory().New()
repositoryService := dao.NewRepositoryServiceFactory().New()
artirfactService := dao.NewArtifactServiceFactory().New()
artifactService := dao.NewArtifactServiceFactory().New()

userObj := &models.User{Username: "tag-service", Password: ptr.Of("test"), Email: ptr.Of("[email protected]")}
assert.NoError(t, userService.Create(ctx, userObj))
Expand All @@ -73,6 +73,7 @@ func TestTagService(t *testing.T) {
RepositoryID: repositoryObj.ID,
Name: "latest",
Artifact: &models.Artifact{
NamespaceID: namespaceObj.ID,
RepositoryID: repositoryObj.ID,
Digest: "sha256:xxx",
Size: 123,
Expand Down Expand Up @@ -118,13 +119,14 @@ func TestTagService(t *testing.T) {
assert.NoError(t, err)

artifactObj := &models.Artifact{
NamespaceID: namespaceObj.ID,
RepositoryID: repositoryObj.ID,
Digest: "sha256:xxxxx",
Size: 123,
ContentType: "test",
Raw: []byte("test"),
}
assert.NoError(t, artirfactService.Create(ctx, artifactObj))
assert.NoError(t, artifactService.Create(ctx, artifactObj))

tagObj1 := &models.Tag{
RepositoryID: repositoryObj.ID,
Expand All @@ -141,13 +143,14 @@ func TestTagService(t *testing.T) {
assert.ErrorIs(t, err, gorm.ErrRecordNotFound)

artifactObj2 := &models.Artifact{
NamespaceID: namespaceObj.ID,
RepositoryID: repositoryObj.ID,
Digest: "sha256:xxxxxxxx",
Size: 123,
ContentType: "test",
Raw: []byte("test"),
}
assert.NoError(t, artirfactService.Create(ctx, artifactObj2))
assert.NoError(t, artifactService.Create(ctx, artifactObj2))

tagObj2 := &models.Tag{
RepositoryID: repositoryObj.ID,
Expand Down
29 changes: 7 additions & 22 deletions pkg/dal/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
Expand All @@ -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
}
Expand Down
1 change: 1 addition & 0 deletions pkg/handlers/artifacts/artifacts_delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions pkg/handlers/artifacts/artifacts_get_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ func TestGetArtifact(t *testing.T) {
artifactServiceFactory := dao.NewArtifactServiceFactory()
artifactService := artifactServiceFactory.New()
artifactObj := &models.Artifact{
NamespaceID: namespaceObj.ID,
RepositoryID: repositoryObj.ID,
Digest: "sha256:e032eb458559f05c333b90abdeeac8ccb23bc1613137eeab2bbc0ea1224c5faf",
Size: 1234,
Expand Down
1 change: 1 addition & 0 deletions pkg/handlers/artifacts/artifacts_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ func TestListArtifact(t *testing.T) {
artifactServiceFactory := dao.NewArtifactServiceFactory()
artifactService := artifactServiceFactory.New()
artifactObj := &models.Artifact{
NamespaceID: namespaceObj.ID,
RepositoryID: repositoryObj.ID,
Digest: "sha256:e032eb458559f05c333b90abdeeac8ccb23bc1613137eeab2bbc0ea1224c5faf",
Size: 1234,
Expand Down
2 changes: 1 addition & 1 deletion pkg/handlers/distribution/base/repository_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
2 changes: 1 addition & 1 deletion pkg/handlers/distribution/base/tags_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func TestListTags(t *testing.T) {
assert.NoError(t, err)
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))
Expand Down
4 changes: 3 additions & 1 deletion pkg/handlers/distribution/manifest/manifest_delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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}
Expand Down
4 changes: 3 additions & 1 deletion pkg/handlers/distribution/manifest/manifest_head_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ 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"
Expand Down Expand Up @@ -105,6 +106,7 @@ func TestHeadManifestFallbackProxyAuthError(t *testing.T) {
}

func TestHeadManifest(t *testing.T) {
logger.SetLevel("debug")
assert.NoError(t, tests.Initialize(t))
assert.NoError(t, tests.DB.Init())
defer func() {
Expand All @@ -129,7 +131,7 @@ func TestHeadManifest(t *testing.T) {
assert.NoError(t, dao.NewNamespaceServiceFactory().New().Create(ctx, namespaceObj))
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}
assert.NoError(t, dao.NewTagServiceFactory().New().Create(ctx, tagObj))
Expand Down
16 changes: 8 additions & 8 deletions web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -24,15 +24,15 @@
"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",
"react": "^18.2.0",
"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",
Expand All @@ -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",
Expand All @@ -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": "[email protected]"
}
Loading

0 comments on commit f5007d1

Please sign in to comment.