diff --git a/e2e/multiarch/buildkit.toml b/e2e/multiarch/buildkit.toml index 753467e1..6b146cbb 100644 --- a/e2e/multiarch/buildkit.toml +++ b/e2e/multiarch/buildkit.toml @@ -1,2 +1,2 @@ -[registry."10.3.201.221:3000"] +[registry."192.168.31.198:3000"] http = true diff --git a/e2e/multiarch/cosign.key b/e2e/multiarch/cosign.key new file mode 100644 index 00000000..fdb7c9c6 --- /dev/null +++ b/e2e/multiarch/cosign.key @@ -0,0 +1,11 @@ +-----BEGIN ENCRYPTED SIGSTORE PRIVATE KEY----- +eyJrZGYiOnsibmFtZSI6InNjcnlwdCIsInBhcmFtcyI6eyJOIjo2NTUzNiwiciI6 +OCwicCI6MX0sInNhbHQiOiJCUEJNY0E1MGdKK1FvWVJDZnVDT1RzU2hrSHQ3Snhw +ellGWEdKSWdyM093PSJ9LCJjaXBoZXIiOnsibmFtZSI6Im5hY2wvc2VjcmV0Ym94 +Iiwibm9uY2UiOiJ4VE9qaC8rUEJwQ29jSkx4MXI5R2FIdlRRWUdIa3YvZSJ9LCJj +aXBoZXJ0ZXh0IjoickJFeGVmekRJUjdoQ1p6QWRTWjh0OXMzQVBCVVRHMDUweHo0 +NUQxVDlaL0hqN3VrOEpVUGdna0d3aEhCWm82M0g3Q2grNEZNamdJdnI5d1NFUThm +SU1CbmQ1emhTWHBhNElRbzB3dEgvb3duMlBtTDRrSHFqdWVQSmdGbjQrTkRXZzBQ +bUVTMFhBQUQ5aWE0QWxWTVpzWExlblhDTDVET1VvVlFJUGVOMU5UNlNiMUFVaXRl +UThpT0ZuTVUxSm83QXZjSjd4YStjRCs3S0E9PSJ9 +-----END ENCRYPTED SIGSTORE PRIVATE KEY----- diff --git a/e2e/multiarch/cosign.pub b/e2e/multiarch/cosign.pub new file mode 100644 index 00000000..71302c2b --- /dev/null +++ b/e2e/multiarch/cosign.pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUV5SViVARNtgyAP+WnOguji79aRq +OXqW6WnoUk34nn2HpmEE3ChJvZS0MWsRs1JAUBXn20cYUySYe1W3DEMc2Q== +-----END PUBLIC KEY----- diff --git a/e2e/multiarch/push.sh b/e2e/multiarch/push.sh index 677c4cb5..9d513087 100755 --- a/e2e/multiarch/push.sh +++ b/e2e/multiarch/push.sh @@ -1,4 +1,8 @@ #!/bin/sh # docker buildx create --use --config ./buildkit.toml -docker buildx build --platform linux/amd64,linux/arm64 --tag 10.3.201.221:3000/library/alpine:3.18.0 --file alpine.Dockerfile --push . +docker buildx build --sbom=true --platform linux/amd64,linux/arm64 --tag 192.168.31.198:3000/library/alpine:3.18.0 --file alpine.Dockerfile --push . + +cosign generate-key-pair + +env COSIGN_PASSWORD= cosign sign --tlog-upload=false --allow-http-registry --key cosign.key --recursive 192.168.31.198:3000/library/alpine@sha256:d780ea42ba737c40b6a7fcadd8b8e6f5dd4365fb2166053f132aafe3b6ac9bcd diff --git a/pkg/cmds/server/server.go b/pkg/cmds/server/server.go index c684803f..18c8ad3c 100644 --- a/pkg/cmds/server/server.go +++ b/pkg/cmds/server/server.go @@ -66,10 +66,13 @@ func Serve(serverConfig ServerConfig) error { reqPath := c.Request().URL.Path if strings.HasPrefix(reqPath, "/assets/") { if strings.HasSuffix(c.Request().URL.Path, ".js") || + strings.HasSuffix(c.Request().URL.Path, ".map") || strings.HasSuffix(c.Request().URL.Path, ".css") || strings.HasSuffix(c.Request().URL.Path, ".svg") || strings.HasSuffix(c.Request().URL.Path, ".png") || - strings.HasSuffix(c.Request().URL.Path, ".ttf") { + strings.HasSuffix(c.Request().URL.Path, ".ttf") || + strings.HasSuffix(c.Request().URL.Path, ".json") || + strings.HasSuffix(c.Request().URL.Path, ".yaml") { c.Response().Header().Add("Cache-Control", "max-age=3600") } } diff --git a/pkg/dal/dao/mocks/tag.go b/pkg/dal/dao/mocks/tag.go index bfddb48b..95446e07 100644 --- a/pkg/dal/dao/mocks/tag.go +++ b/pkg/dal/dao/mocks/tag.go @@ -15,6 +15,7 @@ import ( dao "github.com/go-sigma/sigma/pkg/dal/dao" models "github.com/go-sigma/sigma/pkg/dal/models" types "github.com/go-sigma/sigma/pkg/types" + enums "github.com/go-sigma/sigma/pkg/types/enums" gomock "go.uber.org/mock/gomock" ) @@ -227,9 +228,9 @@ func (mr *MockTagServiceMockRecorder) ListByDtPagination(arg0, arg1, arg2 any, a } // ListTag mocks base method. -func (m *MockTagService) ListTag(arg0 context.Context, arg1 int64, arg2 *string, arg3 types.Pagination, arg4 types.Sortable) ([]*models.Tag, int64, error) { +func (m *MockTagService) ListTag(arg0 context.Context, arg1 int64, arg2 *string, arg3 []enums.ArtifactType, arg4 types.Pagination, arg5 types.Sortable) ([]*models.Tag, int64, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListTag", arg0, arg1, arg2, arg3, arg4) + ret := m.ctrl.Call(m, "ListTag", arg0, arg1, arg2, arg3, arg4, arg5) ret0, _ := ret[0].([]*models.Tag) ret1, _ := ret[1].(int64) ret2, _ := ret[2].(error) @@ -237,7 +238,7 @@ func (m *MockTagService) ListTag(arg0 context.Context, arg1 int64, arg2 *string, } // ListTag indicates an expected call of ListTag. -func (mr *MockTagServiceMockRecorder) ListTag(arg0, arg1, arg2, arg3, arg4 any) *gomock.Call { +func (mr *MockTagServiceMockRecorder) ListTag(arg0, arg1, arg2, arg3, arg4, arg5 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTag", reflect.TypeOf((*MockTagService)(nil).ListTag), arg0, arg1, arg2, arg3, arg4) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListTag", reflect.TypeOf((*MockTagService)(nil).ListTag), arg0, arg1, arg2, arg3, arg4, arg5) } diff --git a/pkg/dal/dao/tag.go b/pkg/dal/dao/tag.go index bc36699c..64326ef4 100644 --- a/pkg/dal/dao/tag.go +++ b/pkg/dal/dao/tag.go @@ -16,6 +16,7 @@ package dao import ( "context" + "database/sql/driver" "errors" "fmt" "time" @@ -51,7 +52,7 @@ type TagService interface { // ListByDtPagination lists the tags by the specified repository and pagination. ListByDtPagination(ctx context.Context, repository string, limit int, lastID ...int64) ([]*models.Tag, error) // ListTag lists the tags by the specified request. - ListTag(ctx context.Context, repositoryID int64, name *string, pagination types.Pagination, sort types.Sortable) ([]*models.Tag, int64, error) + ListTag(ctx context.Context, repositoryID int64, name *string, types []enums.ArtifactType, pagination types.Pagination, sort types.Sortable) ([]*models.Tag, int64, error) // CountArtifact counts the artifacts by the specified request. CountTag(ctx context.Context, req types.ListTagRequest) (int64, error) // CountByNamespace counts the tags by the specified namespace. @@ -203,9 +204,20 @@ func (s *tagService) ListByDtPagination(ctx context.Context, repository string, } // ListTag lists the tags by the specified request. -func (s *tagService) ListTag(ctx context.Context, repositoryID int64, name *string, pagination types.Pagination, sort types.Sortable) ([]*models.Tag, int64, error) { +func (s *tagService) ListTag(ctx context.Context, repositoryID int64, name *string, types []enums.ArtifactType, pagination types.Pagination, sort types.Sortable) ([]*models.Tag, int64, error) { + var mTypes []driver.Valuer + if len(types) > 0 { + for _, t := range types { + mTypes = append(mTypes, t) + } + } pagination = utils.NormalizePagination(pagination) query := s.tx.Tag.WithContext(ctx).Where(s.tx.Tag.RepositoryID.Eq(repositoryID)) + if len(types) > 0 { + query = query.RightJoin(s.tx.Artifact, s.tx.Tag.ArtifactID.EqCol(s.tx.Artifact.ID), s.tx.Artifact.Type.In(mTypes...)) + } else { + query = query.RightJoin(s.tx.Artifact, s.tx.Tag.ArtifactID.EqCol(s.tx.Artifact.ID)) + } if name != nil { query = query.Where(s.tx.Tag.Name.Like(fmt.Sprintf("%%%s%%", ptr.To(name)))) } @@ -213,20 +225,22 @@ func (s *tagService) ListTag(ctx context.Context, repositoryID int64, name *stri if ok { switch ptr.To(sort.Method) { case enums.SortMethodDesc: - query.Order(field.Desc()) + query = query.Order(field.Desc()) case enums.SortMethodAsc: - query.Order(field) + query = query.Order(field) default: - query.Order(s.tx.Tag.UpdatedAt.Desc()) + query = query.Order(s.tx.Tag.UpdatedAt.Desc()) } } else { - query.Order(s.tx.Tag.UpdatedAt.Desc()) + query = query.Order(s.tx.Tag.UpdatedAt.Desc()) } - query.UnderlyingDB().Preload("Artifact.ArtifactIndexes.Vulnerability") - query.UnderlyingDB().Preload("Artifact.ArtifactIndexes.Sbom") - query.Preload(s.tx.Tag.Artifact.ArtifactIndexes) - query.Preload(s.tx.Tag.Artifact.Vulnerability) - query.Preload(s.tx.Tag.Artifact.Sbom) + if len(types) > 0 { + query = query.Preload(s.tx.Tag.Artifact.ArtifactIndexes.On(s.tx.Artifact.Type.In(mTypes...))) + } else { + query = query.Preload(s.tx.Tag.Artifact.ArtifactIndexes) + } + query = query.Preload(s.tx.Tag.Artifact.Vulnerability) + query = query.Preload(s.tx.Tag.Artifact.Sbom) return query.FindByPage(ptr.To(pagination.Limit)*(ptr.To(pagination.Page)-1), ptr.To(pagination.Limit)) } diff --git a/pkg/dal/dao/tag_test.go b/pkg/dal/dao/tag_test.go index 4283a62a..c0465474 100644 --- a/pkg/dal/dao/tag_test.go +++ b/pkg/dal/dao/tag_test.go @@ -91,6 +91,7 @@ func TestTagService(t *testing.T) { Size: 123, ContentType: "test", Raw: []byte("test"), + Type: enums.ArtifactTypeImage, }, } err = tagService.Create(ctx, tagObj) @@ -111,7 +112,7 @@ func TestTagService(t *testing.T) { assert.Equal(t, tag3.PullTimes, int64(1)) assert.True(t, tag3.LastPull.Valid) - tags1, _, err := tagService.ListTag(ctx, repositoryObj.ID, nil, types.Pagination{ + tags1, _, err := tagService.ListTag(ctx, repositoryObj.ID, nil, nil, types.Pagination{ Limit: ptr.Of(int(100)), Page: ptr.Of(int(0)), }, types.Sortable{}) diff --git a/pkg/handlers/apidocs/docs.go b/pkg/handlers/apidocs/docs.go index b0f6d75a..3b5ec310 100644 --- a/pkg/handlers/apidocs/docs.go +++ b/pkg/handlers/apidocs/docs.go @@ -1733,6 +1733,26 @@ const docTemplate = `{ "description": "search tag with name", "name": "name", "in": "query" + }, + { + "type": "array", + "items": { + "enum": [ + "image", + "imageIndex", + "chart", + "cnab", + "cosign", + "wasm", + "provenance", + "unknown" + ], + "type": "string" + }, + "collectionFormat": "multi", + "description": "search tag with type", + "name": "type", + "in": "query" } ], "responses": { diff --git a/pkg/handlers/apidocs/swagger.json b/pkg/handlers/apidocs/swagger.json index cd44fda8..23c52b59 100644 --- a/pkg/handlers/apidocs/swagger.json +++ b/pkg/handlers/apidocs/swagger.json @@ -1724,6 +1724,26 @@ "description": "search tag with name", "name": "name", "in": "query" + }, + { + "type": "array", + "items": { + "enum": [ + "image", + "imageIndex", + "chart", + "cnab", + "cosign", + "wasm", + "provenance", + "unknown" + ], + "type": "string" + }, + "collectionFormat": "multi", + "description": "search tag with type", + "name": "type", + "in": "query" } ], "responses": { diff --git a/pkg/handlers/apidocs/swagger.yaml b/pkg/handlers/apidocs/swagger.yaml index 05bf28c5..e007f396 100644 --- a/pkg/handlers/apidocs/swagger.yaml +++ b/pkg/handlers/apidocs/swagger.yaml @@ -2202,6 +2202,22 @@ paths: in: query name: name type: string + - collectionFormat: multi + description: search tag with type + in: query + items: + enum: + - image + - imageIndex + - chart + - cnab + - cosign + - wasm + - provenance + - unknown + type: string + name: type + type: array produces: - application/json responses: diff --git a/pkg/handlers/distribution/manifest/manifest_head_test.go b/pkg/handlers/distribution/manifest/manifest_head_test.go index 08ed718b..58e4d9a1 100644 --- a/pkg/handlers/distribution/manifest/manifest_head_test.go +++ b/pkg/handlers/distribution/manifest/manifest_head_test.go @@ -69,8 +69,6 @@ func TestHeadManifestFallbackProxy(t *testing.T) { Proxy: configs.ConfigurationProxy{ Endpoint: s.URL, TlsVerify: true, - // Username: cUsername, - // Password: cPassword, }, }, } diff --git a/pkg/handlers/tags/tags_list.go b/pkg/handlers/tags/tags_list.go index 7ebd8a03..de237925 100644 --- a/pkg/handlers/tags/tags_list.go +++ b/pkg/handlers/tags/tags_list.go @@ -38,13 +38,14 @@ import ( // @Accept json // @Produce json // @Router /namespaces/{namespace}/tags/ [get] -// @Param limit query int64 false "limit" minimum(10) maximum(100) default(10) -// @Param page query int64 false "page" minimum(1) default(1) -// @Param sort query string false "sort field" -// @Param method query string false "sort method" Enums(asc, desc) -// @Param namespace path string true "namespace" -// @Param repository query string false "repository" -// @Param name query string false "search tag with name" +// @Param limit query int64 false "limit" minimum(10) maximum(100) default(10) +// @Param page query int64 false "page" minimum(1) default(1) +// @Param sort query string false "sort field" +// @Param method query string false "sort method" Enums(asc, desc) +// @Param namespace path string true "namespace" +// @Param repository query string false "repository" +// @Param name query string false "search tag with name" +// @Param type query []string false "search tag with type" Enums(image, imageIndex, chart, cnab, cosign, wasm, provenance, unknown) collectionFormat(multi) // @Success 200 {object} types.CommonList{items=[]types.TagItem} // @Failure 404 {object} xerrors.ErrCode // @Failure 500 {object} xerrors.ErrCode @@ -85,7 +86,7 @@ func (h *handlers) ListTag(c echo.Context) error { } tagService := h.tagServiceFactory.New() - tags, total, err := tagService.ListTag(ctx, repositoryObj.ID, req.Name, req.Pagination, req.Sortable) + tags, total, err := tagService.ListTag(ctx, repositoryObj.ID, req.Name, req.Type, req.Pagination, req.Sortable) if err != nil { log.Error().Err(err).Msg("List tag from db failed") return xerrors.NewHTTPError(c, xerrors.HTTPErrCodeInternalError, err.Error()) @@ -95,6 +96,7 @@ func (h *handlers) ListTag(c echo.Context) error { for _, tag := range tags { if tag.Artifact == nil { log.Error().Str("image", fmt.Sprintf("%s:%s", repositoryObj.Name, tag.Name)).Msg("Some tag's artifact reference invalid") + continue } var artifacts []types.TagItemArtifact for _, item := range tag.Artifact.ArtifactIndexes { diff --git a/pkg/handlers/tags/tags_list_test.go b/pkg/handlers/tags/tags_list_test.go index a9373275..0d9fc564 100644 --- a/pkg/handlers/tags/tags_list_test.go +++ b/pkg/handlers/tags/tags_list_test.go @@ -141,7 +141,7 @@ func TestListTag(t *testing.T) { defer ctrl.Finish() daoMockTagService := daomock.NewMockTagService(ctrl) - daoMockTagService.EXPECT().ListTag(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, _ int64, _ *string, _ types.Pagination, _ types.Sortable) ([]*models.Tag, int64, error) { + daoMockTagService.EXPECT().ListTag(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(_ context.Context, _ int64, _ *string, _ []enums.ArtifactType, _ types.Pagination, _ types.Sortable) ([]*models.Tag, int64, error) { return nil, 0, fmt.Errorf("test") }).Times(1) daoMockTagServiceFactory := daomock.NewMockTagServiceFactory(ctrl) diff --git a/pkg/middlewares/redirect_repository.go b/pkg/middlewares/redirect_repository.go index 2dcf53d4..cc57aa07 100644 --- a/pkg/middlewares/redirect_repository.go +++ b/pkg/middlewares/redirect_repository.go @@ -72,5 +72,8 @@ func skipRedirect(c echo.Context) bool { strings.HasSuffix(reqPath, ".js")) { return true } + if strings.HasPrefix(reqPath, "/swagger") { + return true + } return false } diff --git a/pkg/signing/cosign/sign/sign.go b/pkg/signing/cosign/sign/sign.go index e25825d3..09b13570 100644 --- a/pkg/signing/cosign/sign/sign.go +++ b/pkg/signing/cosign/sign/sign.go @@ -32,8 +32,6 @@ import ( "github.com/go-sigma/sigma/pkg/utils/imagerefs" ) -// COSIGN_PASSWORD= ./cosign sign --tlog-upload=false --allow-http-registry --key cosign.key --registry-token eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzaWdtYSIsInN1YiI6IjIiLCJleHAiOjE2OTc2OTYxMDMsIm5iZiI6MTY5NzYwOTcwMywiaWF0IjoxNjk3NjA5NzAzLCJqdGkiOiIyYzIzNWNkOC0xYmJiLTRiNGYtODYyMi1iNjI2NDZiNTE3Y2EiLCJ1aWQiOiIyIn0.W_8F6Sh2Sj21lQm_ezwQHYvNTKSUdoYHru2hOrWqKtakx6s0arzW3NAyCo7ygSdjFpX18ZcSrsaOTDkccOYNmP-66ffYxLdV2PtfP8yGP-HkdvnO1cuTTUc5a25Xbn1nx2pJTDFpUKkehuBpSQ63pVnricRkQyxx-b7umg8i8MckMsSoX8eHM_IxKoFeKcMfmXqZb_RqDIzAXR2EBRTwPw16kZFD_ROtRTpeKihnXlUTcOz8t7ULoikBwNukwDG0nHXPwK4FQ64Rj-JyjGbRnSSJQTz0IhdnwFOW62_yHKic-4eK9MfWAlMvEXweV_uC1wbop-n5I84UtMPlQ0CT6Rz2iVHVkwPE4dZc9pLcBAv0UJJOnjPxQz5OUetBfIBgP9Kz7q7amA7qWf1fmq0Gf-GL7SkIqBp1ca45Fsqg2NOnNxOzxAPYUprQrQ9ObyooEJN85tTjQsIGmNMC853C9aPDN7pNBVWyba5I_xKFzaRNeO3BvdLjs8cq9K_SYgHA_yfZe-VBrfqc-jSx-t4HFxP429F9CBMKpz1JnH_ROg94Y5FAO9NgG9Jy0thZsMK6DjyiX_sG8sSeB4FULvmP7RV03ghMEu3nObDYeOxkKtUoNuGtL_BvVkOUF7zhvhQsjbeWOIOJVcJy-ljNk8AFnTZwpZQ0PAbWceRxFEEw-iw 10.3.198.80:3000/library/redis@sha256:b355b79a3117c4bfa2e8a05d5ed0496a19e542444d5ccf0328632091238a0136 - type signing struct { Multiarch bool Http bool @@ -81,8 +79,9 @@ func (s *signing) Sign(ctx context.Context, token, priKey, ref string) error { cmd.Args = append(cmd.Args, "--key", temp.Name()) cmd.Args = append(cmd.Args, "--registry-token", token) cmd.Args = append(cmd.Args, imageRef) + cmd.Env = append(cmd.Env, "COSIGN_PASSWORD=") - return nil + return cmd.Run() } // GetDigest ... diff --git a/pkg/types/tag.go b/pkg/types/tag.go index 73da4c4f..8b0c6fe0 100644 --- a/pkg/types/tag.go +++ b/pkg/types/tag.go @@ -14,6 +14,8 @@ package types +import "github.com/go-sigma/sigma/pkg/types/enums" + // TagItemArtifact ... type TagItemArtifact struct { ID int64 `json:"id" example:"1"` @@ -53,7 +55,8 @@ type ListTagRequest struct { Namespace string `json:"namespace" param:"namespace" validate:"required,min=2,max=20,is_valid_namespace" example:"library"` Repository string `json:"repository" query:"repository" validate:"required,is_valid_repository" example:"library/busybox"` - Name *string `json:"name" query:"name"` + Name *string `json:"name" query:"name"` + Type []enums.ArtifactType `json:"type" query:"type"` } // DeleteTagRequest represents the request to delete a tag. diff --git a/test/demo/.helmignore b/test/demo/.helmignore deleted file mode 100644 index 0e8a0eb3..00000000 --- a/test/demo/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/test/demo/Chart.yaml b/test/demo/Chart.yaml deleted file mode 100644 index 71d04dbd..00000000 --- a/test/demo/Chart.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: v2 -name: demo -description: A Helm chart for Kubernetes - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.16.0" diff --git a/test/demo/templates/NOTES.txt b/test/demo/templates/NOTES.txt deleted file mode 100644 index 3031c836..00000000 --- a/test/demo/templates/NOTES.txt +++ /dev/null @@ -1,22 +0,0 @@ -1. Get the application URL by running these commands: -{{- if .Values.ingress.enabled }} -{{- range $host := .Values.ingress.hosts }} - {{- range .paths }} - http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} - {{- end }} -{{- end }} -{{- else if contains "NodePort" .Values.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "demo.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "demo.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "demo.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") - echo http://$SERVICE_IP:{{ .Values.service.port }} -{{- else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "demo.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT -{{- end }} diff --git a/test/demo/templates/_helpers.tpl b/test/demo/templates/_helpers.tpl deleted file mode 100644 index f39a5bf7..00000000 --- a/test/demo/templates/_helpers.tpl +++ /dev/null @@ -1,62 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "demo.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "demo.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "demo.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Common labels -*/}} -{{- define "demo.labels" -}} -helm.sh/chart: {{ include "demo.chart" . }} -{{ include "demo.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "demo.selectorLabels" -}} -app.kubernetes.io/name: {{ include "demo.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "demo.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "demo.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} diff --git a/test/demo/templates/deployment.yaml b/test/demo/templates/deployment.yaml deleted file mode 100644 index a555c733..00000000 --- a/test/demo/templates/deployment.yaml +++ /dev/null @@ -1,72 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "demo.fullname" . }} - labels: - {{- include "demo.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "demo.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "demo.labels" . | nindent 8 }} - {{- with .Values.podLabels }} - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "demo.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: {{ .Values.service.port }} - protocol: TCP - livenessProbe: - httpGet: - path: / - port: http - readinessProbe: - httpGet: - path: / - port: http - resources: - {{- toYaml .Values.resources | nindent 12 }} - {{- with .Values.volumeMounts }} - volumeMounts: - {{- toYaml . | nindent 12 }} - {{- end }} - {{- with .Values.volumes }} - volumes: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/test/demo/templates/hpa.yaml b/test/demo/templates/hpa.yaml deleted file mode 100644 index dedc7aa3..00000000 --- a/test/demo/templates/hpa.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{- if .Values.autoscaling.enabled }} -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "demo.fullname" . }} - labels: - {{- include "demo.labels" . | nindent 4 }} -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "demo.fullname" . }} - minReplicas: {{ .Values.autoscaling.minReplicas }} - maxReplicas: {{ .Values.autoscaling.maxReplicas }} - metrics: - {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} - {{- end }} - {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} - {{- end }} -{{- end }} diff --git a/test/demo/templates/ingress.yaml b/test/demo/templates/ingress.yaml deleted file mode 100644 index 17e50801..00000000 --- a/test/demo/templates/ingress.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "demo.fullname" . -}} -{{- $svcPort := .Values.service.port -}} -{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} - {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} - {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} - {{- end }} -{{- end }} -{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1 -{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} -apiVersion: networking.k8s.io/v1beta1 -{{- else -}} -apiVersion: extensions/v1beta1 -{{- end }} -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{- include "demo.labels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - {{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .host | quote }} - http: - paths: - {{- range .paths }} - - path: {{ .path }} - {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} - pathType: {{ .pathType }} - {{- end }} - backend: - {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} - service: - name: {{ $fullName }} - port: - number: {{ $svcPort }} - {{- else }} - serviceName: {{ $fullName }} - servicePort: {{ $svcPort }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} diff --git a/test/demo/templates/service.yaml b/test/demo/templates/service.yaml deleted file mode 100644 index ba649b39..00000000 --- a/test/demo/templates/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "demo.fullname" . }} - labels: - {{- include "demo.labels" . | nindent 4 }} -spec: - type: {{ .Values.service.type }} - ports: - - port: {{ .Values.service.port }} - targetPort: http - protocol: TCP - name: http - selector: - {{- include "demo.selectorLabels" . | nindent 4 }} diff --git a/test/demo/templates/serviceaccount.yaml b/test/demo/templates/serviceaccount.yaml deleted file mode 100644 index 763633c8..00000000 --- a/test/demo/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "demo.serviceAccountName" . }} - labels: - {{- include "demo.labels" . | nindent 4 }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - automountServiceAccountToken: {{ .Values.serviceAccount.automount }} -{{- end }} diff --git a/test/demo/templates/tests/test-connection.yaml b/test/demo/templates/tests/test-connection.yaml deleted file mode 100644 index 9d148a2a..00000000 --- a/test/demo/templates/tests/test-connection.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: "{{ include "demo.fullname" . }}-test-connection" - labels: - {{- include "demo.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - containers: - - name: wget - image: busybox - command: ['wget'] - args: ['{{ include "demo.fullname" . }}:{{ .Values.service.port }}'] - restartPolicy: Never diff --git a/test/demo/values.yaml b/test/demo/values.yaml deleted file mode 100644 index 737435d8..00000000 --- a/test/demo/values.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# Default values for demo. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: nginx - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - tag: "" - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -serviceAccount: - # Specifies whether a service account should be created - create: true - # Automatically mount a ServiceAccount's API credentials? - automount: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} -podLabels: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - type: ClusterIP - port: 80 - -ingress: - enabled: false - className: "" - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: - - host: chart-example.local - paths: - - path: / - pathType: ImplementationSpecific - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -resources: {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -# Additional volumes on the output Deployment definition. -volumes: [] -# - name: foo -# secret: -# secretName: mysecret -# optional: false - -# Additional volumeMounts on the output Deployment definition. -volumeMounts: [] -# - name: foo -# mountPath: "/etc/foo" -# readOnly: true - -nodeSelector: {} - -tolerations: [] - -affinity: {} diff --git a/web/package.json b/web/package.json index d49e0fe8..771d9fb1 100644 --- a/web/package.json +++ b/web/package.json @@ -13,7 +13,7 @@ "@bytemd/react": "^1.21.0", "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", - "@monaco-editor/react": "^4.5.2", + "@monaco-editor/react": "^4.6.0", "@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/forms": "^0.5.6", "@tailwindcss/line-clamp": "^0.4.4", @@ -22,15 +22,15 @@ "bytemd": "^1.21.0", "dayjs": "^1.11.10", "flowbite": "^1.8.1", - "github-markdown-css": "^5.2.0", + "github-markdown-css": "^5.3.0", "human-format": "^1.2.0", "lodash": "^4.17.21", - "monaco-editor": "^0.43.0", + "monaco-editor": "^0.44.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-helmet-async": "^1.3.0", "react-icons": "^4.11.0", - "react-router-dom": "^6.16.0", + "react-router-dom": "^6.17.0", "react-toastify": "^9.1.3", "react-use": "^17.4.0", "xterm": "^5.3.0", @@ -38,9 +38,9 @@ "xterm-addon-fit": "^0.8.0" }, "devDependencies": { - "@types/node": "^20.8.3", - "@types/react": "^18.2.25", - "@types/react-dom": "^18.2.11", + "@types/node": "^20.8.7", + "@types/react": "^18.2.29", + "@types/react-dom": "^18.2.14", "@vitejs/plugin-react-swc": "^3.4.0", "autoprefixer": "^10.4.16", "cssnano": "^6.0.1", @@ -48,6 +48,6 @@ "postcss": "^8.4.31", "tailwindcss": "^3.3.3", "typescript": "^5.2.2", - "vite": "^4.4.11" + "vite": "^4.5.0" } } diff --git a/web/src/pages/Tag/index.tsx b/web/src/pages/Tag/index.tsx index ecc1ce38..022993c3 100644 --- a/web/src/pages/Tag/index.tsx +++ b/web/src/pages/Tag/index.tsx @@ -68,7 +68,7 @@ export default function Tag({ localServer }: { localServer: string }) { }, [namespace, repository]) const fetchTags = () => { - let url = localServer + `/api/v1/namespaces/${namespace}/tags/?repository=${repository}&limit=${Settings.PageSize}&page=${page}`; + let url = localServer + `/api/v1/namespaces/${namespace}/tags/?repository=${repository}&limit=${Settings.PageSize}&page=${page}&type=image&type=imageIndex`; if (searchTag !== "") { url += `&name=${searchTag}`; } diff --git a/web/yarn.lock b/web/yarn.lock index 6216aae9..618f6d00 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -182,19 +182,19 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@monaco-editor/loader@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.3.tgz#7f1742bd3cc21c0362a46a4056317f6e5215cfca" - integrity sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q== +"@monaco-editor/loader@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" + integrity sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg== dependencies: state-local "^1.0.6" -"@monaco-editor/react@^4.5.2": - version "4.5.2" - resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.5.2.tgz#e8cc802203f729b423a998ea6fcb466604d61258" - integrity sha512-emcWu6vg1OpXPiYll4aPOaXe8bwYB4UaaNTwtArFLgMoNGBzRZb2Xn0Bra2HMIFM7QLgs7fCGunHO5LkfT2LBA== +"@monaco-editor/react@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.6.0.tgz#bcc68671e358a21c3814566b865a54b191e24119" + integrity sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw== dependencies: - "@monaco-editor/loader" "^1.3.3" + "@monaco-editor/loader" "^1.4.0" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -222,10 +222,10 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@remix-run/router@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6" - integrity sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA== +"@remix-run/router@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.10.0.tgz#e2170dc2049b06e65bbe883adad0e8ddf8291278" + integrity sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw== "@swc/core-darwin-arm64@1.3.92": version "1.3.92" @@ -393,10 +393,12 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@^20.8.3": - version "20.8.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" - integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== +"@types/node@^20.8.7": + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" "@types/parse5@^6.0.0": version "6.0.3" @@ -408,10 +410,10 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-dom@^18.2.11": - version "18.2.11" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.11.tgz#4332c315544698a0875dfdb6e320dda59e1b3d58" - integrity sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg== +"@types/react-dom@^18.2.14": + version "18.2.14" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.14.tgz#c01ba40e5bb57fc1dc41569bb3ccdb19eab1c539" + integrity sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ== dependencies: "@types/react" "*" @@ -424,10 +426,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^18.2.25": - version "18.2.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.25.tgz#99fa44154132979e870ff409dc5b6e67f06f0199" - integrity sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw== +"@types/react@^18.2.29": + version "18.2.29" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.29.tgz#88b48a287e00f6fdcd6f95662878fb701ae18b27" + integrity sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -1338,10 +1340,10 @@ get-intrinsic@^1.0.2: has-proto "^1.0.1" has-symbols "^1.0.3" -github-markdown-css@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-5.2.0.tgz#9f9e30f16cbc1d3b76110667b7c36ca3d96c9cdc" - integrity sha512-hq5RaCInSUZ48bImOZpkppW2/MT44StRgsbsZ8YA4vJFwLKB/Vo3k7R2t+pUGqO+ThG0QDMi96TewV/B3vyItg== +github-markdown-css@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-5.3.0.tgz#b150b1a52c18692c576072316ca89a0942df034a" + integrity sha512-WI+6puEQJnC8JoIveA8R8PiwH/wJwlneE88j7Q+ojMfzWcqRJF01vrVvo8PoWc6Y4aDF+kG4WGZi3RHXymyzJg== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -2235,10 +2237,10 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -monaco-editor@^0.43.0: - version "0.43.0" - resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.43.0.tgz#cb02a8d23d1249ad00b7cffe8bbecc2ac09d4baf" - integrity sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q== +monaco-editor@^0.44.0: + version "0.44.0" + resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.44.0.tgz#3c0fe3655923bbf7dd647057302070b5095b6c59" + integrity sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q== morgan@^1.10.0: version "1.10.0" @@ -2800,20 +2802,20 @@ react-is@^16.13.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-router-dom@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.16.0.tgz#86f24658da35eb66727e75ecbb1a029e33ee39d9" - integrity sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg== +react-router-dom@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.17.0.tgz#ea73f89186546c1cf72b10fcb7356d874321b2ad" + integrity sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ== dependencies: - "@remix-run/router" "1.9.0" - react-router "6.16.0" + "@remix-run/router" "1.10.0" + react-router "6.17.0" -react-router@6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.16.0.tgz#abbf3d5bdc9c108c9b822a18be10ee004096fb81" - integrity sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA== +react-router@6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.17.0.tgz#7b680c4cefbc425b57537eb9c73bedecbdc67c1e" + integrity sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA== dependencies: - "@remix-run/router" "1.9.0" + "@remix-run/router" "1.10.0" react-toastify@^9.1.3: version "9.1.3" @@ -3330,6 +3332,11 @@ typescript@^5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + unified@^10.0.0, unified@^10.1.2: version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" @@ -3450,10 +3457,10 @@ vfile@^5.0.0, vfile@^5.3.7: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" -vite@^4.4.11: - version "4.4.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.11.tgz#babdb055b08c69cfc4c468072a2e6c9ca62102b0" - integrity sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A== +vite@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" + integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== dependencies: esbuild "^0.18.10" postcss "^8.4.27"