From 32888b07ce19831b7c831cd2ecb13a4897feb17a Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Fri, 8 Sep 2023 23:48:29 +0000 Subject: [PATCH 01/13] fix: [code-836]: fix issue where code comments cant be added (#420) --- web/src/components/DiffViewer/DiffViewerUtils.tsx | 3 ++- web/src/pages/Webhooks/Webhooks.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/web/src/components/DiffViewer/DiffViewerUtils.tsx b/web/src/components/DiffViewer/DiffViewerUtils.tsx index 03ac6d20f..ded5497dd 100644 --- a/web/src/components/DiffViewer/DiffViewerUtils.tsx +++ b/web/src/components/DiffViewer/DiffViewerUtils.tsx @@ -143,7 +143,8 @@ export function getCommentLineInfo( ) { const isSideBySideView = viewStyle === ViewStyle.SIDE_BY_SIDE const { left, lineNumber, filePath } = commentEntry - const filePathBody = contentDOM?.querySelector(`[data="${filePath}"`) + console.log(commentEntry) + const filePathBody = filePath ? contentDOM?.querySelector(`[data="${filePath}"`) : contentDOM const diffBody = filePathBody?.querySelector( `${isSideBySideView ? `.d2h-file-side-diff${left ? '.left' : '.right'} ` : ''}.d2h-diff-tbody` diff --git a/web/src/pages/Webhooks/Webhooks.tsx b/web/src/pages/Webhooks/Webhooks.tsx index ff2f725b0..fc360be03 100644 --- a/web/src/pages/Webhooks/Webhooks.tsx +++ b/web/src/pages/Webhooks/Webhooks.tsx @@ -286,7 +286,7 @@ export default function Webhooks() { showWhen={() => webhooks?.length === 0} forSearch={!!searchTerm} message={getString('webhookEmpty')} - buttonText={getString('createWebhook')} + buttonText={getString('newWebhook')} onButtonClick={() => history.push( routes.toCODEWebhookNew({ From 0d086a1a4de0cfc4c4a22463b60ccb376f095e81 Mon Sep 17 00:00:00 2001 From: Johannes Batzill Date: Fri, 8 Sep 2023 23:52:19 +0000 Subject: [PATCH 02/13] [Events] This PR introduces the Trigger Service for Event Consumption + Some Minor improvements (#419) --- cli/server/config.go | 32 +++--- cmd/gitness/wire.go | 7 +- cmd/gitness/wire_gen.go | 13 ++- events/reader.go | 10 +- .../pullreq/{pullreq.go => service.go} | 0 internal/services/trigger/handler_branch.go | 22 ++++ internal/services/trigger/handler_pullreq.go | 27 +++++ internal/services/trigger/handler_tag.go | 22 ++++ internal/services/trigger/service.go | 103 ++++++++++++++++++ internal/services/trigger/wire.go | 28 +++++ .../webhook/{branch.go => handler_branch.go} | 0 .../{pullreq.go => handler_pullreq.go} | 0 .../webhook/{tag.go => handler_tag.go} | 0 internal/services/webhook/service.go | 18 ++- internal/services/{services.go => wire.go} | 15 +-- types/config.go | 18 +++ 16 files changed, 272 insertions(+), 43 deletions(-) rename internal/services/pullreq/{pullreq.go => service.go} (100%) create mode 100644 internal/services/trigger/handler_branch.go create mode 100644 internal/services/trigger/handler_pullreq.go create mode 100644 internal/services/trigger/handler_tag.go create mode 100644 internal/services/trigger/service.go create mode 100644 internal/services/trigger/wire.go rename internal/services/webhook/{branch.go => handler_branch.go} (100%) rename internal/services/webhook/{pullreq.go => handler_pullreq.go} (100%) rename internal/services/webhook/{tag.go => handler_tag.go} (100%) rename internal/services/{services.go => wire.go} (72%) diff --git a/cli/server/config.go b/cli/server/config.go index b1dea701f..e79512606 100644 --- a/cli/server/config.go +++ b/cli/server/config.go @@ -13,6 +13,7 @@ import ( "github.com/harness/gitness/events" "github.com/harness/gitness/gitrpc" "github.com/harness/gitness/gitrpc/server" + "github.com/harness/gitness/internal/services/trigger" "github.com/harness/gitness/internal/services/webhook" "github.com/harness/gitness/lock" "github.com/harness/gitness/store/database" @@ -147,23 +148,26 @@ func ProvideEventsConfig() (events.Config, error) { return config, nil } -// ProvideWebhookConfig loads the webhook config from the environment. -// It backfills certain config elements if required. -func ProvideWebhookConfig() (webhook.Config, error) { - config := webhook.Config{} - err := envconfig.Process("", &config) - if err != nil { - return webhook.Config{}, fmt.Errorf("failed to load events config: %w", err) +// ProvideWebhookConfig loads the webhook service config from the main config. +func ProvideWebhookConfig(config *types.Config) webhook.Config { + return webhook.Config{ + UserAgentIdentity: config.Webhook.UserAgentIdentity, + HeaderIdentity: config.Webhook.HeaderIdentity, + EventReaderName: config.InstanceID, + Concurrency: config.Webhook.Concurrency, + MaxRetries: config.Webhook.MaxRetries, + AllowPrivateNetwork: config.Webhook.AllowPrivateNetwork, + AllowLoopback: config.Webhook.AllowLoopback, } +} - if config.EventReaderName == "" { - config.EventReaderName, err = getSanitizedMachineName() - if err != nil { - return webhook.Config{}, fmt.Errorf("failed to get sanitized machine name: %w", err) - } +// ProvideTriggerConfig loads the trigger service config from the main config. +func ProvideTriggerConfig(config *types.Config) trigger.Config { + return trigger.Config{ + EventReaderName: config.InstanceID, + Concurrency: config.Webhook.Concurrency, + MaxRetries: config.Webhook.MaxRetries, } - - return config, nil } // ProvideLockConfig generates the `lock` package config from the gitness config. diff --git a/cmd/gitness/wire.go b/cmd/gitness/wire.go index b94c730db..8675dbc8c 100644 --- a/cmd/gitness/wire.go +++ b/cmd/gitness/wire.go @@ -32,7 +32,7 @@ import ( "github.com/harness/gitness/internal/api/controller/space" "github.com/harness/gitness/internal/api/controller/system" "github.com/harness/gitness/internal/api/controller/template" - "github.com/harness/gitness/internal/api/controller/trigger" + controllertrigger "github.com/harness/gitness/internal/api/controller/trigger" "github.com/harness/gitness/internal/api/controller/user" controllerwebhook "github.com/harness/gitness/internal/api/controller/webhook" "github.com/harness/gitness/internal/auth/authn" @@ -54,6 +54,7 @@ import ( "github.com/harness/gitness/internal/services/importer" "github.com/harness/gitness/internal/services/job" pullreqservice "github.com/harness/gitness/internal/services/pullreq" + "github.com/harness/gitness/internal/services/trigger" "github.com/harness/gitness/internal/services/webhook" "github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/store/cache" @@ -106,6 +107,8 @@ func initSystem(ctx context.Context, config *types.Config) (*cliserver.System, e events.WireSet, cliserver.ProvideWebhookConfig, webhook.WireSet, + cliserver.ProvideTriggerConfig, + trigger.WireSet, githook.WireSet, cliserver.ProvideLockConfig, lock.WireSet, @@ -129,7 +132,7 @@ func initSystem(ctx context.Context, config *types.Config) (*cliserver.System, e eventsstream.WireSet, scheduler.WireSet, commit.WireSet, - trigger.WireSet, + controllertrigger.WireSet, plugin.WireSet, importer.WireSet, ) diff --git a/cmd/gitness/wire_gen.go b/cmd/gitness/wire_gen.go index 7f21e8da1..248028317 100644 --- a/cmd/gitness/wire_gen.go +++ b/cmd/gitness/wire_gen.go @@ -52,6 +52,7 @@ import ( "github.com/harness/gitness/internal/services/importer" "github.com/harness/gitness/internal/services/job" pullreq2 "github.com/harness/gitness/internal/services/pullreq" + trigger2 "github.com/harness/gitness/internal/services/trigger" "github.com/harness/gitness/internal/services/webhook" "github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/store/cache" @@ -174,10 +175,7 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro } migrator := codecomments.ProvideMigrator(gitrpcInterface) pullreqController := pullreq.ProvideController(db, provider, authorizer, pullReqStore, pullReqActivityStore, codeCommentView, pullReqReviewStore, pullReqReviewerStore, repoStore, principalStore, gitrpcInterface, reporter, mutexManager, migrator) - webhookConfig, err := server.ProvideWebhookConfig() - if err != nil { - return nil, err - } + webhookConfig := server.ProvideWebhookConfig(config) webhookStore := database.ProvideWebhookStore(db) webhookExecutionStore := database.ProvideWebhookExecutionStore(db) readerFactory, err := events4.ProvideReaderFactory(eventsSystem) @@ -236,7 +234,12 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro if err != nil { return nil, err } - servicesServices := services.ProvideServices(webhookService, pullreqService, executor, jobScheduler) + triggerConfig := server.ProvideTriggerConfig(config) + triggerService, err := trigger2.ProvideService(ctx, triggerConfig, readerFactory, eventsReaderFactory) + if err != nil { + return nil, err + } + servicesServices := services.ProvideServices(webhookService, pullreqService, triggerService, jobScheduler) serverSystem := server.NewSystem(bootstrapBootstrap, serverServer, poller, grpcServer, cronManager, servicesServices) return serverSystem, nil } diff --git a/events/reader.go b/events/reader.go index c625c82bb..19fc18ee8 100644 --- a/events/reader.go +++ b/events/reader.go @@ -43,9 +43,9 @@ func (f *ReaderFactory[R]) Launch(ctx context.Context, // setup ctx with copied logger that has extra fields set log := log.Ctx(ctx).With(). - Str("events_category", f.category). - Str("events_group_name", groupName). - Str("events_reader_name", readerName). + Str("events.category", f.category). + Str("events.group_name", groupName). + Str("events.reader_name", readerName). Logger() // create new stream consumer using factory method @@ -191,8 +191,8 @@ func ReaderRegisterEvent[T interface{}](reader *GenericReader, // update ctx with event type for proper logging log := log.Ctx(ctx).With(). - Str("events_type", string(eventType)). - Str("events_id", event.ID). + Str("events.type", string(eventType)). + Str("events.id", event.ID). Logger() ctx = log.WithContext(ctx) diff --git a/internal/services/pullreq/pullreq.go b/internal/services/pullreq/service.go similarity index 100% rename from internal/services/pullreq/pullreq.go rename to internal/services/pullreq/service.go diff --git a/internal/services/trigger/handler_branch.go b/internal/services/trigger/handler_branch.go new file mode 100644 index 000000000..ff9207ef5 --- /dev/null +++ b/internal/services/trigger/handler_branch.go @@ -0,0 +1,22 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package trigger + +import ( + "context" + + "github.com/harness/gitness/events" + gitevents "github.com/harness/gitness/internal/events/git" +) + +func (s *Service) handleEventBranchCreated(ctx context.Context, + event *events.Event[*gitevents.BranchCreatedPayload]) error { + return events.NewDiscardEventErrorf("not implemented") +} + +func (s *Service) handleEventBranchUpdated(ctx context.Context, + event *events.Event[*gitevents.BranchUpdatedPayload]) error { + return events.NewDiscardEventErrorf("not implemented") +} diff --git a/internal/services/trigger/handler_pullreq.go b/internal/services/trigger/handler_pullreq.go new file mode 100644 index 000000000..7f209d85a --- /dev/null +++ b/internal/services/trigger/handler_pullreq.go @@ -0,0 +1,27 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package trigger + +import ( + "context" + + "github.com/harness/gitness/events" + pullreqevents "github.com/harness/gitness/internal/events/pullreq" +) + +func (s *Service) handleEventPullReqCreated(ctx context.Context, + event *events.Event[*pullreqevents.CreatedPayload]) error { + return events.NewDiscardEventErrorf("not implemented") +} + +func (s *Service) handleEventPullReqReopened(ctx context.Context, + event *events.Event[*pullreqevents.ReopenedPayload]) error { + return events.NewDiscardEventErrorf("not implemented") +} + +func (s *Service) handleEventPullReqBranchUpdated(ctx context.Context, + event *events.Event[*pullreqevents.BranchUpdatedPayload]) error { + return events.NewDiscardEventErrorf("not implemented") +} diff --git a/internal/services/trigger/handler_tag.go b/internal/services/trigger/handler_tag.go new file mode 100644 index 000000000..c69c76809 --- /dev/null +++ b/internal/services/trigger/handler_tag.go @@ -0,0 +1,22 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package trigger + +import ( + "context" + + "github.com/harness/gitness/events" + gitevents "github.com/harness/gitness/internal/events/git" +) + +func (s *Service) handleEventTagCreated(ctx context.Context, + event *events.Event[*gitevents.TagCreatedPayload]) error { + return events.NewDiscardEventErrorf("not implemented") +} + +func (s *Service) handleEventTagUpdated(ctx context.Context, + event *events.Event[*gitevents.TagUpdatedPayload]) error { + return events.NewDiscardEventErrorf("not implemented") +} diff --git a/internal/services/trigger/service.go b/internal/services/trigger/service.go new file mode 100644 index 000000000..c2e58a5a6 --- /dev/null +++ b/internal/services/trigger/service.go @@ -0,0 +1,103 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package trigger + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/harness/gitness/events" + gitevents "github.com/harness/gitness/internal/events/git" + pullreqevents "github.com/harness/gitness/internal/events/pullreq" + "github.com/harness/gitness/stream" +) + +const ( + eventsReaderGroupName = "gitness:trigger" +) + +type Config struct { + EventReaderName string + Concurrency int + MaxRetries int +} + +func (c *Config) Prepare() error { + if c == nil { + return errors.New("config is required") + } + if c.EventReaderName == "" { + return errors.New("config.EventReaderName is required") + } + if c.Concurrency < 1 { + return errors.New("config.Concurrency has to be a positive number") + } + if c.MaxRetries < 0 { + return errors.New("config.MaxRetries can't be negative") + } + + return nil +} + +type Service struct{} + +func New( + ctx context.Context, + config Config, + gitReaderFactory *events.ReaderFactory[*gitevents.Reader], + pullreqEvReaderFactory *events.ReaderFactory[*pullreqevents.Reader], +) (*Service, error) { + if err := config.Prepare(); err != nil { + return nil, fmt.Errorf("provided trigger service config is invalid: %w", err) + } + + service := &Service{} + + _, err := gitReaderFactory.Launch(ctx, eventsReaderGroupName, config.EventReaderName, + func(r *gitevents.Reader) error { + const idleTimeout = 1 * time.Minute + r.Configure( + stream.WithConcurrency(config.Concurrency), + stream.WithHandlerOptions( + stream.WithIdleTimeout(idleTimeout), + stream.WithMaxRetries(config.MaxRetries), + )) + + _ = r.RegisterBranchCreated(service.handleEventBranchCreated) + _ = r.RegisterBranchUpdated(service.handleEventBranchUpdated) + + _ = r.RegisterTagCreated(service.handleEventTagCreated) + _ = r.RegisterTagUpdated(service.handleEventTagUpdated) + + return nil + }) + if err != nil { + return nil, fmt.Errorf("failed to launch git events reader: %w", err) + } + + _, err = pullreqEvReaderFactory.Launch(ctx, eventsReaderGroupName, config.EventReaderName, + func(r *pullreqevents.Reader) error { + const idleTimeout = 1 * time.Minute + r.Configure( + stream.WithConcurrency(config.Concurrency), + stream.WithHandlerOptions( + stream.WithIdleTimeout(idleTimeout), + stream.WithMaxRetries(config.MaxRetries), + )) + + _ = r.RegisterCreated(service.handleEventPullReqCreated) + _ = r.RegisterBranchUpdated(service.handleEventPullReqBranchUpdated) + _ = r.RegisterReopened(service.handleEventPullReqReopened) + + return nil + }) + if err != nil { + return nil, fmt.Errorf("failed to launch pr events reader: %w", err) + } + + return service, nil +} diff --git a/internal/services/trigger/wire.go b/internal/services/trigger/wire.go new file mode 100644 index 000000000..fab566b95 --- /dev/null +++ b/internal/services/trigger/wire.go @@ -0,0 +1,28 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package trigger + +import ( + "context" + + "github.com/harness/gitness/events" + gitevents "github.com/harness/gitness/internal/events/git" + pullreqevents "github.com/harness/gitness/internal/events/pullreq" + + "github.com/google/wire" +) + +var WireSet = wire.NewSet( + ProvideService, +) + +func ProvideService( + ctx context.Context, + config Config, + gitReaderFactory *events.ReaderFactory[*gitevents.Reader], + pullReqEvFactory *events.ReaderFactory[*pullreqevents.Reader], +) (*Service, error) { + return New(ctx, config, gitReaderFactory, pullReqEvFactory) +} diff --git a/internal/services/webhook/branch.go b/internal/services/webhook/handler_branch.go similarity index 100% rename from internal/services/webhook/branch.go rename to internal/services/webhook/handler_branch.go diff --git a/internal/services/webhook/pullreq.go b/internal/services/webhook/handler_pullreq.go similarity index 100% rename from internal/services/webhook/pullreq.go rename to internal/services/webhook/handler_pullreq.go diff --git a/internal/services/webhook/tag.go b/internal/services/webhook/handler_tag.go similarity index 100% rename from internal/services/webhook/tag.go rename to internal/services/webhook/handler_tag.go diff --git a/internal/services/webhook/service.go b/internal/services/webhook/service.go index 52cd0b7dc..ea8da2c2a 100644 --- a/internal/services/webhook/service.go +++ b/internal/services/webhook/service.go @@ -27,17 +27,15 @@ const ( type Config struct { // UserAgentIdentity specifies the identity used for the user agent header // IMPORTANT: do not include version. - UserAgentIdentity string `envconfig:"GITNESS_WEBHOOK_USER_AGENT_IDENTITY" default:"Gitness"` + UserAgentIdentity string // HeaderIdentity specifies the identity used for headers in webhook calls (e.g. X-Gitness-Trigger, ...). // NOTE: If no value is provided, the UserAgentIdentity will be used. - HeaderIdentity string `envconfig:"GITNESS_WEBHOOK_HEADER_IDENTITY"` - // EventReaderName is the name used to read events from stream. - // Note: this should be different for every running instance. - EventReaderName string `envconfig:"GITNESS_WEBHOOK_EVENT_READER_NAME"` - Concurrency int `envconfig:"GITNESS_WEBHOOK_CONCURRENCY" default:"4"` - MaxRetries int `envconfig:"GITNESS_WEBHOOK_MAX_RETRIES" default:"3"` - AllowPrivateNetwork bool `envconfig:"GITNESS_WEBHOOK_ALLOW_PRIVATE_NETWORK" default:"false"` - AllowLoopback bool `envconfig:"GITNESS_WEBHOOK_ALLOW_LOOPBACK" default:"false"` + HeaderIdentity string + EventReaderName string + Concurrency int + MaxRetries int + AllowPrivateNetwork bool + AllowLoopback bool } func (c *Config) Prepare() error { @@ -91,7 +89,7 @@ func NewService(ctx context.Context, config Config, repoStore store.RepoStore, pullreqStore store.PullReqStore, urlProvider *url.Provider, principalStore store.PrincipalStore, gitRPCClient gitrpc.Interface) (*Service, error) { if err := config.Prepare(); err != nil { - return nil, fmt.Errorf("provided config is invalid: %w", err) + return nil, fmt.Errorf("provided webhook service config is invalid: %w", err) } service := &Service{ webhookStore: webhookStore, diff --git a/internal/services/services.go b/internal/services/wire.go similarity index 72% rename from internal/services/services.go rename to internal/services/wire.go index 1cb5efedd..919fb7b75 100644 --- a/internal/services/services.go +++ b/internal/services/wire.go @@ -7,6 +7,7 @@ package services import ( "github.com/harness/gitness/internal/services/job" "github.com/harness/gitness/internal/services/pullreq" + "github.com/harness/gitness/internal/services/trigger" "github.com/harness/gitness/internal/services/webhook" "github.com/google/wire" @@ -19,20 +20,20 @@ var WireSet = wire.NewSet( type Services struct { Webhook *webhook.Service PullReq *pullreq.Service - JobExecutor *job.Executor + Trigger *trigger.Service JobScheduler *job.Scheduler } func ProvideServices( - webhooksSrv *webhook.Service, - pullReqSrv *pullreq.Service, - jobExecutor *job.Executor, + webhooksSvc *webhook.Service, + pullReqSvc *pullreq.Service, + triggerSvc *trigger.Service, jobScheduler *job.Scheduler, ) Services { return Services{ - Webhook: webhooksSrv, - PullReq: pullReqSrv, - JobExecutor: jobExecutor, + Webhook: webhooksSvc, + PullReq: pullReqSvc, + Trigger: triggerSvc, JobScheduler: jobScheduler, } } diff --git a/types/config.go b/types/config.go index 37f2b7335..85421310a 100644 --- a/types/config.go +++ b/types/config.go @@ -200,4 +200,22 @@ type Config struct { // finished and failed jobs will be purged from the DB. PurgeFinishedOlderThan time.Duration `envconfig:"GITNESS_JOBS_PURGE_FINISHED_OLDER_THAN" default:"120h"` } + + Webhook struct { + // UserAgentIdentity specifies the identity used for the user agent header + // IMPORTANT: do not include version. + UserAgentIdentity string `envconfig:"GITNESS_WEBHOOK_USER_AGENT_IDENTITY" default:"Gitness"` + // HeaderIdentity specifies the identity used for headers in webhook calls (e.g. X-Gitness-Trigger, ...). + // NOTE: If no value is provided, the UserAgentIdentity will be used. + HeaderIdentity string `envconfig:"GITNESS_WEBHOOK_HEADER_IDENTITY"` + Concurrency int `envconfig:"GITNESS_WEBHOOK_CONCURRENCY" default:"4"` + MaxRetries int `envconfig:"GITNESS_WEBHOOK_MAX_RETRIES" default:"3"` + AllowPrivateNetwork bool `envconfig:"GITNESS_WEBHOOK_ALLOW_PRIVATE_NETWORK" default:"false"` + AllowLoopback bool `envconfig:"GITNESS_WEBHOOK_ALLOW_LOOPBACK" default:"false"` + } + + Trigger struct { + Concurrency int `envconfig:"GITNESS_TRIGGER_CONCURRENCY" default:"4"` + MaxRetries int `envconfig:"GITNESS_TRIGGER_MAX_RETRIES" default:"3"` + } } From 9c46f066dcccb8cd62240907344cde7a54765eaa Mon Sep 17 00:00:00 2001 From: calvin Date: Fri, 8 Sep 2023 17:56:04 -0600 Subject: [PATCH 03/13] fix: [code-836]: remove comment --- web/src/components/DiffViewer/DiffViewerUtils.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/web/src/components/DiffViewer/DiffViewerUtils.tsx b/web/src/components/DiffViewer/DiffViewerUtils.tsx index ded5497dd..db20f6cdd 100644 --- a/web/src/components/DiffViewer/DiffViewerUtils.tsx +++ b/web/src/components/DiffViewer/DiffViewerUtils.tsx @@ -143,7 +143,6 @@ export function getCommentLineInfo( ) { const isSideBySideView = viewStyle === ViewStyle.SIDE_BY_SIDE const { left, lineNumber, filePath } = commentEntry - console.log(commentEntry) const filePathBody = filePath ? contentDOM?.querySelector(`[data="${filePath}"`) : contentDOM const diffBody = filePathBody?.querySelector( From 8570810dbcea5709dcceeb3182d1bf63d8aab168 Mon Sep 17 00:00:00 2001 From: Johannes Batzill Date: Sat, 9 Sep 2023 00:59:35 +0000 Subject: [PATCH 04/13] fix stringtypes (#422) --- web/src/framework/strings/stringTypes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/framework/strings/stringTypes.ts b/web/src/framework/strings/stringTypes.ts index bcf1a47af..d16e6f61c 100644 --- a/web/src/framework/strings/stringTypes.ts +++ b/web/src/framework/strings/stringTypes.ts @@ -169,6 +169,7 @@ export interface StringsMap { enterUser: string error: string error404Text: string + 'executions.completedTime': string 'executions.description': string 'executions.name': string 'executions.newExecutionButton': string From cde80d53a8032437dffd7ee65bb74971103463f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ga=C4=87e=C5=A1a?= Date: Fri, 8 Sep 2023 17:35:50 +0200 Subject: [PATCH 05/13] add space import --- cmd/gitness/wire_gen.go | 4 +- internal/api/controller/repo/blame.go | 10 +- internal/api/controller/repo/commit.go | 14 +- internal/api/controller/repo/content_get.go | 7 +- .../controller/repo/content_paths_details.go | 13 +- internal/api/controller/repo/controller.go | 32 +++ internal/api/controller/repo/create_branch.go | 14 +- .../api/controller/repo/create_commit_tag.go | 14 +- internal/api/controller/repo/create_path.go | 14 +- internal/api/controller/repo/delete.go | 13 + internal/api/controller/repo/delete_branch.go | 13 +- internal/api/controller/repo/delete_path.go | 13 +- internal/api/controller/repo/delete_tag.go | 14 +- internal/api/controller/repo/diff.go | 6 +- internal/api/controller/repo/find.go | 3 +- internal/api/controller/repo/get_branch.go | 16 +- internal/api/controller/repo/get_commit.go | 16 +- .../controller/repo/get_commit_divergences.go | 18 +- internal/api/controller/repo/import.go | 110 +------- internal/api/controller/repo/import_cancel.go | 41 +++ .../api/controller/repo/import_progress.go | 1 + internal/api/controller/repo/list_branches.go | 19 +- .../api/controller/repo/list_commit_tags.go | 19 +- internal/api/controller/repo/list_commits.go | 19 +- internal/api/controller/repo/list_paths.go | 18 +- .../api/controller/repo/list_pipelines.go | 11 +- .../controller/repo/list_service_accounts.go | 18 +- internal/api/controller/repo/merge_check.go | 7 +- internal/api/controller/repo/move.go | 12 +- internal/api/controller/repo/raw.go | 21 +- internal/api/controller/repo/update.go | 14 +- internal/api/controller/space/controller.go | 5 +- internal/api/controller/space/import.go | 180 ++++++++++++ internal/api/controller/space/wire.go | 9 +- internal/api/handler/repo/import_cancel.go | 33 +++ internal/api/handler/space/import.go | 36 +++ internal/router/api.go | 1 + internal/services/importer/provider.go | 151 ++++++++-- internal/services/importer/repository.go | 262 +++++++++++++++--- internal/services/importer/wire.go | 11 +- internal/services/job/scheduler.go | 27 +- internal/services/job/timer.go | 5 + internal/store/database/job.go | 6 +- ...0025_alter_table_job_add_group_id.down.sql | 1 + .../0025_alter_table_job_add_group_id.up.sql | 1 + ...0025_alter_table_job_add_group_id.down.sql | 1 + .../0025_alter_table_job_add_group_id.up.sql | 1 + internal/store/database/repo.go | 34 +-- types/job.go | 1 + 49 files changed, 912 insertions(+), 397 deletions(-) create mode 100644 internal/api/controller/repo/import_cancel.go create mode 100644 internal/api/controller/space/import.go create mode 100644 internal/api/handler/repo/import_cancel.go create mode 100644 internal/api/handler/space/import.go create mode 100644 internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.down.sql create mode 100644 internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.up.sql create mode 100644 internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.down.sql create mode 100644 internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.up.sql diff --git a/cmd/gitness/wire_gen.go b/cmd/gitness/wire_gen.go index 248028317..1a970f498 100644 --- a/cmd/gitness/wire_gen.go +++ b/cmd/gitness/wire_gen.go @@ -120,7 +120,7 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro if err != nil { return nil, err } - repository, err := importer.ProvideRepoImporter(provider, gitrpcInterface, repoStore, jobScheduler, executor) + repository, err := importer.ProvideRepoImporter(config, provider, gitrpcInterface, repoStore, jobScheduler, executor) if err != nil { return nil, err } @@ -143,7 +143,7 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro secretStore := database.ProvideSecretStore(db) connectorStore := database.ProvideConnectorStore(db) templateStore := database.ProvideTemplateStore(db) - spaceController := space.ProvideController(db, provider, eventsStreamer, pathUID, authorizer, pathStore, pipelineStore, secretStore, connectorStore, templateStore, spaceStore, repoStore, principalStore, repoController, membershipStore) + spaceController := space.ProvideController(db, provider, eventsStreamer, pathUID, authorizer, pathStore, pipelineStore, secretStore, connectorStore, templateStore, spaceStore, repoStore, principalStore, repoController, membershipStore, repository) pipelineController := pipeline.ProvideController(db, pathUID, pathStore, repoStore, authorizer, pipelineStore) encrypter, err := encrypt.ProvideEncrypter(config) if err != nil { diff --git a/internal/api/controller/repo/blame.go b/internal/api/controller/repo/blame.go index 1c217b9bd..b085c4f1c 100644 --- a/internal/api/controller/repo/blame.go +++ b/internal/api/controller/repo/blame.go @@ -9,14 +9,14 @@ import ( "strings" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" "github.com/harness/gitness/types/enum" ) -func (c *Controller) Blame(ctx context.Context, session *auth.Session, +func (c *Controller) Blame(ctx context.Context, + session *auth.Session, repoRef, gitRef, path string, lineFrom, lineTo int, ) (types.Stream[*gitrpc.BlamePart], error) { @@ -29,15 +29,11 @@ func (c *Controller) Blame(ctx context.Context, session *auth.Session, return nil, usererror.BadRequest("Line range must be valid.") } - repo, err := c.repoStore.FindByRef(ctx, repoRef) + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, true); err != nil { - return nil, err - } - if gitRef == "" { gitRef = repo.DefaultBranch } diff --git a/internal/api/controller/repo/commit.go b/internal/api/controller/repo/commit.go index 19be78666..a435cc7db 100644 --- a/internal/api/controller/repo/commit.go +++ b/internal/api/controller/repo/commit.go @@ -11,7 +11,6 @@ import ( "time" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/internal/bootstrap" "github.com/harness/gitness/types/enum" @@ -40,17 +39,16 @@ type CommitFilesResponse struct { CommitID string `json:"commit_id"` } -func (c *Controller) CommitFiles(ctx context.Context, session *auth.Session, - repoRef string, in *CommitFilesOptions) (CommitFilesResponse, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) CommitFiles(ctx context.Context, + session *auth.Session, + repoRef string, + in *CommitFilesOptions, +) (CommitFilesResponse, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoPush, false) if err != nil { return CommitFilesResponse{}, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoPush, false); err != nil { - return CommitFilesResponse{}, err - } - actions := make([]gitrpc.CommitFileAction, len(in.Actions)) for i, action := range in.Actions { var rawPayload []byte diff --git a/internal/api/controller/repo/content_get.go b/internal/api/controller/repo/content_get.go index 5ca0f7d98..117bff5e5 100644 --- a/internal/api/controller/repo/content_get.go +++ b/internal/api/controller/repo/content_get.go @@ -11,7 +11,6 @@ import ( "io" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/controller" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" @@ -89,15 +88,11 @@ func (c *Controller) GetContent(ctx context.Context, repoPath string, includeLatestCommit bool, ) (*GetContentOutput, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, true); err != nil { - return nil, err - } - // set gitRef to default branch in case an empty reference was provided if gitRef == "" { gitRef = repo.DefaultBranch diff --git a/internal/api/controller/repo/content_paths_details.go b/internal/api/controller/repo/content_paths_details.go index b42d9d71b..d7078b2ac 100644 --- a/internal/api/controller/repo/content_paths_details.go +++ b/internal/api/controller/repo/content_paths_details.go @@ -8,7 +8,6 @@ import ( "context" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" @@ -30,21 +29,19 @@ func (c *Controller) PathsDetails(ctx context.Context, gitRef string, input PathsDetailsInput, ) (PathsDetailsOutput, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return PathsDetailsOutput{}, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, true); err != nil { - return PathsDetailsOutput{}, err - } - if len(input.Paths) == 0 { return PathsDetailsOutput{}, nil } - if len(input.Paths) > 50 { - return PathsDetailsOutput{}, usererror.BadRequest("maximum number of elements in the Paths array is 25") + const maxInputPaths = 50 + if len(input.Paths) > maxInputPaths { + return PathsDetailsOutput{}, + usererror.BadRequestf("maximum number of elements in the Paths array is %d", maxInputPaths) } // set gitRef to default branch in case an empty reference was provided diff --git a/internal/api/controller/repo/controller.go b/internal/api/controller/repo/controller.go index 684f11e31..fbcd03dc1 100644 --- a/internal/api/controller/repo/controller.go +++ b/internal/api/controller/repo/controller.go @@ -11,6 +11,8 @@ import ( "strings" "github.com/harness/gitness/gitrpc" + apiauth "github.com/harness/gitness/internal/api/auth" + "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/internal/auth/authz" "github.com/harness/gitness/internal/githook" @@ -19,6 +21,7 @@ import ( "github.com/harness/gitness/internal/url" "github.com/harness/gitness/types" "github.com/harness/gitness/types/check" + "github.com/harness/gitness/types/enum" "github.com/jmoiron/sqlx" ) @@ -68,6 +71,35 @@ func NewController( } } +// getRepoCheckAccess fetches an active repo (not one that is currently being imported) +// and checks if the current user has permission to access it. +func (c *Controller) getRepoCheckAccess( + ctx context.Context, + session *auth.Session, + repoRef string, + reqPermission enum.Permission, + orPublic bool, +) (*types.Repository, error) { + if repoRef == "" { + return nil, usererror.BadRequest("A valid repository reference must be provided.") + } + + repo, err := c.repoStore.FindByRef(ctx, repoRef) + if err != nil { + return nil, fmt.Errorf("failed to find repository: %w", err) + } + + if repo.Importing { + return nil, usererror.BadRequest("Repository import is in progress.") + } + + if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, reqPermission, orPublic); err != nil { + return nil, fmt.Errorf("access check failed: %w", err) + } + + return repo, nil +} + // CreateRPCWriteParams creates base write parameters for gitrpc write operations. // IMPORTANT: session & repo are assumed to be not nil! func CreateRPCWriteParams(ctx context.Context, urlProvider *url.Provider, diff --git a/internal/api/controller/repo/create_branch.go b/internal/api/controller/repo/create_branch.go index 3e78f36f2..a528853b6 100644 --- a/internal/api/controller/repo/create_branch.go +++ b/internal/api/controller/repo/create_branch.go @@ -9,7 +9,6 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" ) @@ -24,17 +23,16 @@ type CreateBranchInput struct { } // CreateBranch creates a new branch for a repo. -func (c *Controller) CreateBranch(ctx context.Context, session *auth.Session, - repoRef string, in *CreateBranchInput) (*Branch, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) CreateBranch(ctx context.Context, + session *auth.Session, + repoRef string, + in *CreateBranchInput, +) (*Branch, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoPush, false) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoPush, false); err != nil { - return nil, err - } - // set target to default branch in case no target was provided if in.Target == "" { in.Target = repo.DefaultBranch diff --git a/internal/api/controller/repo/create_commit_tag.go b/internal/api/controller/repo/create_commit_tag.go index ed474dcba..ad52754cd 100644 --- a/internal/api/controller/repo/create_commit_tag.go +++ b/internal/api/controller/repo/create_commit_tag.go @@ -10,7 +10,6 @@ import ( "time" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" ) @@ -28,17 +27,16 @@ type CreateCommitTagInput struct { } // CreateCommitTag creates a new tag for a repo. -func (c *Controller) CreateCommitTag(ctx context.Context, session *auth.Session, - repoRef string, in *CreateCommitTagInput) (*CommitTag, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) CreateCommitTag(ctx context.Context, + session *auth.Session, + repoRef string, + in *CreateCommitTagInput, +) (*CommitTag, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoPush, false) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoPush, false); err != nil { - return nil, err - } - // set target to default branch in case no branch or commit was provided if in.Target == "" { in.Target = repo.DefaultBranch diff --git a/internal/api/controller/repo/create_path.go b/internal/api/controller/repo/create_path.go index 6fda432aa..f88cd9bc5 100644 --- a/internal/api/controller/repo/create_path.go +++ b/internal/api/controller/repo/create_path.go @@ -10,7 +10,6 @@ import ( "strings" "time" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" @@ -24,17 +23,16 @@ type CreatePathInput struct { } // CreatePath creates a new path for a repo. -func (c *Controller) CreatePath(ctx context.Context, session *auth.Session, - repoRef string, in *CreatePathInput) (*types.Path, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) CreatePath(ctx context.Context, + session *auth.Session, + repoRef string, + in *CreatePathInput, +) (*types.Path, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoEdit, false) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoEdit, false); err != nil { - return nil, err - } - if err = c.sanitizeCreatePathInput(in, repo.Path); err != nil { return nil, fmt.Errorf("failed to sanitize input: %w", err) } diff --git a/internal/api/controller/repo/delete.go b/internal/api/controller/repo/delete.go index 44de47294..483655036 100644 --- a/internal/api/controller/repo/delete.go +++ b/internal/api/controller/repo/delete.go @@ -19,6 +19,7 @@ import ( // Delete deletes a repo. func (c *Controller) Delete(ctx context.Context, session *auth.Session, repoRef string) error { + // note: can't use c.getRepoCheckAccess because import job for repositories being imported must be cancelled. repo, err := c.repoStore.FindByRef(ctx, repoRef) if err != nil { return err @@ -27,9 +28,21 @@ func (c *Controller) Delete(ctx context.Context, session *auth.Session, repoRef if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoDelete, false); err != nil { return err } + + if repo.Importing { + err = c.importer.Cancel(ctx, repo) + if err != nil { + return fmt.Errorf("failed to cancel repository import") + } + + return c.DeleteNoAuth(ctx, session, repo) + } + log.Ctx(ctx).Info().Msgf("Delete request received for repo %s , id: %d", repo.Path, repo.ID) + // TODO: uncomment when soft delete is implemented // return c.DeleteNoAuth(ctx, session, repo) + return nil } diff --git a/internal/api/controller/repo/delete_branch.go b/internal/api/controller/repo/delete_branch.go index c02763940..f57acaede 100644 --- a/internal/api/controller/repo/delete_branch.go +++ b/internal/api/controller/repo/delete_branch.go @@ -9,23 +9,22 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" ) // DeleteBranch deletes a repo branch. -func (c *Controller) DeleteBranch(ctx context.Context, session *auth.Session, repoRef string, branchName string) error { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) DeleteBranch(ctx context.Context, + session *auth.Session, + repoRef string, + branchName string, +) error { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoPush, false) if err != nil { return err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoPush, false); err != nil { - return err - } - // make sure user isn't deleting the default branch // ASSUMPTION: lower layer calls explicit branch api // and 'refs/heads/branch1' would fail if 'branch1' exists. diff --git a/internal/api/controller/repo/delete_path.go b/internal/api/controller/repo/delete_path.go index 288df0806..1f4ca8316 100644 --- a/internal/api/controller/repo/delete_path.go +++ b/internal/api/controller/repo/delete_path.go @@ -8,7 +8,6 @@ import ( "context" "fmt" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/store/database/dbtx" @@ -17,16 +16,16 @@ import ( ) // DeletePath deletes a repo path. -func (c *Controller) DeletePath(ctx context.Context, session *auth.Session, repoRef string, pathID int64) error { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) DeletePath(ctx context.Context, + session *auth.Session, + repoRef string, + pathID int64, +) error { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoEdit, false) if err != nil { return err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoEdit, false); err != nil { - return err - } - err = dbtx.New(c.db).WithTx(ctx, func(ctx context.Context) error { var path *types.Path path, err = c.pathStore.FindWithLock(ctx, pathID) diff --git a/internal/api/controller/repo/delete_tag.go b/internal/api/controller/repo/delete_tag.go index 1029c6ae5..62afaa000 100644 --- a/internal/api/controller/repo/delete_tag.go +++ b/internal/api/controller/repo/delete_tag.go @@ -9,23 +9,21 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" ) // DeleteTag deletes a tag from the repo. -func (c *Controller) DeleteTag(ctx context.Context, session *auth.Session, - repoRef, tagName string) error { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) DeleteTag(ctx context.Context, + session *auth.Session, + repoRef, + tagName string, +) error { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoPush, false) if err != nil { return err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoPush, false); err != nil { - return err - } - writeParams, err := CreateRPCWriteParams(ctx, c.urlProvider, session, repo) if err != nil { return fmt.Errorf("failed to create RPC write params: %w", err) diff --git a/internal/api/controller/repo/diff.go b/internal/api/controller/repo/diff.go index 680cb49ad..c4d6f28a4 100644 --- a/internal/api/controller/repo/diff.go +++ b/internal/api/controller/repo/diff.go @@ -25,15 +25,11 @@ func (c *Controller) RawDiff( path string, w io.Writer, ) error { - repo, err := c.repoStore.FindByRef(ctx, repoRef) + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return err - } - info, err := parseDiffPath(path) if err != nil { return err diff --git a/internal/api/controller/repo/find.go b/internal/api/controller/repo/find.go index 883d52608..f37410ec7 100644 --- a/internal/api/controller/repo/find.go +++ b/internal/api/controller/repo/find.go @@ -15,6 +15,7 @@ import ( // Find finds a repo. func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef string) (*types.Repository, error) { + // note: can't use c.getRepoCheckAccess because even repositories that are currently being imported can be fetched. repo, err := c.repoStore.FindByRef(ctx, repoRef) if err != nil { return nil, err @@ -24,7 +25,7 @@ func (c *Controller) Find(ctx context.Context, session *auth.Session, repoRef st return nil, err } - // backfil clone url + // backfill clone url repo.GitURL = c.urlProvider.GenerateRepoCloneURL(repo.Path) return repo, nil diff --git a/internal/api/controller/repo/get_branch.go b/internal/api/controller/repo/get_branch.go index c8e337d80..dccd1cd7b 100644 --- a/internal/api/controller/repo/get_branch.go +++ b/internal/api/controller/repo/get_branch.go @@ -9,21 +9,19 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" ) // GetBranch gets a repo branch. -func (c *Controller) GetBranch(ctx context.Context, session *auth.Session, - repoRef string, branchName string) (*Branch, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) GetBranch(ctx context.Context, + session *auth.Session, + repoRef string, + branchName string, +) (*Branch, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { - return nil, fmt.Errorf("faild to find repo: %w", err) - } - - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return nil, fmt.Errorf("access check failed: %w", err) + return nil, err } rpcOut, err := c.gitRPCClient.GetBranch(ctx, &gitrpc.GetBranchParams{ diff --git a/internal/api/controller/repo/get_commit.go b/internal/api/controller/repo/get_commit.go index c9019deea..39f2cb872 100644 --- a/internal/api/controller/repo/get_commit.go +++ b/internal/api/controller/repo/get_commit.go @@ -9,7 +9,6 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/controller" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" @@ -17,15 +16,14 @@ import ( ) // GetCommit gets a repo commit. -func (c *Controller) GetCommit(ctx context.Context, session *auth.Session, - repoRef string, sha string) (*types.Commit, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) GetCommit(ctx context.Context, + session *auth.Session, + repoRef string, + sha string, +) (*types.Commit, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { - return nil, fmt.Errorf("faild to find repo: %w", err) - } - - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return nil, fmt.Errorf("access check failed: %w", err) + return nil, err } rpcOut, err := c.gitRPCClient.GetCommit(ctx, &gitrpc.GetCommitParams{ diff --git a/internal/api/controller/repo/get_commit_divergences.go b/internal/api/controller/repo/get_commit_divergences.go index 62925273a..b7b1ab284 100644 --- a/internal/api/controller/repo/get_commit_divergences.go +++ b/internal/api/controller/repo/get_commit_divergences.go @@ -8,7 +8,6 @@ import ( "context" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/request" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" @@ -39,20 +38,17 @@ type CommitDivergence struct { Behind int32 `json:"behind"` } -/* -* GetCommitDivergences returns the commit divergences between reference pairs. - */ -func (c *Controller) GetCommitDivergences(ctx context.Context, session *auth.Session, - repoRef string, in *GetCommitDivergencesInput) ([]CommitDivergence, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +// GetCommitDivergences returns the commit divergences between reference pairs. +func (c *Controller) GetCommitDivergences(ctx context.Context, + session *auth.Session, + repoRef string, + in *GetCommitDivergencesInput, +) ([]CommitDivergence, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return nil, err - } - // if no requests were provided return an empty list if in == nil || len(in.Requests) == 0 { return []CommitDivergence{}, nil diff --git a/internal/api/controller/repo/import.go b/internal/api/controller/repo/import.go index 72a710ad1..cdad3bfde 100644 --- a/internal/api/controller/repo/import.go +++ b/internal/api/controller/repo/import.go @@ -7,13 +7,9 @@ package repo import ( "context" "fmt" - "time" - "github.com/harness/gitness/gitrpc" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" - "github.com/harness/gitness/internal/bootstrap" - "github.com/harness/gitness/internal/githook" "github.com/harness/gitness/internal/paths" "github.com/harness/gitness/internal/services/importer" "github.com/harness/gitness/internal/services/job" @@ -25,16 +21,12 @@ import ( ) type ImportInput struct { - ParentRef string `json:"parent_ref"` - UID string `json:"uid"` - - Provider importer.ProviderType `json:"provider"` - ProviderURL string `json:"provider_url"` - RepoSlug string `json:"repo_slug"` - Username string `json:"username"` - Password string `json:"password"` - + ParentRef string `json:"parent_ref"` + UID string `json:"uid"` Description string `json:"description"` + + Provider importer.Provider `json:"provider"` + ProviderRepo string `json:"provider_repo"` } // Import creates a new empty repository and starts git import to it from a remote repository. @@ -49,14 +41,7 @@ func (c *Controller) Import(ctx context.Context, session *auth.Session, in *Impo return nil, fmt.Errorf("failed to sanitize input: %w", err) } - providerInfo := importer.ProviderInfo{ - Type: in.Provider, - Host: in.ProviderURL, - User: in.Username, - Pass: in.Password, - } - - repoInfo, err := importer.Repo(ctx, providerInfo, in.RepoSlug) + remoteRepository, err := importer.LoadRepositoryFromProvider(ctx, in.Provider, in.ProviderRepo) if err != nil { return nil, err } @@ -66,29 +51,7 @@ func (c *Controller) Import(ctx context.Context, session *auth.Session, in *Impo return nil, fmt.Errorf("error creating job UID: %w", err) } - gitRPCResp, err := c.createEmptyGitRepository(ctx, session) - if err != nil { - return nil, fmt.Errorf("error creating repository on GitRPC: %w", err) - } - - now := time.Now().UnixMilli() - repo := &types.Repository{ - Version: 0, - ParentID: parentSpace.ID, - UID: in.UID, - GitUID: gitRPCResp.UID, - Path: "", // the path is set in the DB transaction below - Description: in.Description, - IsPublic: repoInfo.IsPublic, - CreatedBy: session.Principal.ID, - Created: now, - Updated: now, - ForkID: 0, - DefaultBranch: repoInfo.DefaultBranch, - Importing: true, - ImportingJobUID: &jobUID, - } - + var repo *types.Repository err = dbtx.New(c.db).WithTx(ctx, func(ctx context.Context) error { // lock parent space path to ensure it doesn't get updated while we setup new repo spacePath, err := c.pathStore.FindPrimaryWithLock(ctx, enum.PathTargetTypeSpace, parentSpace.ID) @@ -96,7 +59,8 @@ func (c *Controller) Import(ctx context.Context, session *auth.Session, in *Impo return usererror.BadRequest("Parent not found'") } - repo.Path = paths.Concatinate(spacePath.Value, in.UID) + pathToRepo := paths.Concatinate(spacePath.Value, in.UID) + repo = remoteRepository.ToRepo(parentSpace.ID, pathToRepo, in.UID, in.Description, jobUID, &session.Principal) err = c.repoStore.Create(ctx, repo) if err != nil { @@ -122,19 +86,10 @@ func (c *Controller) Import(ctx context.Context, session *auth.Session, in *Impo return nil }) if err != nil { - if err := c.DeleteRepositoryRPC(ctx, session, repo); err != nil { - log.Ctx(ctx).Warn().Err(err).Msg("gitrpc failed to delete repo for cleanup") - } - return nil, err } - err = c.importer.Run(ctx, jobUID, importer.Input{ - RepoID: repo.ID, - GitUser: in.Username, - GitPass: in.Password, - CloneURL: repoInfo.CloneURL, - }) + err = c.importer.Run(ctx, in.Provider, repo, remoteRepository.CloneURL) if err != nil { log.Ctx(ctx).Err(err).Msg("failed to start import repository job") } @@ -153,50 +108,5 @@ func (c *Controller) sanitizeImportInput(in *ImportInput) error { return err } - if in.Provider == "" { - return usererror.BadRequest("provider must be provided") - } - - if in.RepoSlug == "" { - return usererror.BadRequest("repo slug must be provided") - } - return nil } - -func (c *Controller) createEmptyGitRepository( - ctx context.Context, - session *auth.Session, -) (*gitrpc.CreateRepositoryOutput, error) { - // generate envars (add everything githook CLI needs for execution) - envVars, err := githook.GenerateEnvironmentVariables( - ctx, - c.urlProvider.GetAPIBaseURLInternal(), - 0, - session.Principal.ID, - true, - ) - if err != nil { - return nil, fmt.Errorf("failed to generate git hook environment variables: %w", err) - } - - actor := rpcIdentityFromPrincipal(session.Principal) - committer := rpcIdentityFromPrincipal(bootstrap.NewSystemServiceSession().Principal) - now := time.Now() - - resp, err := c.gitRPCClient.CreateRepository(ctx, &gitrpc.CreateRepositoryParams{ - Actor: *actor, - EnvVars: envVars, - DefaultBranch: c.defaultBranch, - Files: nil, - Author: actor, - AuthorDate: &now, - Committer: committer, - CommitterDate: &now, - }) - if err != nil { - return nil, fmt.Errorf("failed to create repo on gitrpc: %w", err) - } - - return resp, nil -} diff --git a/internal/api/controller/repo/import_cancel.go b/internal/api/controller/repo/import_cancel.go new file mode 100644 index 000000000..99dd8e333 --- /dev/null +++ b/internal/api/controller/repo/import_cancel.go @@ -0,0 +1,41 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package repo + +import ( + "context" + "fmt" + + apiauth "github.com/harness/gitness/internal/api/auth" + "github.com/harness/gitness/internal/api/usererror" + "github.com/harness/gitness/internal/auth" + "github.com/harness/gitness/types/enum" +) + +// ImportCancel cancels a repository import. +func (c *Controller) ImportCancel(ctx context.Context, + session *auth.Session, + repoRef string, +) error { + // note: can't use c.getRepoCheckAccess because this needs to fetch a repo being imported. + repo, err := c.repoStore.FindByRef(ctx, repoRef) + if err != nil { + return err + } + + if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoDelete, false); err != nil { + return err + } + + if !repo.Importing { + return usererror.BadRequest("repository is not being imported") + } + + if err = c.importer.Cancel(ctx, repo); err != nil { + return fmt.Errorf("failed to cancel repository import") + } + + return c.DeleteNoAuth(ctx, session, repo) +} diff --git a/internal/api/controller/repo/import_progress.go b/internal/api/controller/repo/import_progress.go index 72564f88c..8b7cf03fa 100644 --- a/internal/api/controller/repo/import_progress.go +++ b/internal/api/controller/repo/import_progress.go @@ -18,6 +18,7 @@ func (c *Controller) ImportProgress(ctx context.Context, session *auth.Session, repoRef string, ) (types.JobProgress, error) { + // note: can't use c.getRepoCheckAccess because this needs to fetch a repo being imported. repo, err := c.repoStore.FindByRef(ctx, repoRef) if err != nil { return types.JobProgress{}, err diff --git a/internal/api/controller/repo/list_branches.go b/internal/api/controller/repo/list_branches.go index d94421206..4994bb86d 100644 --- a/internal/api/controller/repo/list_branches.go +++ b/internal/api/controller/repo/list_branches.go @@ -9,7 +9,6 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/controller" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" @@ -22,20 +21,18 @@ type Branch struct { Commit *types.Commit `json:"commit,omitempty"` } -/* -* ListBranches lists the branches of a repo. - */ -func (c *Controller) ListBranches(ctx context.Context, session *auth.Session, - repoRef string, includeCommit bool, filter *types.BranchFilter) ([]Branch, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +// ListBranches lists the branches of a repo. +func (c *Controller) ListBranches(ctx context.Context, + session *auth.Session, + repoRef string, + includeCommit bool, + filter *types.BranchFilter, +) ([]Branch, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return nil, err - } - rpcOut, err := c.gitRPCClient.ListBranches(ctx, &gitrpc.ListBranchesParams{ ReadParams: CreateRPCReadParams(repo), IncludeCommit: includeCommit, diff --git a/internal/api/controller/repo/list_commit_tags.go b/internal/api/controller/repo/list_commit_tags.go index 9b1b44d14..04944f333 100644 --- a/internal/api/controller/repo/list_commit_tags.go +++ b/internal/api/controller/repo/list_commit_tags.go @@ -9,7 +9,6 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/controller" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" @@ -26,20 +25,18 @@ type CommitTag struct { Commit *types.Commit `json:"commit,omitempty"` } -/* -* ListCommitTags lists the commit tags of a repo. - */ -func (c *Controller) ListCommitTags(ctx context.Context, session *auth.Session, - repoRef string, includeCommit bool, filter *types.TagFilter) ([]CommitTag, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +// ListCommitTags lists the commit tags of a repo. +func (c *Controller) ListCommitTags(ctx context.Context, + session *auth.Session, + repoRef string, + includeCommit bool, + filter *types.TagFilter, +) ([]CommitTag, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return nil, err - } - rpcOut, err := c.gitRPCClient.ListCommitTags(ctx, &gitrpc.ListCommitTagsParams{ ReadParams: CreateRPCReadParams(repo), IncludeCommit: includeCommit, diff --git a/internal/api/controller/repo/list_commits.go b/internal/api/controller/repo/list_commits.go index d4994034c..6539b005c 100644 --- a/internal/api/controller/repo/list_commits.go +++ b/internal/api/controller/repo/list_commits.go @@ -9,27 +9,24 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/controller" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" "github.com/harness/gitness/types/enum" ) -/* -* ListCommits lists the commits of a repo. - */ -func (c *Controller) ListCommits(ctx context.Context, session *auth.Session, - repoRef string, gitRef string, filter *types.CommitFilter) (types.ListCommitResponse, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +// ListCommits lists the commits of a repo. +func (c *Controller) ListCommits(ctx context.Context, + session *auth.Session, + repoRef string, + gitRef string, + filter *types.CommitFilter, +) (types.ListCommitResponse, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return types.ListCommitResponse{}, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return types.ListCommitResponse{}, err - } - // set gitRef to default branch in case an empty reference was provided if gitRef == "" { gitRef = repo.DefaultBranch diff --git a/internal/api/controller/repo/list_paths.go b/internal/api/controller/repo/list_paths.go index 94e637888..2b26e4abb 100644 --- a/internal/api/controller/repo/list_paths.go +++ b/internal/api/controller/repo/list_paths.go @@ -8,27 +8,23 @@ import ( "context" "fmt" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/store/database/dbtx" "github.com/harness/gitness/types" "github.com/harness/gitness/types/enum" ) -/* -* ListPaths lists all paths of a repo. - */ -func (c *Controller) ListPaths(ctx context.Context, session *auth.Session, - repoRef string, filter *types.PathFilter) ([]*types.Path, int64, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +// ListPaths lists all paths of a repo. +func (c *Controller) ListPaths(ctx context.Context, + session *auth.Session, + repoRef string, + filter *types.PathFilter, +) ([]*types.Path, int64, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return nil, 0, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return nil, 0, err - } - var ( paths []*types.Path count int64 diff --git a/internal/api/controller/repo/list_pipelines.go b/internal/api/controller/repo/list_pipelines.go index ae5e0dda5..0ae83f71a 100644 --- a/internal/api/controller/repo/list_pipelines.go +++ b/internal/api/controller/repo/list_pipelines.go @@ -1,13 +1,13 @@ // Copyright 2022 Harness Inc. All rights reserved. // Use of this source code is governed by the Polyform Free Trial License // that can be found in the LICENSE.md file for this repository. + package repo import ( "context" "fmt" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/store/database/dbtx" "github.com/harness/gitness/types" @@ -22,14 +22,9 @@ func (c *Controller) ListPipelines( latest bool, filter types.ListQueryFilter, ) ([]*types.Pipeline, int64, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { - return nil, 0, fmt.Errorf("failed to find repo: %w", err) - } - - err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionPipelineView, false) - if err != nil { - return nil, 0, fmt.Errorf("failed to authorize: %w", err) + return nil, 0, err } var count int64 diff --git a/internal/api/controller/repo/list_service_accounts.go b/internal/api/controller/repo/list_service_accounts.go index b19a61f68..2353b185b 100644 --- a/internal/api/controller/repo/list_service_accounts.go +++ b/internal/api/controller/repo/list_service_accounts.go @@ -7,23 +7,19 @@ package repo import ( "context" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" "github.com/harness/gitness/types/enum" ) -/* -* ListServiceAccounts lists the service accounts of a repo. - */ -func (c *Controller) ListServiceAccounts(ctx context.Context, session *auth.Session, - repoRef string) ([]*types.ServiceAccount, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) - if err != nil { - return nil, err - } +// ListServiceAccounts lists the service accounts of a repo. - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { +func (c *Controller) ListServiceAccounts(ctx context.Context, + session *auth.Session, + repoRef string, +) ([]*types.ServiceAccount, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, false) + if err != nil { return nil, err } diff --git a/internal/api/controller/repo/merge_check.go b/internal/api/controller/repo/merge_check.go index 9e3e2a983..89ebc9c87 100644 --- a/internal/api/controller/repo/merge_check.go +++ b/internal/api/controller/repo/merge_check.go @@ -9,7 +9,6 @@ import ( "fmt" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" ) @@ -25,15 +24,11 @@ func (c *Controller) MergeCheck( repoRef string, diffPath string, ) (MergeCheck, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, false) if err != nil { return MergeCheck{}, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, false); err != nil { - return MergeCheck{}, fmt.Errorf("access check failed: %w", err) - } - info, err := parseDiffPath(diffPath) if err != nil { return MergeCheck{}, err diff --git a/internal/api/controller/repo/move.go b/internal/api/controller/repo/move.go index f0cdf8bf2..e4edbcfa8 100644 --- a/internal/api/controller/repo/move.go +++ b/internal/api/controller/repo/move.go @@ -7,6 +7,7 @@ package repo import ( "context" "fmt" + "github.com/harness/gitness/internal/api/usererror" "strconv" "strings" "time" @@ -55,13 +56,20 @@ func (i *MoveInput) hasChanges(repo *types.Repository) bool { // Move moves a repository to a new space and/or uid. // //nolint:gocognit // refactor if needed -func (c *Controller) Move(ctx context.Context, session *auth.Session, - repoRef string, in *MoveInput) (*types.Repository, error) { +func (c *Controller) Move(ctx context.Context, + session *auth.Session, + repoRef string, + in *MoveInput, +) (*types.Repository, error) { repo, err := c.repoStore.FindByRef(ctx, repoRef) if err != nil { return nil, err } + if repo.Importing { + return nil, usererror.BadRequest("can't move a repo that is being imported") + } + permission := enum.PermissionRepoEdit var inParentSpaceID *int64 if in.ParentRef != nil { diff --git a/internal/api/controller/repo/raw.go b/internal/api/controller/repo/raw.go index 684d6dd55..26fa50e9b 100644 --- a/internal/api/controller/repo/raw.go +++ b/internal/api/controller/repo/raw.go @@ -10,27 +10,24 @@ import ( "io" "github.com/harness/gitness/gitrpc" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types/enum" ) -/* - * Raw finds the file of the repo at the given path and returns its raw content. - * If no gitRef is provided, the content is retrieved from the default branch. - */ -func (c *Controller) Raw(ctx context.Context, session *auth.Session, repoRef string, - gitRef string, repoPath string) (io.Reader, int64, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +// Raw finds the file of the repo at the given path and returns its raw content. +// If no gitRef is provided, the content is retrieved from the default branch. +func (c *Controller) Raw(ctx context.Context, + session *auth.Session, + repoRef string, + gitRef string, + repoPath string, +) (io.Reader, int64, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoView, true) if err != nil { return nil, 0, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoView, true); err != nil { - return nil, 0, err - } - // set gitRef to default branch in case an empty reference was provided if gitRef == "" { gitRef = repo.DefaultBranch diff --git a/internal/api/controller/repo/update.go b/internal/api/controller/repo/update.go index d7a2f70a8..7550cc19b 100644 --- a/internal/api/controller/repo/update.go +++ b/internal/api/controller/repo/update.go @@ -9,7 +9,6 @@ import ( "fmt" "strings" - apiauth "github.com/harness/gitness/internal/api/auth" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/types" "github.com/harness/gitness/types/check" @@ -28,17 +27,16 @@ func (in *UpdateInput) hasChanges(repo *types.Repository) bool { } // Update updates a repository. -func (c *Controller) Update(ctx context.Context, session *auth.Session, - repoRef string, in *UpdateInput) (*types.Repository, error) { - repo, err := c.repoStore.FindByRef(ctx, repoRef) +func (c *Controller) Update(ctx context.Context, + session *auth.Session, + repoRef string, + in *UpdateInput, +) (*types.Repository, error) { + repo, err := c.getRepoCheckAccess(ctx, session, repoRef, enum.PermissionRepoEdit, false) if err != nil { return nil, err } - if err = apiauth.CheckRepo(ctx, c.authorizer, session, repo, enum.PermissionRepoEdit, false); err != nil { - return nil, err - } - if !in.hasChanges(repo) { return repo, nil } diff --git a/internal/api/controller/space/controller.go b/internal/api/controller/space/controller.go index 6b35a95fe..a609cdcdb 100644 --- a/internal/api/controller/space/controller.go +++ b/internal/api/controller/space/controller.go @@ -8,6 +8,7 @@ import ( "github.com/harness/gitness/internal/api/controller/repo" "github.com/harness/gitness/internal/auth/authz" "github.com/harness/gitness/internal/pipeline/events" + "github.com/harness/gitness/internal/services/importer" "github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/url" "github.com/harness/gitness/types/check" @@ -31,6 +32,7 @@ type Controller struct { principalStore store.PrincipalStore repoCtrl *repo.Controller membershipStore store.MembershipStore + importer *importer.Repository } func NewController(db *sqlx.DB, urlProvider *url.Provider, eventsStream events.EventsStreamer, @@ -38,7 +40,7 @@ func NewController(db *sqlx.DB, urlProvider *url.Provider, eventsStream events.E pathStore store.PathStore, pipelineStore store.PipelineStore, secretStore store.SecretStore, connectorStore store.ConnectorStore, templateStore store.TemplateStore, spaceStore store.SpaceStore, repoStore store.RepoStore, principalStore store.PrincipalStore, repoCtrl *repo.Controller, - membershipStore store.MembershipStore, + membershipStore store.MembershipStore, importer *importer.Repository, ) *Controller { return &Controller{ db: db, @@ -56,5 +58,6 @@ func NewController(db *sqlx.DB, urlProvider *url.Provider, eventsStream events.E principalStore: principalStore, repoCtrl: repoCtrl, membershipStore: membershipStore, + importer: importer, } } diff --git a/internal/api/controller/space/import.go b/internal/api/controller/space/import.go new file mode 100644 index 000000000..7d23c85fa --- /dev/null +++ b/internal/api/controller/space/import.go @@ -0,0 +1,180 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package space + +import ( + "context" + "fmt" + "github.com/harness/gitness/types/check" + "github.com/rs/zerolog/log" + "strconv" + "strings" + "time" + + "github.com/harness/gitness/internal/api/usererror" + "github.com/harness/gitness/internal/auth" + "github.com/harness/gitness/internal/bootstrap" + "github.com/harness/gitness/internal/paths" + "github.com/harness/gitness/internal/services/importer" + "github.com/harness/gitness/internal/services/job" + "github.com/harness/gitness/store/database/dbtx" + "github.com/harness/gitness/types" + "github.com/harness/gitness/types/enum" +) + +type ImportInput struct { + CreateInput + Provider importer.Provider `json:"provider"` + ProviderSpace string `json:"provider_space"` +} + +// Import creates new space and starts import of all repositories from the remote provider's space into it. +func (c *Controller) Import(ctx context.Context, session *auth.Session, in *ImportInput) (*types.Space, error) { + parentSpace, err := c.getSpaceCheckAuthSpaceCreation(ctx, session, in.ParentRef) + if err != nil { + return nil, err + } + + if in.UID == "" { + in.UID = in.ProviderSpace + } + + err = c.sanitizeCreateInput(&in.CreateInput) + if err != nil { + return nil, fmt.Errorf("failed to sanitize input: %w", err) + } + + remoteRepositories, err := importer.LoadRepositoriesFromProviderSpace(ctx, in.Provider, in.ProviderSpace) + if err != nil { + return nil, err + } + + localRepositories := make([]*types.Repository, len(remoteRepositories)) + cloneURLs := make([]string, len(remoteRepositories)) + + var space *types.Space + err = dbtx.New(c.db).WithTx(ctx, func(ctx context.Context) error { + spacePath := in.UID + parentSpaceID := int64(0) + if parentSpace != nil { + parentSpaceID = parentSpace.ID + // lock parent space path to ensure it doesn't get updated while we setup new space + parentPath, err := c.pathStore.FindPrimaryWithLock(ctx, enum.PathTargetTypeSpace, parentSpaceID) + if err != nil { + return usererror.BadRequest("Parent not found") + } + spacePath = paths.Concatinate(parentPath.Value, in.UID) + + // ensure path is within accepted depth! + err = check.PathDepth(spacePath, true) + if err != nil { + return fmt.Errorf("path is invalid: %w", err) + } + } + + now := time.Now().UnixMilli() + space = &types.Space{ + Version: 0, + ParentID: parentSpaceID, + UID: in.UID, + Path: spacePath, + Description: in.Description, + IsPublic: in.IsPublic, + CreatedBy: session.Principal.ID, + Created: now, + Updated: now, + } + err = c.spaceStore.Create(ctx, space) + if err != nil { + return fmt.Errorf("space creation failed: %w", err) + } + + path := &types.Path{ + Version: 0, + Value: space.Path, + IsPrimary: true, + TargetType: enum.PathTargetTypeSpace, + TargetID: space.ID, + CreatedBy: space.CreatedBy, + Created: now, + Updated: now, + } + err = c.pathStore.Create(ctx, path) + if err != nil { + return fmt.Errorf("failed to create path: %w", err) + } + + // add space membership to top level space only (as the user doesn't have inherited permissions already) + parentRefAsID, err := strconv.ParseInt(in.ParentRef, 10, 64) + if (err == nil && parentRefAsID == 0) || (len(strings.TrimSpace(in.ParentRef)) == 0) { + membership := &types.Membership{ + MembershipKey: types.MembershipKey{ + SpaceID: space.ID, + PrincipalID: session.Principal.ID, + }, + Role: enum.MembershipRoleSpaceOwner, + + // membership has been created by the system + CreatedBy: bootstrap.NewSystemServiceSession().Principal.ID, + Created: now, + Updated: now, + } + err = c.membershipStore.Create(ctx, membership) + if err != nil { + return fmt.Errorf("failed to make user owner of the space: %w", err) + } + } + + for i, remoteRepository := range remoteRepositories { + var jobUID string + + jobUID, err = job.UID() + if err != nil { + return fmt.Errorf("error creating job UID: %w", err) + } + + pathToRepo := paths.Concatinate(path.Value, remoteRepository.UID) + repo := remoteRepository.ToRepo( + space.ID, pathToRepo, remoteRepository.UID, "", jobUID, &session.Principal) + + err = c.repoStore.Create(ctx, repo) + if err != nil { + return fmt.Errorf("failed to create repository in storage: %w", err) + } + + repoPath := &types.Path{ + Version: 0, + Value: repo.Path, + IsPrimary: true, + TargetType: enum.PathTargetTypeRepo, + TargetID: repo.ID, + CreatedBy: repo.CreatedBy, + Created: repo.Created, + Updated: repo.Updated, + } + + err = c.pathStore.Create(ctx, repoPath) + if err != nil { + return fmt.Errorf("failed to create path: %w", err) + } + + localRepositories[i] = repo + cloneURLs[i] = remoteRepository.CloneURL + } + + return nil + }) + if err != nil { + return nil, err + } + + jobGroupID := fmt.Sprintf("space-import-%d", space.ID) + err = c.importer.RunMany(ctx, jobGroupID, in.Provider, localRepositories, cloneURLs) + if err != nil { + log.Ctx(ctx).Err(err).Msg("failed to start import repository job") + } + + return space, nil +} diff --git a/internal/api/controller/space/wire.go b/internal/api/controller/space/wire.go index ea39967a2..a9b8b42d2 100644 --- a/internal/api/controller/space/wire.go +++ b/internal/api/controller/space/wire.go @@ -8,6 +8,7 @@ import ( "github.com/harness/gitness/internal/api/controller/repo" "github.com/harness/gitness/internal/auth/authz" "github.com/harness/gitness/internal/pipeline/events" + "github.com/harness/gitness/internal/services/importer" "github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/url" "github.com/harness/gitness/types/check" @@ -26,9 +27,11 @@ func ProvideController(db *sqlx.DB, urlProvider *url.Provider, eventsStream even pipelineStore store.PipelineStore, secretStore store.SecretStore, connectorStore store.ConnectorStore, templateStore store.TemplateStore, spaceStore store.SpaceStore, repoStore store.RepoStore, principalStore store.PrincipalStore, - repoCtrl *repo.Controller, membershipStore store.MembershipStore, + repoCtrl *repo.Controller, membershipStore store.MembershipStore, importer *importer.Repository, ) *Controller { return NewController(db, urlProvider, eventsStream, uidCheck, authorizer, - pathStore, pipelineStore, secretStore, connectorStore, templateStore, - spaceStore, repoStore, principalStore, repoCtrl, membershipStore) + pathStore, pipelineStore, secretStore, + connectorStore, templateStore, + spaceStore, repoStore, principalStore, + repoCtrl, membershipStore, importer) } diff --git a/internal/api/handler/repo/import_cancel.go b/internal/api/handler/repo/import_cancel.go new file mode 100644 index 000000000..ab0c8fb8b --- /dev/null +++ b/internal/api/handler/repo/import_cancel.go @@ -0,0 +1,33 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package repo + +import ( + "net/http" + + "github.com/harness/gitness/internal/api/controller/repo" + "github.com/harness/gitness/internal/api/render" + "github.com/harness/gitness/internal/api/request" +) + +func HandleImportCancel(repoCtrl *repo.Controller) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + session, _ := request.AuthSessionFrom(ctx) + repoRef, err := request.GetRepoRefFromPath(r) + if err != nil { + render.TranslatedUserError(w, err) + return + } + + err = repoCtrl.ImportCancel(ctx, session, repoRef) + if err != nil { + render.TranslatedUserError(w, err) + return + } + + render.DeleteSuccessful(w) + } +} diff --git a/internal/api/handler/space/import.go b/internal/api/handler/space/import.go new file mode 100644 index 000000000..f320fdcab --- /dev/null +++ b/internal/api/handler/space/import.go @@ -0,0 +1,36 @@ +// Copyright 2022 Harness Inc. All rights reserved. +// Use of this source code is governed by the Polyform Free Trial License +// that can be found in the LICENSE.md file for this repository. + +package space + +import ( + "encoding/json" + "net/http" + + "github.com/harness/gitness/internal/api/controller/space" + "github.com/harness/gitness/internal/api/render" + "github.com/harness/gitness/internal/api/request" +) + +func HandleImport(spaceCtrl *space.Controller) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + session, _ := request.AuthSessionFrom(ctx) + + in := new(space.ImportInput) + err := json.NewDecoder(r.Body).Decode(in) + if err != nil { + render.BadRequestf(w, "Invalid Request Body: %s.", err) + return + } + + space, err := spaceCtrl.Import(ctx, session, in) + if err != nil { + render.TranslatedUserError(w, err) + return + } + + render.JSON(w, http.StatusCreated, space) + } +} diff --git a/internal/router/api.go b/internal/router/api.go index c987315a3..d2fa4762f 100644 --- a/internal/router/api.go +++ b/internal/router/api.go @@ -181,6 +181,7 @@ func setupSpaces(r chi.Router, spaceCtrl *space.Controller) { r.Route("/spaces", func(r chi.Router) { // Create takes path and parentId via body, not uri r.Post("/", handlerspace.HandleCreate(spaceCtrl)) + r.Post("/import", handlerspace.HandleImport(spaceCtrl)) r.Route(fmt.Sprintf("/{%s}", request.PathParamSpaceRef), func(r chi.Router) { // space operations diff --git a/internal/services/importer/provider.go b/internal/services/importer/provider.go index ecfce9668..0665e1be2 100644 --- a/internal/services/importer/provider.go +++ b/internal/services/importer/provider.go @@ -9,25 +9,40 @@ import ( "errors" "fmt" "net/http" + "time" "github.com/harness/gitness/internal/api/usererror" + "github.com/harness/gitness/types" "github.com/drone/go-scm/scm" "github.com/drone/go-scm/scm/driver/github" + "github.com/drone/go-scm/scm/driver/gitlab" "github.com/drone/go-scm/scm/transport/oauth2" ) type ProviderType string const ( - ProviderTypeGitHub ProviderType = "github" + ProviderTypeGitHub ProviderType = "github" + ProviderTypeGitHubEnterprise ProviderType = "github-enterprise" + ProviderTypeGitLab ProviderType = "gitlab" + ProviderTypeGitLabEnterprise ProviderType = "gitlab-enterprise" ) -type ProviderInfo struct { - Type ProviderType - Host string - User string - Pass string +type Provider struct { + Type ProviderType `json:"type"` + Host string `json:"host"` + Username string `json:"username"` + Password string `json:"password"` +} + +func (p Provider) Enum() []any { + return []any{ + ProviderTypeGitHub, + ProviderTypeGitHubEnterprise, + ProviderTypeGitLab, + ProviderTypeGitLabEnterprise, + } } type RepositoryInfo struct { @@ -38,42 +53,120 @@ type RepositoryInfo struct { DefaultBranch string } -func getClient(provider ProviderInfo) (*scm.Client, error) { - var scmClient *scm.Client +// ToRepo converts the RepositoryInfo into the types.Repository object marked as being imported. +func (r *RepositoryInfo) ToRepo( + spaceID int64, + path string, + uid string, + description string, + jobUID string, + principal *types.Principal, +) *types.Repository { + now := time.Now().UnixMilli() + gitTempUID := "importing-" + jobUID + return &types.Repository{ + Version: 0, + ParentID: spaceID, + UID: uid, + GitUID: gitTempUID, // the correct git UID will be set by the job handler + Path: path, + Description: description, + IsPublic: r.IsPublic, + CreatedBy: principal.ID, + Created: now, + Updated: now, + ForkID: 0, + DefaultBranch: r.DefaultBranch, + Importing: true, + ImportingJobUID: &jobUID, + } +} +func getClient(provider Provider) (*scm.Client, error) { switch provider.Type { case "": return nil, usererror.BadRequest("provider can not be empty") + case ProviderTypeGitHub: - scmClient = github.NewDefault() - if provider.Pass != "" { - scmClient.Client = &http.Client{ + c := github.NewDefault() + if provider.Password != "" { + c.Client = &http.Client{ Transport: &oauth2.Transport{ - Source: oauth2.StaticTokenSource(&scm.Token{Token: provider.Pass}), + Source: oauth2.StaticTokenSource(&scm.Token{Token: provider.Password}), }, } } + return c, nil + + case ProviderTypeGitHubEnterprise: + c, err := github.New(provider.Host) + if err != nil { + return nil, usererror.BadRequestf("provider Host invalid: %s", err.Error()) + } + + if provider.Password != "" { + c.Client = &http.Client{ + Transport: &oauth2.Transport{ + Source: oauth2.StaticTokenSource(&scm.Token{Token: provider.Password}), + }, + } + } + return c, nil + + case ProviderTypeGitLab: + c := gitlab.NewDefault() + if provider.Password != "" { + c.Client = &http.Client{ + Transport: &oauth2.Transport{ + Source: oauth2.StaticTokenSource(&scm.Token{Token: provider.Password}), + }, + } + } + + return c, nil + + case ProviderTypeGitLabEnterprise: + c, err := gitlab.New(provider.Host) + if err != nil { + return nil, usererror.BadRequestf("provider Host invalid: %s", err.Error()) + } + + if provider.Password != "" { + c.Client = &http.Client{ + Transport: &oauth2.Transport{ + Source: oauth2.StaticTokenSource(&scm.Token{Token: provider.Password}), + }, + } + } + + return c, nil + default: return nil, usererror.BadRequestf("unsupported provider: %s", provider) } - - return scmClient, nil } -func Repo(ctx context.Context, provider ProviderInfo, repoSlug string) (RepositoryInfo, error) { +func LoadRepositoryFromProvider(ctx context.Context, provider Provider, repoSlug string) (RepositoryInfo, error) { scmClient, err := getClient(provider) if err != nil { return RepositoryInfo{}, err } + if repoSlug == "" { + return RepositoryInfo{}, usererror.BadRequest("provider repository identifier is missing") + } + scmRepo, _, err := scmClient.Repositories.Find(ctx, repoSlug) if errors.Is(err, scm.ErrNotFound) { - return RepositoryInfo{}, usererror.BadRequestf("repository %s not found at %s", repoSlug, provider) + return RepositoryInfo{}, + usererror.BadRequestf("repository %s not found at %s", repoSlug, provider.Type) } if errors.Is(err, scm.ErrNotAuthorized) { - return RepositoryInfo{}, usererror.BadRequestf("bad credentials provided for %s at %s", repoSlug, provider) + return RepositoryInfo{}, + usererror.BadRequestf("bad credentials provided for %s at %s", repoSlug, provider.Type) } if err != nil { - return RepositoryInfo{}, fmt.Errorf("failed to fetch repository %s from %s: %w", repoSlug, provider, err) + return RepositoryInfo{}, + fmt.Errorf("failed to fetch repository %s from %s: %w", repoSlug, provider.Type, err) } return RepositoryInfo{ @@ -85,13 +178,17 @@ func Repo(ctx context.Context, provider ProviderInfo, repoSlug string) (Reposito }, nil } -func Space(ctx context.Context, provider ProviderInfo, space string) (map[string]RepositoryInfo, error) { +func LoadRepositoriesFromProviderSpace(ctx context.Context, provider Provider, spaceSlug string) ([]RepositoryInfo, error) { scmClient, err := getClient(provider) if err != nil { return nil, err } - repoMap := make(map[string]RepositoryInfo) + if spaceSlug == "" { + return nil, usererror.BadRequest("provider space identifier is missing") + } + + repos := make([]RepositoryInfo, 0) const pageSize = 50 page := 1 @@ -104,17 +201,17 @@ func Space(ctx context.Context, provider ProviderInfo, space string) (map[string }, RepoSearchTerm: scm.RepoSearchTerm{ RepoName: "", - User: space, + User: spaceSlug, }, }) if errors.Is(err, scm.ErrNotFound) { - return nil, usererror.BadRequestf("space %s not found at %s", space, provider) + return nil, usererror.BadRequestf("space %s not found at %s", spaceSlug, provider.Type) } if errors.Is(err, scm.ErrNotAuthorized) { - return nil, usererror.BadRequestf("bad credentials provided for %s at %s", space, provider) + return nil, usererror.BadRequestf("bad credentials provided for %s at %s", spaceSlug, provider.Type) } if err != nil { - return nil, fmt.Errorf("failed to fetch space %s from %s: %w", space, provider, err) + return nil, fmt.Errorf("failed to fetch space %s from %s: %w", spaceSlug, provider.Type, err) } for _, scmRepo := range scmRepos { @@ -122,13 +219,13 @@ func Space(ctx context.Context, provider ProviderInfo, space string) (map[string continue } - repoMap[scmRepo.Name] = RepositoryInfo{ + repos = append(repos, RepositoryInfo{ Space: scmRepo.Namespace, UID: scmRepo.Name, CloneURL: scmRepo.Clone, IsPublic: !scmRepo.Private, DefaultBranch: scmRepo.Branch, - } + }) } if len(scmRepos) == 0 || page == scmResponse.Page.Last { @@ -138,5 +235,5 @@ func Space(ctx context.Context, provider ProviderInfo, space string) (map[string page++ } - return repoMap, nil + return repos, nil } diff --git a/internal/services/importer/repository.go b/internal/services/importer/repository.go index 60c347bc4..399168587 100644 --- a/internal/services/importer/repository.go +++ b/internal/services/importer/repository.go @@ -21,13 +21,21 @@ import ( gitnessurl "github.com/harness/gitness/internal/url" gitness_store "github.com/harness/gitness/store" "github.com/harness/gitness/types" + + "github.com/rs/zerolog/log" +) + +const ( + importJobMaxRetries = 0 + importJobMaxDuration = 45 * time.Minute ) type Repository struct { - urlProvider *gitnessurl.Provider - git gitrpc.Interface - repoStore store.RepoStore - scheduler *job.Scheduler + defaultBranch string + urlProvider *gitnessurl.Provider + git gitrpc.Interface + repoStore store.RepoStore + scheduler *job.Scheduler } var _ job.Handler = (*Repository)(nil) @@ -45,25 +53,84 @@ func (i *Repository) Register(executor *job.Executor) error { return executor.Register(jobType, i) } -func (i *Repository) Run(ctx context.Context, jobUID string, input Input) error { +func (i *Repository) Run(ctx context.Context, provider Provider, repo *types.Repository, cloneURL string) error { + input := Input{ + RepoID: repo.ID, + GitUser: provider.Username, + GitPass: provider.Password, + CloneURL: cloneURL, + } + data, err := json.Marshal(input) if err != nil { - return err + return fmt.Errorf("failed to marshal job input json: %w", err) } strData := strings.TrimSpace(string(data)) return i.scheduler.RunJob(ctx, job.Definition{ - UID: jobUID, + UID: *repo.ImportingJobUID, Type: jobType, - MaxRetries: 1, - Timeout: 30 * time.Minute, + MaxRetries: importJobMaxRetries, + Timeout: importJobMaxDuration, Data: strData, }) } +func (i *Repository) RunMany(ctx context.Context, + groupID string, + provider Provider, + repos []*types.Repository, + cloneURLs []string, +) error { + if len(repos) != len(cloneURLs) { + return fmt.Errorf("slice length mismatch: have %d repositories and %d clone URLs", + len(repos), len(cloneURLs)) + } + + n := len(repos) + + defs := make([]job.Definition, n) + + for k := 0; k < n; k++ { + repo := repos[k] + cloneURL := cloneURLs[k] + + input := Input{ + RepoID: repo.ID, + GitUser: provider.Username, + GitPass: provider.Password, + CloneURL: cloneURL, + } + + data, err := json.Marshal(input) + if err != nil { + return fmt.Errorf("failed to marshal job input json: %w", err) + } + + strData := strings.TrimSpace(string(data)) + + defs[k] = job.Definition{ + UID: *repo.ImportingJobUID, + Type: jobType, + MaxRetries: importJobMaxRetries, + Timeout: importJobMaxDuration, + Data: strData, + } + } + + err := i.scheduler.RunJobs(ctx, groupID, defs) + if err != nil { + return fmt.Errorf("failed to run jobs: %w", err) + } + + return nil +} + // Handle is repository import background job handler. func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressReporter) (string, error) { + systemPrincipal := bootstrap.NewSystemServiceSession().Principal + var input Input if err := json.NewDecoder(strings.NewReader(data)).Decode(&input); err != nil { return "", fmt.Errorf("failed to unmarshal job input: %w", err) @@ -92,26 +159,44 @@ func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressRepo return "", fmt.Errorf("repository %s is not being imported", repo.UID) } - writeParams, err := createRPCWriteParams(ctx, i.urlProvider, repo) + gitUID, err := i.createGitRepository(ctx, &systemPrincipal, repo.ID) if err != nil { - return "", fmt.Errorf("failed to create write params: %w", err) + return "", fmt.Errorf("failed to create empty git repository: %w", err) } - syncOut, err := i.git.SyncRepository(ctx, &gitrpc.SyncRepositoryParams{ - WriteParams: writeParams, - Source: input.CloneURL, - CreateIfNotExists: false, - }) - if err != nil { - return "", fmt.Errorf("failed to sync repositories: %w", err) - } + err = func() error { + repo.GitUID = gitUID - repo.Importing = false - repo.DefaultBranch = syncOut.DefaultBranch + defaultBranch, err := i.syncGitRepository(ctx, &systemPrincipal, repo, input.CloneURL) + if err != nil { + return fmt.Errorf("failed to sync git repository from '%s': %w", input.CloneURL, err) + } - err = i.repoStore.Update(ctx, repo) + repo, err = i.repoStore.UpdateOptLock(ctx, repo, func(repo *types.Repository) error { + if !repo.Importing { + return errors.New("repository has already finished importing") + } + + repo.GitUID = gitUID + repo.DefaultBranch = defaultBranch + repo.Importing = false + + return nil + }) + if err != nil { + return fmt.Errorf("failed to update repository after import: %w", err) + } + + return nil + }() if err != nil { - return "", fmt.Errorf("failed to update repository after import: %w", err) + if errDel := i.deleteGitRepository(ctx, &systemPrincipal, repo); errDel != nil { + log.Ctx(ctx).Err(err). + Str("gitUID", gitUID). + Msg("failed to delete git repository after failed import") + } + + return "", fmt.Errorf("failed to import repository: %w", err) } return "", err @@ -135,31 +220,130 @@ func (i *Repository) GetProgress(ctx context.Context, repo *types.Repository) (t return progress, nil } -// CreateRPCWriteParams creates base write parameters for gitrpc write operations. -func createRPCWriteParams(ctx context.Context, - urlProvider *gitnessurl.Provider, +func (i *Repository) Cancel(ctx context.Context, repo *types.Repository) error { + if repo.ImportingJobUID == nil || *repo.ImportingJobUID == "" { + return nil + } + + err := i.scheduler.CancelJob(ctx, *repo.ImportingJobUID) + if err != nil { + return fmt.Errorf("failed to cancel job: %w", err) + } + + return nil +} + +func (i *Repository) createGitRepository(ctx context.Context, + principal *types.Principal, + repoID int64, +) (string, error) { + now := time.Now() + + envVars, err := i.createEnvVars(ctx, principal, repoID) + if err != nil { + return "", err + } + + resp, err := i.git.CreateRepository(ctx, &gitrpc.CreateRepositoryParams{ + Actor: gitrpc.Identity{ + Name: principal.DisplayName, + Email: principal.Email, + }, + EnvVars: envVars, + DefaultBranch: i.defaultBranch, + Files: nil, + Author: &gitrpc.Identity{ + Name: principal.DisplayName, + Email: principal.Email, + }, + AuthorDate: &now, + Committer: &gitrpc.Identity{ + Name: principal.DisplayName, + Email: principal.Email, + }, + CommitterDate: &now, + }) + if err != nil { + return "", fmt.Errorf("failed to create empty git repository: %w", err) + } + + return resp.UID, nil +} + +func (i *Repository) syncGitRepository(ctx context.Context, + principal *types.Principal, + repo *types.Repository, + sourceCloneURL string, +) (string, error) { + writeParams, err := i.createRPCWriteParams(ctx, principal, repo) + if err != nil { + return "", err + } + + syncOut, err := i.git.SyncRepository(ctx, &gitrpc.SyncRepositoryParams{ + WriteParams: writeParams, + Source: sourceCloneURL, + CreateIfNotExists: false, + }) + if err != nil { + return "", fmt.Errorf("failed to sync repository: %w", err) + } + + return syncOut.DefaultBranch, nil +} + +func (i *Repository) deleteGitRepository(ctx context.Context, + principal *types.Principal, + repo *types.Repository, +) error { + writeParams, err := i.createRPCWriteParams(ctx, principal, repo) + if err != nil { + return err + } + + err = i.git.DeleteRepository(ctx, &gitrpc.DeleteRepositoryParams{ + WriteParams: writeParams, + }) + if err != nil { + return fmt.Errorf("failed to delete git repository: %w", err) + } + + return nil +} + +func (i *Repository) createRPCWriteParams(ctx context.Context, + principal *types.Principal, repo *types.Repository, ) (gitrpc.WriteParams, error) { - gitnessSession := bootstrap.NewSystemServiceSession() - - // generate envars (add everything githook CLI needs for execution) - envVars, err := githook.GenerateEnvironmentVariables( - ctx, - urlProvider.GetAPIBaseURLInternal(), - repo.ID, - gitnessSession.Principal.ID, - false, - ) + envVars, err := i.createEnvVars(ctx, principal, repo.ID) if err != nil { - return gitrpc.WriteParams{}, fmt.Errorf("failed to generate git hook environment variables: %w", err) + return gitrpc.WriteParams{}, err } return gitrpc.WriteParams{ Actor: gitrpc.Identity{ - Name: gitnessSession.Principal.DisplayName, - Email: gitnessSession.Principal.Email, + Name: principal.DisplayName, + Email: principal.Email, }, RepoUID: repo.GitUID, EnvVars: envVars, }, nil } + +func (i *Repository) createEnvVars(ctx context.Context, + principal *types.Principal, + repoID int64, +) (map[string]string, error) { + envVars, err := githook.GenerateEnvironmentVariables( + ctx, + i.urlProvider.GetAPIBaseURLInternal(), + repoID, + principal.ID, + false, + ) + if err != nil { + return nil, fmt.Errorf("failed to generate git hook environment variables: %w", err) + } + + return envVars, nil +} diff --git a/internal/services/importer/wire.go b/internal/services/importer/wire.go index da3e4aa1e..44328b4bf 100644 --- a/internal/services/importer/wire.go +++ b/internal/services/importer/wire.go @@ -9,6 +9,7 @@ import ( "github.com/harness/gitness/internal/services/job" "github.com/harness/gitness/internal/store" "github.com/harness/gitness/internal/url" + "github.com/harness/gitness/types" "github.com/google/wire" ) @@ -18,6 +19,7 @@ var WireSet = wire.NewSet( ) func ProvideRepoImporter( + config *types.Config, urlProvider *url.Provider, git gitrpc.Interface, repoStore store.RepoStore, @@ -25,10 +27,11 @@ func ProvideRepoImporter( executor *job.Executor, ) (*Repository, error) { importer := &Repository{ - urlProvider: urlProvider, - git: git, - repoStore: repoStore, - scheduler: scheduler, + defaultBranch: config.Git.DefaultBranch, + urlProvider: urlProvider, + git: git, + repoStore: repoStore, + scheduler: scheduler, } err := executor.Register(jobType, importer) diff --git a/internal/services/job/scheduler.go b/internal/services/job/scheduler.go index d82afae38..1ca8545cb 100644 --- a/internal/services/job/scheduler.go +++ b/internal/services/job/scheduler.go @@ -35,9 +35,12 @@ type Scheduler struct { maxRunning int purgeMinOldAge time.Duration + // global context + globalCtx context.Context + // synchronization stuff - globalCtx context.Context signal chan time.Time + signalEdgy chan struct{} done chan struct{} wgRunning sync.WaitGroup cancelJobMx sync.Mutex @@ -102,6 +105,7 @@ func (s *Scheduler) Run(ctx context.Context) error { defer close(s.done) s.signal = make(chan time.Time, 1) + s.signalEdgy = make(chan struct{}, 1) s.globalCtx = ctx timer := newSchedulerTimer() @@ -122,6 +126,10 @@ func (s *Scheduler) Run(ctx context.Context) error { case <-ctx.Done(): return ctx.Err() + case <-s.signalEdgy: + timer.MakeEdgy() + return nil + case newTime := <-s.signal: dur := timer.RescheduleEarlier(newTime) if dur > 0 { @@ -256,6 +264,13 @@ func (s *Scheduler) scheduleProcessing(scheduled time.Time) { }() } +func (s *Scheduler) makeTimerEdgy() { + select { + case s.signalEdgy <- struct{}{}: + default: + } +} + // scheduleIfHaveMoreJobs triggers processing of ready jobs if the timer is edgy. // The timer would be edgy if the previous iteration found more jobs that it could start (full capacity). // This should be run after a non-recurring job has finished. @@ -276,14 +291,14 @@ func (s *Scheduler) RunJob(ctx context.Context, def Definition) error { // RunJobs runs a several jobs. It's more efficient than calling RunJob several times // because it locks the DB only once. -// TODO: Add groupID parameter and use it for all jobs. -func (s *Scheduler) RunJobs(ctx context.Context, defs []Definition) error { +func (s *Scheduler) RunJobs(ctx context.Context, groupID string, defs []Definition) error { jobs := make([]*types.Job, len(defs)) for i, def := range defs { if err := def.Validate(); err != nil { return err } jobs[i] = def.toNewJob() + jobs[i].GroupID = groupID } return s.startNewJobs(ctx, jobs) @@ -310,6 +325,8 @@ func (s *Scheduler) startNewJobsNoLock(ctx context.Context, jobs []*types.Job) e return fmt.Errorf("failed to count available slots for job execution: %w", err) } + canRunAll := available >= len(jobs) + for _, job := range jobs { if available > 0 { available-- @@ -340,6 +357,10 @@ func (s *Scheduler) startNewJobsNoLock(ctx context.Context, jobs []*types.Job) e }(s.globalCtx) } + if !canRunAll { + s.makeTimerEdgy() + } + return nil } diff --git a/internal/services/job/timer.go b/internal/services/job/timer.go index dfc93f70a..819cb884b 100644 --- a/internal/services/job/timer.go +++ b/internal/services/job/timer.go @@ -31,6 +31,11 @@ func (t *schedulerTimer) ResetAt(next time.Time, edgy bool) time.Duration { return t.resetAt(time.Now(), next, edgy) } +// MakeEdgy makes the timer edgy which meant it will be triggered immediately on reschedule attempt. +func (t *schedulerTimer) MakeEdgy() { + t.edgy = true +} + func (t *schedulerTimer) resetAt(now, next time.Time, edgy bool) time.Duration { var dur time.Duration diff --git a/internal/store/database/job.go b/internal/store/database/job.go index 0e8d4e5a9..cb20bb0db 100644 --- a/internal/store/database/job.go +++ b/internal/store/database/job.go @@ -54,7 +54,8 @@ const ( ,job_is_recurring ,job_recurring_cron ,job_consecutive_failures - ,job_last_failure_error` + ,job_last_failure_error + ,job_group_id` jobSelectBase = ` SELECT` + jobColumns + ` @@ -101,6 +102,7 @@ func (s *JobStore) Create(ctx context.Context, job *types.Job) error { ,:job_recurring_cron ,:job_consecutive_failures ,:job_last_failure_error + ,:job_group_id )` db := dbtx.GetAccessor(ctx, s.db) @@ -143,6 +145,7 @@ func (s *JobStore) Upsert(ctx context.Context, job *types.Job) error { ,:job_recurring_cron ,:job_consecutive_failures ,:job_last_failure_error + ,:job_group_id ) ON CONFLICT (job_uid) DO UPDATE SET @@ -196,6 +199,7 @@ func (s *JobStore) UpdateDefinition(ctx context.Context, job *types.Job) error { ,job_scheduled = :job_scheduled ,job_is_recurring = :job_is_recurring ,job_recurring_cron = :job_recurring_cron + ,job_group_id = :job_group_id WHERE job_uid = :job_uid` db := dbtx.GetAccessor(ctx, s.db) diff --git a/internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.down.sql b/internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.down.sql new file mode 100644 index 000000000..a740594cc --- /dev/null +++ b/internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.down.sql @@ -0,0 +1 @@ +ALTER TABLE jobs DROP COLUMN job_group_id; diff --git a/internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.up.sql b/internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.up.sql new file mode 100644 index 000000000..86a19161b --- /dev/null +++ b/internal/store/database/migrate/postgres/0025_alter_table_job_add_group_id.up.sql @@ -0,0 +1 @@ +ALTER TABLE jobs ADD COLUMN job_group_id TEXT NOT NULL DEFAULT ''; diff --git a/internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.down.sql b/internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.down.sql new file mode 100644 index 000000000..a740594cc --- /dev/null +++ b/internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.down.sql @@ -0,0 +1 @@ +ALTER TABLE jobs DROP COLUMN job_group_id; diff --git a/internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.up.sql b/internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.up.sql new file mode 100644 index 000000000..86a19161b --- /dev/null +++ b/internal/store/database/migrate/sqlite/0025_alter_table_job_add_group_id.up.sql @@ -0,0 +1 @@ +ALTER TABLE jobs ADD COLUMN job_group_id TEXT NOT NULL DEFAULT ''; diff --git a/internal/store/database/repo.go b/internal/store/database/repo.go index 3091f9f85..6770ce57d 100644 --- a/internal/store/database/repo.go +++ b/internal/store/database/repo.go @@ -170,21 +170,22 @@ func (s *RepoStore) Update(ctx context.Context, repo *types.Repository) error { const sqlQuery = ` UPDATE repositories SET - repo_version = :repo_version - ,repo_updated = :repo_updated - ,repo_parent_id = :repo_parent_id - ,repo_uid = :repo_uid - ,repo_description = :repo_description - ,repo_is_public = :repo_is_public - ,repo_default_branch = :repo_default_branch - ,repo_pullreq_seq = :repo_pullreq_seq - ,repo_num_forks = :repo_num_forks - ,repo_num_pulls = :repo_num_pulls - ,repo_num_closed_pulls = :repo_num_closed_pulls - ,repo_num_open_pulls = :repo_num_open_pulls - ,repo_num_merged_pulls = :repo_num_merged_pulls - ,repo_importing = :repo_importing - ,repo_importing_job_uid = :repo_importing_job_uid + repo_version = :repo_version + ,repo_updated = :repo_updated + ,repo_parent_id = :repo_parent_id + ,repo_uid = :repo_uid + ,repo_git_uid = :repo_git_uid + ,repo_description = :repo_description + ,repo_is_public = :repo_is_public + ,repo_default_branch = :repo_default_branch + ,repo_pullreq_seq = :repo_pullreq_seq + ,repo_num_forks = :repo_num_forks + ,repo_num_pulls = :repo_num_pulls + ,repo_num_closed_pulls = :repo_num_closed_pulls + ,repo_num_open_pulls = :repo_num_open_pulls + ,repo_num_merged_pulls = :repo_num_merged_pulls + ,repo_importing = :repo_importing + ,repo_importing_job_uid = :repo_importing_job_uid WHERE repo_id = :repo_id AND repo_version = :repo_version - 1` updatedAt := time.Now() @@ -219,7 +220,8 @@ func (s *RepoStore) Update(ctx context.Context, repo *types.Repository) error { // UpdateOptLock updates the repository using the optimistic locking mechanism. func (s *RepoStore) UpdateOptLock(ctx context.Context, repo *types.Repository, - mutateFn func(repository *types.Repository) error) (*types.Repository, error) { + mutateFn func(repository *types.Repository) error, +) (*types.Repository, error) { for { dup := *repo diff --git a/types/job.go b/types/job.go index 37ae01c50..1a6a32fac 100644 --- a/types/job.go +++ b/types/job.go @@ -27,6 +27,7 @@ type Job struct { RecurringCron string `db:"job_recurring_cron"` ConsecutiveFailures int `db:"job_consecutive_failures"` LastFailureError string `db:"job_last_failure_error"` + GroupID string `db:"job_group_id"` } type JobStateChange struct { From 935b70a9ad7b59998aa39c4e94313c7557f9f53d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ga=C4=87e=C5=A1a?= Date: Sat, 9 Sep 2023 14:29:13 +0200 Subject: [PATCH 06/13] import API openapi definition --- internal/api/openapi/repo.go | 12 ++++++++++++ internal/api/openapi/space.go | 11 +++++++++++ internal/services/importer/provider.go | 16 ++++++++-------- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/internal/api/openapi/repo.go b/internal/api/openapi/repo.go index 8fb613eb9..32b2159e5 100644 --- a/internal/api/openapi/repo.go +++ b/internal/api/openapi/repo.go @@ -384,6 +384,18 @@ func repoOperations(reflector *openapi3.Reflector) { _ = reflector.SetJSONResponse(&createRepository, new(usererror.Error), http.StatusForbidden) _ = reflector.Spec.AddOperation(http.MethodPost, "/repos", createRepository) + importRepository := openapi3.Operation{} + importRepository.WithTags("repository") + importRepository.WithMapOfAnything(map[string]interface{}{"operationId": "importRepository"}) + importRepository.WithParameters(queryParameterSpacePath) + _ = reflector.SetRequest(&importRepository, &struct{ repo.ImportInput }{}, http.MethodPost) + _ = reflector.SetJSONResponse(&importRepository, new(types.Repository), http.StatusCreated) + _ = reflector.SetJSONResponse(&importRepository, new(usererror.Error), http.StatusBadRequest) + _ = reflector.SetJSONResponse(&importRepository, new(usererror.Error), http.StatusInternalServerError) + _ = reflector.SetJSONResponse(&importRepository, new(usererror.Error), http.StatusUnauthorized) + _ = reflector.SetJSONResponse(&importRepository, new(usererror.Error), http.StatusForbidden) + _ = reflector.Spec.AddOperation(http.MethodPost, "/repos/import", importRepository) + opFind := openapi3.Operation{} opFind.WithTags("repository") opFind.WithMapOfAnything(map[string]interface{}{"operationId": "findRepository"}) diff --git a/internal/api/openapi/space.go b/internal/api/openapi/space.go index 1a2117938..b77841508 100644 --- a/internal/api/openapi/space.go +++ b/internal/api/openapi/space.go @@ -158,6 +158,17 @@ func spaceOperations(reflector *openapi3.Reflector) { _ = reflector.SetJSONResponse(&opCreate, new(usererror.Error), http.StatusForbidden) _ = reflector.Spec.AddOperation(http.MethodPost, "/spaces", opCreate) + opImport := openapi3.Operation{} + opImport.WithTags("space") + opImport.WithMapOfAnything(map[string]interface{}{"operationId": "importSpace"}) + _ = reflector.SetRequest(&opImport, &struct{ space.ImportInput }{}, http.MethodPost) + _ = reflector.SetJSONResponse(&opImport, new(types.Space), http.StatusCreated) + _ = reflector.SetJSONResponse(&opImport, new(usererror.Error), http.StatusBadRequest) + _ = reflector.SetJSONResponse(&opImport, new(usererror.Error), http.StatusInternalServerError) + _ = reflector.SetJSONResponse(&opImport, new(usererror.Error), http.StatusUnauthorized) + _ = reflector.SetJSONResponse(&opImport, new(usererror.Error), http.StatusForbidden) + _ = reflector.Spec.AddOperation(http.MethodPost, "/spaces/import", opImport) + opGet := openapi3.Operation{} opGet.WithTags("space") opGet.WithMapOfAnything(map[string]interface{}{"operationId": "getSpace"}) diff --git a/internal/services/importer/provider.go b/internal/services/importer/provider.go index 0665e1be2..0e759675a 100644 --- a/internal/services/importer/provider.go +++ b/internal/services/importer/provider.go @@ -29,14 +29,7 @@ const ( ProviderTypeGitLabEnterprise ProviderType = "gitlab-enterprise" ) -type Provider struct { - Type ProviderType `json:"type"` - Host string `json:"host"` - Username string `json:"username"` - Password string `json:"password"` -} - -func (p Provider) Enum() []any { +func (p ProviderType) Enum() []any { return []any{ ProviderTypeGitHub, ProviderTypeGitHubEnterprise, @@ -45,6 +38,13 @@ func (p Provider) Enum() []any { } } +type Provider struct { + Type ProviderType `json:"type"` + Host string `json:"host"` + Username string `json:"username"` + Password string `json:"password"` +} + type RepositoryInfo struct { Space string UID string From 798c794582f71ff20685494c908d35187aec7e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ga=C4=87e=C5=A1a?= Date: Sat, 9 Sep 2023 15:10:33 +0200 Subject: [PATCH 07/13] fix space import --- internal/api/controller/space/import.go | 4 ++++ internal/services/importer/provider.go | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/api/controller/space/import.go b/internal/api/controller/space/import.go index 7d23c85fa..ce00c9749 100644 --- a/internal/api/controller/space/import.go +++ b/internal/api/controller/space/import.go @@ -51,6 +51,10 @@ func (c *Controller) Import(ctx context.Context, session *auth.Session, in *Impo return nil, err } + if len(remoteRepositories) == 0 { + return nil, usererror.BadRequestf("found no repositories at %s", in.ProviderSpace) + } + localRepositories := make([]*types.Repository, len(remoteRepositories)) cloneURLs := make([]string, len(remoteRepositories)) diff --git a/internal/services/importer/provider.go b/internal/services/importer/provider.go index 0e759675a..3a50d25b9 100644 --- a/internal/services/importer/provider.go +++ b/internal/services/importer/provider.go @@ -215,10 +215,6 @@ func LoadRepositoriesFromProviderSpace(ctx context.Context, provider Provider, s } for _, scmRepo := range scmRepos { - if !scmRepo.Perm.Pull { - continue - } - repos = append(repos, RepositoryInfo{ Space: scmRepo.Namespace, UID: scmRepo.Name, From ef84e6085f4e5f7d05ab412d43b2b3c7d088b4b8 Mon Sep 17 00:00:00 2001 From: Tan Nhu Date: Sun, 10 Sep 2023 23:39:23 +0000 Subject: [PATCH 08/13] Use typed-scss-modules to generate SCSS module .d.ts files (#425) --- web/package.json | 9 +- web/src/App.module.scss.d.ts | 9 +- web/src/bootstrap.scss.d.ts | 3 + .../AuthLayout/AuthLayout.module.scss.d.ts | 27 +- .../BranchTagSelect.module.scss.d.ts | 23 +- .../Changes/Changes.module.scss.d.ts | 41 +- .../Changes/ChangesDropdown.module.scss.d.ts | 13 +- .../CloneButtonTooltip.module.scss.d.ts | 15 +- .../CloneCredentialDialog.module.scss.d.ts | 11 +- .../CodeCommentStatusSelect.module.scss.d.ts | 7 +- .../CommentBox/CommentBox.module.scss.d.ts | 35 +- .../CommitActions.module.scss.d.ts | 13 +- .../CommitDivergence.module.scss.d.ts | 15 +- .../CommitInfo/CommitInfo.module.scss.d.ts | 17 +- .../CommitModalButton.module.scss.d.ts | 17 +- .../CommitsView/CommitsView.module.scss.d.ts | 27 +- .../Console/Console.module.scss.d.ts | 15 +- .../ConsoleLogs/ConsoleLogs.module.scss.d.ts | 11 +- .../ConsoleStep/ConsoleStep.module.scss.d.ts | 11 +- .../CreateBranchModal.module.scss.d.ts | 21 +- .../CreateTagModal.module.scss.d.ts | 21 +- .../DiffViewer/DiffViewer.module.scss.d.ts | 21 +- .../components/Editor/Editor.module.scss.d.ts | 7 +- .../ExecutionPageHeader.module.scss.d.ts | 16 +- .../ExecutionStageList.module.scss.d.ts | 19 +- .../ExecutionStatus.module.scss.d.ts | 21 +- .../ExecutionStatusLabel.module.scss.d.ts | 15 +- .../GitRefLink/GitRefLink.module.scss.d.ts | 11 +- .../GitnessLogo/GitnessLogo.module.scss.d.ts | 11 +- .../ImageCarousel.module.scss.d.ts | 15 +- .../LatestCommit.module.scss.d.ts | 17 +- .../LoadingSpinner.module.scss.d.ts | 15 +- .../LogViewer/LogViewer.module.scss.d.ts | 17 +- ...MarkdownEditorWithPreview.module.scss.d.ts | 27 +- .../MarkdownViewer.module.scss.d.ts | 9 +- .../NavigationCheck.module.scss.d.ts | 7 +- .../NewRepoModalButton.module.scss.d.ts | 7 +- .../NewSpaceModalButton.module.scss.d.ts | 7 +- .../NoResultCard.module.scss.d.ts | 7 +- .../OptionsMenuButton.module.scss.d.ts | 11 +- .../PlainButton/PlainButton.module.scss.d.ts | 9 +- .../PullRequestStateLabel.module.scss.d.ts | 17 +- .../RepositoryPageHeader.module.scss.d.ts | 9 +- ...ResourceListingPagination.module.scss.d.ts | 17 +- .../ReviewerSelect.module.scss.d.ts | 31 +- .../SearchInputWithSpinner.module.scss.d.ts | 15 +- .../SourceCodeViewer.module.scss.d.ts | 7 +- .../SpaceSelector.module.scss.d.ts | 45 +- .../TabTitleWithCount.module.scss.d.ts | 11 +- .../ThreadSection.module.scss.d.ts | 19 +- .../UserManagementFlows.module.scss.d.ts | 19 +- web/src/layouts/layout.module.scss.d.ts | 17 +- .../layouts/menu/DefaultMenu.module.scss.d.ts | 27 +- .../layouts/menu/NavMenuItem.module.scss.d.ts | 15 +- .../ChangePassword.module.scss.d.ts | 11 +- .../pages/Compare/Compare.module.scss.d.ts | 21 +- .../CompareContentHeader.module.scss.d.ts | 15 +- .../Execution/Execution.module.scss.d.ts | 11 +- .../ExecutionList.module.scss.d.ts | 27 +- web/src/pages/Home/Home.module.scss.d.ts | 11 +- .../NewPipeline/NewPipeline.module.scss.d.ts | 9 +- .../PipelineList.module.scss.d.ts | 29 +- .../Checks/Checks.module.scss.d.ts | 47 +- .../Checks/ChecksOverview.module.scss.d.ts | 27 +- .../Conversation.module.scss.d.ts | 55 ++- .../PullRequestActionsBox.module.scss.d.ts | 43 +- .../PullRequestSideBar.module.scss.d.ts | 15 +- .../PullRequest/PullRequest.module.scss.d.ts | 21 +- .../PullRequestCommits.module.scss.d.ts | 6 - .../PullRequestMetaLine.module.scss.d.ts | 19 +- .../PullRequests.module.scss.d.ts | 19 +- ...PullRequestsContentHeader.module.scss.d.ts | 9 +- .../RepositoriesListing.module.scss.d.ts | 31 +- .../EmptyRepositoryInfo.module.scss.d.ts | 19 +- .../Repository/Repository.module.scss.d.ts | 19 +- .../ContentHeader.module.scss.d.ts | 15 +- .../FileContent/FileContent.module.scss.d.ts | 25 +- .../FileContent/GitBlame.module.scss.d.ts | 21 +- .../RenameContentHistory.module.scss.d.ts | 11 +- .../FolderContent.module.scss.d.ts | 33 +- .../FolderContent/Readme.module.scss.d.ts | 13 +- .../RepositoryContent.module.scss.d.ts | 7 +- .../RepositoryHeader.module.scss.d.ts | 13 +- .../ResourceTree.module.scss.d.ts | 19 +- .../RepositoryBranches.module.scss.d.ts | 7 +- .../BranchesContent.module.scss.d.ts | 21 +- .../BranchesContentHeader.module.scss.d.ts | 9 +- ...RepositoryBranchesContent.module.scss.d.ts | 9 +- .../RepositoryCommit.module.scss.d.ts | 13 +- .../RepositoryCommits.module.scss.d.ts | 13 +- .../FileEditor/FileEditor.module.scss.d.ts | 23 +- .../RepositoryFileEdit.module.scss.d.ts | 9 +- .../RepositoryFileEditHeader.module.scss.d.ts | 13 +- .../RepositorySettings.module.scss.d.ts | 29 +- .../RepositoryTags.module.scss.d.ts | 7 +- .../RepositoryTagsContent.module.scss.d.ts | 9 +- ...positoryTagsContentHeader.module.scss.d.ts | 9 +- .../TagsContent/TagsContent.module.scss.d.ts | 23 +- web/src/pages/Secret/Secret.module.scss.d.ts | 7 +- .../SecretList/SecretList.module.scss.d.ts | 29 +- web/src/pages/SignIn/SignIn.module.scss.d.ts | 7 +- web/src/pages/SignUp/SignUp.module.scss.d.ts | 19 +- .../SpaceAccessControl.module.scss.d.ts | 9 +- .../SpaceSettings.module.scss.d.ts | 29 +- .../UserProfile/UserProfile.module.scss.d.ts | 23 +- .../UsersListing.module.scss.d.ts | 9 +- .../WebhookNew/WehookForm.module.scss.d.ts | 41 +- .../pages/Webhooks/Webhooks.module.scss.d.ts | 23 +- .../WebhooksHeader.module.scss.d.ts | 11 +- web/src/utils/test/testUtils.module.scss.d.ts | 6 + web/typed-scss-modules.config.js | 4 + web/yarn.lock | 412 +++++++++++++++++- 112 files changed, 1200 insertions(+), 1123 deletions(-) create mode 100644 web/src/bootstrap.scss.d.ts delete mode 100644 web/src/pages/PullRequest/PullRequestCommits/PullRequestCommits.module.scss.d.ts create mode 100644 web/src/utils/test/testUtils.module.scss.d.ts create mode 100644 web/typed-scss-modules.config.js diff --git a/web/package.json b/web/package.json index f9ecef4cf..78e9e44be 100644 --- a/web/package.json +++ b/web/package.json @@ -15,7 +15,9 @@ }, "keywords": [], "scripts": { - "dev": "NODE_ENV=development webpack serve --config config/webpack.dev.js", + "webpack": "NODE_ENV=development webpack serve --config config/webpack.dev.js", + "typed-scss": "typed-scss-modules src --watch", + "dev": "run-p webpack typed-scss", "test": "jest src --silent", "test:watch": "jest --watch", "build": "rm -rf dist && webpack --config config/webpack.prod.js", @@ -62,7 +64,7 @@ "masonry-layout": "^4.2.2", "moment": "^2.25.3", "monaco-editor": "^0.40.0", - "monaco-editor-webpack-plugin": "^7.0.1", + "monaco-editor-webpack-plugin": "^7.1.0", "qs": "^6.9.4", "react": "^17.0.2", "react-complex-tree": "^1.1.11", @@ -104,7 +106,7 @@ "@types/qs": "^6.9.4", "@types/react": "^17.0.3", "@types/react-dom": "^17.0.3", - "@types/react-router-dom": "^5.1.7", + "@types/react-router-dom": "^5.2.1", "@types/react-table": "^7.0.18", "@types/react-timeago": "^4.1.1", "@types/testing-library__react-hooks": "^3.2.0", @@ -143,6 +145,7 @@ "ts-jest": "^26.5.5", "ts-loader": "^9.2.6", "tsconfig-paths-webpack-plugin": "^3.5.1", + "typed-scss-modules": "^7.1.4", "typescript": "^4.7.4", "url-loader": "^4.1.1", "webpack": "^5.58.0", diff --git a/web/src/App.module.scss.d.ts b/web/src/App.module.scss.d.ts index 288404f19..31b731857 100644 --- a/web/src/App.module.scss.d.ts +++ b/web/src/App.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly fullPage: string -} -export default styles +// This is an auto-generated file +export declare const fullPage: string +export declare const main: string diff --git a/web/src/bootstrap.scss.d.ts b/web/src/bootstrap.scss.d.ts new file mode 100644 index 000000000..bec653389 --- /dev/null +++ b/web/src/bootstrap.scss.d.ts @@ -0,0 +1,3 @@ +/* eslint-disable */ +// This is an auto-generated file +export declare const reactRoot: string diff --git a/web/src/components/AuthLayout/AuthLayout.module.scss.d.ts b/web/src/components/AuthLayout/AuthLayout.module.scss.d.ts index 00a2ecd65..4affab385 100644 --- a/web/src/components/AuthLayout/AuthLayout.module.scss.d.ts +++ b/web/src/components/AuthLayout/AuthLayout.module.scss.d.ts @@ -1,16 +1,13 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly layout: string - readonly cardColumn: string - readonly card: string - readonly cardChildren: string - readonly imageColumn: string - readonly image: string - readonly subtractContainer: string - readonly subtractImage: string - readonly imageContainer: string - readonly overlayImage: string - readonly disclaimer: string -} -export default styles +// This is an auto-generated file +export declare const card: string +export declare const cardChildren: string +export declare const cardColumn: string +export declare const disclaimer: string +export declare const image: string +export declare const imageColumn: string +export declare const imageContainer: string +export declare const layout: string +export declare const overlayImage: string +export declare const subtractContainer: string +export declare const subtractImage: string diff --git a/web/src/components/BranchTagSelect/BranchTagSelect.module.scss.d.ts b/web/src/components/BranchTagSelect/BranchTagSelect.module.scss.d.ts index 79b872fb6..76e3e756a 100644 --- a/web/src/components/BranchTagSelect/BranchTagSelect.module.scss.d.ts +++ b/web/src/components/BranchTagSelect/BranchTagSelect.module.scss.d.ts @@ -1,14 +1,11 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly button: string - readonly prefix: string - readonly main: string - readonly input: string - readonly tabContainer: string - readonly branchesOnly: string - readonly popover: string - readonly listContainer: string - readonly newBtnText: string -} -export default styles +// This is an auto-generated file +export declare const branchesOnly: string +export declare const button: string +export declare const input: string +export declare const listContainer: string +export declare const main: string +export declare const newBtnText: string +export declare const popover: string +export declare const prefix: string +export declare const tabContainer: string diff --git a/web/src/components/Changes/Changes.module.scss.d.ts b/web/src/components/Changes/Changes.module.scss.d.ts index cca3024cc..73a646eba 100644 --- a/web/src/components/Changes/Changes.module.scss.d.ts +++ b/web/src/components/Changes/Changes.module.scss.d.ts @@ -1,23 +1,20 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly wrapper: string - readonly header: string - readonly stickied: string - readonly diffStatsLabel: string - readonly main: string - readonly enableDiffLineBreaks: string - readonly container: string - readonly hideBtn: string - readonly refreshIcon: string - readonly repeatBtn: string - readonly popover: string - readonly menuItem: string - readonly menuReviewItem: string - readonly reviewIcon: string - readonly reviewButton: string - readonly hide: string - readonly disabled: string - readonly commitsDropdown: string -} -export default styles +// This is an auto-generated file +export declare const commitsDropdown: string +export declare const container: string +export declare const diffStatsLabel: string +export declare const disabled: string +export declare const enableDiffLineBreaks: string +export declare const header: string +export declare const hide: string +export declare const hideBtn: string +export declare const main: string +export declare const menuItem: string +export declare const menuReviewItem: string +export declare const popover: string +export declare const refreshIcon: string +export declare const repeatBtn: string +export declare const reviewButton: string +export declare const reviewIcon: string +export declare const stickied: string +export declare const wrapper: string diff --git a/web/src/components/Changes/ChangesDropdown.module.scss.d.ts b/web/src/components/Changes/ChangesDropdown.module.scss.d.ts index 04bce3d3e..14bfee611 100644 --- a/web/src/components/Changes/ChangesDropdown.module.scss.d.ts +++ b/web/src/components/Changes/ChangesDropdown.module.scss.d.ts @@ -1,9 +1,6 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly link: string - readonly filesMenu: string - readonly menuItem: string - readonly popover: string -} -export default styles +// This is an auto-generated file +export declare const filesMenu: string +export declare const link: string +export declare const menuItem: string +export declare const popover: string diff --git a/web/src/components/CloneButtonTooltip/CloneButtonTooltip.module.scss.d.ts b/web/src/components/CloneButtonTooltip/CloneButtonTooltip.module.scss.d.ts index b38edaafb..1c6e69999 100644 --- a/web/src/components/CloneButtonTooltip/CloneButtonTooltip.module.scss.d.ts +++ b/web/src/components/CloneButtonTooltip/CloneButtonTooltip.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly label: string - readonly layout: string - readonly url: string - readonly cloneCopyButton: string -} -export default styles +// This is an auto-generated file +export declare const cloneCopyButton: string +export declare const container: string +export declare const label: string +export declare const layout: string +export declare const url: string diff --git a/web/src/components/CloneCredentialDialog/CloneCredentialDialog.module.scss.d.ts b/web/src/components/CloneCredentialDialog/CloneCredentialDialog.module.scss.d.ts index 368426fb2..f8e0770fb 100644 --- a/web/src/components/CloneCredentialDialog/CloneCredentialDialog.module.scss.d.ts +++ b/web/src/components/CloneCredentialDialog/CloneCredentialDialog.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly layout: string - readonly url: string - readonly cloneCopyButton: string -} -export default styles +// This is an auto-generated file +export declare const cloneCopyButton: string +export declare const layout: string +export declare const url: string diff --git a/web/src/components/CodeCommentStatusSelect/CodeCommentStatusSelect.module.scss.d.ts b/web/src/components/CodeCommentStatusSelect/CodeCommentStatusSelect.module.scss.d.ts index 1cfa152e9..2d15a2675 100644 --- a/web/src/components/CodeCommentStatusSelect/CodeCommentStatusSelect.module.scss.d.ts +++ b/web/src/components/CodeCommentStatusSelect/CodeCommentStatusSelect.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly select: string -} -export default styles +// This is an auto-generated file +export declare const select: string diff --git a/web/src/components/CommentBox/CommentBox.module.scss.d.ts b/web/src/components/CommentBox/CommentBox.module.scss.d.ts index 616ca35ea..3100aecd2 100644 --- a/web/src/components/CommentBox/CommentBox.module.scss.d.ts +++ b/web/src/components/CommentBox/CommentBox.module.scss.d.ts @@ -1,20 +1,17 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly fluid: string - readonly box: string - readonly viewer: string - readonly deleted: string - readonly outdated: string - readonly replyPlaceHolder: string - readonly newCommentContainer: string - readonly hasThread: string - readonly editCommentContainer: string - readonly outletTopOfFirstOfComment: string - readonly standalone: string - readonly optionMenuIcon: string - readonly bp3Icon: string - readonly deleteIcon: string -} -export default styles +// This is an auto-generated file +export declare const box: string +export declare const bp3Icon: string +export declare const deleted: string +export declare const deleteIcon: string +export declare const editCommentContainer: string +export declare const fluid: string +export declare const hasThread: string +export declare const main: string +export declare const newCommentContainer: string +export declare const optionMenuIcon: string +export declare const outdated: string +export declare const outletTopOfFirstOfComment: string +export declare const replyPlaceHolder: string +export declare const standalone: string +export declare const viewer: string diff --git a/web/src/components/CommitActions/CommitActions.module.scss.d.ts b/web/src/components/CommitActions/CommitActions.module.scss.d.ts index 8531aa8a1..291ef3d58 100644 --- a/web/src/components/CommitActions/CommitActions.module.scss.d.ts +++ b/web/src/components/CommitActions/CommitActions.module.scss.d.ts @@ -1,9 +1,6 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly layout: string - readonly noCopy: string - readonly commitCopyButton: string -} -export default styles +// This is an auto-generated file +export declare const commitCopyButton: string +export declare const container: string +export declare const layout: string +export declare const noCopy: string diff --git a/web/src/components/CommitDivergence/CommitDivergence.module.scss.d.ts b/web/src/components/CommitDivergence/CommitDivergence.module.scss.d.ts index b2923874a..ae3bf59c4 100644 --- a/web/src/components/CommitDivergence/CommitDivergence.module.scss.d.ts +++ b/web/src/components/CommitDivergence/CommitDivergence.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly main: string - readonly ahead: string - readonly behind: string - readonly pipe: string -} -export default styles +// This is an auto-generated file +export declare const ahead: string +export declare const behind: string +export declare const container: string +export declare const main: string +export declare const pipe: string diff --git a/web/src/components/CommitInfo/CommitInfo.module.scss.d.ts b/web/src/components/CommitInfo/CommitInfo.module.scss.d.ts index 59f0521db..3f822766a 100644 --- a/web/src/components/CommitInfo/CommitInfo.module.scss.d.ts +++ b/web/src/components/CommitInfo/CommitInfo.module.scss.d.ts @@ -1,11 +1,8 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly commitInfoContainer: string - readonly commitTitleContainer: string - readonly infoContainer: string - readonly alignContent: string - readonly infoText: string - readonly titleText: string -} -export default styles +// This is an auto-generated file +export declare const alignContent: string +export declare const commitInfoContainer: string +export declare const commitTitleContainer: string +export declare const infoContainer: string +export declare const infoText: string +export declare const titleText: string diff --git a/web/src/components/CommitModalButton/CommitModalButton.module.scss.d.ts b/web/src/components/CommitModalButton/CommitModalButton.module.scss.d.ts index db055006e..588afa62c 100644 --- a/web/src/components/CommitModalButton/CommitModalButton.module.scss.d.ts +++ b/web/src/components/CommitModalButton/CommitModalButton.module.scss.d.ts @@ -1,11 +1,8 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly extendedDescription: string - readonly radioGroup: string - readonly directly: string - readonly newBranch: string - readonly newBranchContainer: string -} -export default styles +// This is an auto-generated file +export declare const directly: string +export declare const extendedDescription: string +export declare const main: string +export declare const newBranch: string +export declare const newBranchContainer: string +export declare const radioGroup: string diff --git a/web/src/components/CommitsView/CommitsView.module.scss.d.ts b/web/src/components/CommitsView/CommitsView.module.scss.d.ts index 4f1550997..c41e9a6b1 100644 --- a/web/src/components/CommitsView/CommitsView.module.scss.d.ts +++ b/web/src/components/CommitsView/CommitsView.module.scss.d.ts @@ -1,16 +1,13 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly table: string - readonly row: string - readonly rowText: string - readonly label: string - readonly refreshIcon: string - readonly fileButton: string - readonly layout: string - readonly noCopy: string - readonly commitFileButton: string - readonly commitRepoButton: string -} -export default styles +// This is an auto-generated file +export declare const commitFileButton: string +export declare const commitRepoButton: string +export declare const container: string +export declare const fileButton: string +export declare const label: string +export declare const layout: string +export declare const noCopy: string +export declare const refreshIcon: string +export declare const row: string +export declare const rowText: string +export declare const table: string diff --git a/web/src/components/Console/Console.module.scss.d.ts b/web/src/components/Console/Console.module.scss.d.ts index 5e3d1c140..44ee1eccf 100644 --- a/web/src/components/Console/Console.module.scss.d.ts +++ b/web/src/components/Console/Console.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly log: string - readonly header: string - readonly headerLayout: string - readonly steps: string -} -export default styles +// This is an auto-generated file +export declare const container: string +export declare const header: string +export declare const headerLayout: string +export declare const log: string +export declare const steps: string diff --git a/web/src/components/ConsoleLogs/ConsoleLogs.module.scss.d.ts b/web/src/components/ConsoleLogs/ConsoleLogs.module.scss.d.ts index 898a53cd0..988827c65 100644 --- a/web/src/components/ConsoleLogs/ConsoleLogs.module.scss.d.ts +++ b/web/src/components/ConsoleLogs/ConsoleLogs.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly logLayout: string - readonly lineNumber: string - readonly log: string -} -export default styles +// This is an auto-generated file +export declare const lineNumber: string +export declare const log: string +export declare const logLayout: string diff --git a/web/src/components/ConsoleStep/ConsoleStep.module.scss.d.ts b/web/src/components/ConsoleStep/ConsoleStep.module.scss.d.ts index 0d4fcb2ca..eb9e0ef6e 100644 --- a/web/src/components/ConsoleStep/ConsoleStep.module.scss.d.ts +++ b/web/src/components/ConsoleStep/ConsoleStep.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly spin: string - readonly loading: string - readonly stepLayout: string -} -export default styles +// This is an auto-generated file +export declare const loading: string +export declare const spin: string +export declare const stepLayout: string diff --git a/web/src/components/CreateBranchModal/CreateBranchModal.module.scss.d.ts b/web/src/components/CreateBranchModal/CreateBranchModal.module.scss.d.ts index 144ce1d50..bf92ecc4c 100644 --- a/web/src/components/CreateBranchModal/CreateBranchModal.module.scss.d.ts +++ b/web/src/components/CreateBranchModal/CreateBranchModal.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly title: string - readonly label: string - readonly container: string - readonly maxContainer: string - readonly branchTagSelect: string - readonly selectContainer: string - readonly popoverContainer: string -} -export default styles +// This is an auto-generated file +export declare const branchTagSelect: string +export declare const container: string +export declare const label: string +export declare const main: string +export declare const maxContainer: string +export declare const popoverContainer: string +export declare const selectContainer: string +export declare const title: string diff --git a/web/src/components/CreateTagModal/CreateTagModal.module.scss.d.ts b/web/src/components/CreateTagModal/CreateTagModal.module.scss.d.ts index ea379e96f..50c3d0942 100644 --- a/web/src/components/CreateTagModal/CreateTagModal.module.scss.d.ts +++ b/web/src/components/CreateTagModal/CreateTagModal.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly title: string - readonly label: string - readonly container: string - readonly extendedDescription: string - readonly branchTagSelect: string - readonly selectContainer: string - readonly popoverContainer: string -} -export default styles +// This is an auto-generated file +export declare const branchTagSelect: string +export declare const container: string +export declare const extendedDescription: string +export declare const label: string +export declare const main: string +export declare const popoverContainer: string +export declare const selectContainer: string +export declare const title: string diff --git a/web/src/components/DiffViewer/DiffViewer.module.scss.d.ts b/web/src/components/DiffViewer/DiffViewer.module.scss.d.ts index f41a92fec..6dbadd8a6 100644 --- a/web/src/components/DiffViewer/DiffViewer.module.scss.d.ts +++ b/web/src/components/DiffViewer/DiffViewer.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly readOnly: string - readonly collapsed: string - readonly diffHeader: string - readonly diffContent: string - readonly fname: string - readonly viewLabel: string - readonly standalone: string -} -export default styles +// This is an auto-generated file +export declare const collapsed: string +export declare const diffContent: string +export declare const diffHeader: string +export declare const fname: string +export declare const main: string +export declare const readOnly: string +export declare const standalone: string +export declare const viewLabel: string diff --git a/web/src/components/Editor/Editor.module.scss.d.ts b/web/src/components/Editor/Editor.module.scss.d.ts index bda5a5874..31c8bc978 100644 --- a/web/src/components/Editor/Editor.module.scss.d.ts +++ b/web/src/components/Editor/Editor.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly editor: string -} -export default styles +// This is an auto-generated file +export declare const editor: string diff --git a/web/src/components/ExecutionPageHeader/ExecutionPageHeader.module.scss.d.ts b/web/src/components/ExecutionPageHeader/ExecutionPageHeader.module.scss.d.ts index ef2552a90..533fcb771 100644 --- a/web/src/components/ExecutionPageHeader/ExecutionPageHeader.module.scss.d.ts +++ b/web/src/components/ExecutionPageHeader/ExecutionPageHeader.module.scss.d.ts @@ -1,11 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly pageHeader: string - readonly header: string - readonly breadcrumb: string - readonly hash: string - readonly timer: string - readonly executionInfo: string -} -export default styles +// This is an auto-generated file +export declare const breadcrumb: string +export declare const executionInfo: string +export declare const hash: string +export declare const pageHeader: string +export declare const timer: string diff --git a/web/src/components/ExecutionStageList/ExecutionStageList.module.scss.d.ts b/web/src/components/ExecutionStageList/ExecutionStageList.module.scss.d.ts index 4e9a9861f..d0367daf6 100644 --- a/web/src/components/ExecutionStageList/ExecutionStageList.module.scss.d.ts +++ b/web/src/components/ExecutionStageList/ExecutionStageList.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly menu: string - readonly menuItem: string - readonly layout: string - readonly selected: string - readonly uid: string - readonly statusIcon: string -} -export default styles +// This is an auto-generated file +export declare const container: string +export declare const layout: string +export declare const menu: string +export declare const menuItem: string +export declare const selected: string +export declare const statusIcon: string +export declare const uid: string diff --git a/web/src/components/ExecutionStatus/ExecutionStatus.module.scss.d.ts b/web/src/components/ExecutionStatus/ExecutionStatus.module.scss.d.ts index ac7aba372..40f8b815e 100644 --- a/web/src/components/ExecutionStatus/ExecutionStatus.module.scss.d.ts +++ b/web/src/components/ExecutionStatus/ExecutionStatus.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly iconOnly: string - readonly noBackground: string - readonly pending: string - readonly running: string - readonly success: string - readonly failure: string - readonly error: string -} -export default styles +// This is an auto-generated file +export declare const error: string +export declare const failure: string +export declare const iconOnly: string +export declare const main: string +export declare const noBackground: string +export declare const pending: string +export declare const running: string +export declare const success: string diff --git a/web/src/components/ExecutionStatusLabel/ExecutionStatusLabel.module.scss.d.ts b/web/src/components/ExecutionStatusLabel/ExecutionStatusLabel.module.scss.d.ts index c0b566ccf..3422cbb42 100644 --- a/web/src/components/ExecutionStatusLabel/ExecutionStatusLabel.module.scss.d.ts +++ b/web/src/components/ExecutionStatusLabel/ExecutionStatusLabel.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly executionStatus: string - readonly iconOnly: string - readonly success: string - readonly failure: string - readonly open: string -} -export default styles +// This is an auto-generated file +export declare const executionStatus: string +export declare const failure: string +export declare const iconOnly: string +export declare const open: string +export declare const success: string diff --git a/web/src/components/GitRefLink/GitRefLink.module.scss.d.ts b/web/src/components/GitRefLink/GitRefLink.module.scss.d.ts index 1be2a1bb4..36810e848 100644 --- a/web/src/components/GitRefLink/GitRefLink.module.scss.d.ts +++ b/web/src/components/GitRefLink/GitRefLink.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly link: string - readonly copyContainer: string - readonly linkText: string -} -export default styles +// This is an auto-generated file +export declare const copyContainer: string +export declare const link: string +export declare const linkText: string diff --git a/web/src/components/GitnessLogo/GitnessLogo.module.scss.d.ts b/web/src/components/GitnessLogo/GitnessLogo.module.scss.d.ts index a02e77e93..09a8f2489 100644 --- a/web/src/components/GitnessLogo/GitnessLogo.module.scss.d.ts +++ b/web/src/components/GitnessLogo/GitnessLogo.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string - readonly text: string -} -export default styles +// This is an auto-generated file +export declare const layout: string +export declare const main: string +export declare const text: string diff --git a/web/src/components/ImageCarousel/ImageCarousel.module.scss.d.ts b/web/src/components/ImageCarousel/ImageCarousel.module.scss.d.ts index 31e576836..c491b56a0 100644 --- a/web/src/components/ImageCarousel/ImageCarousel.module.scss.d.ts +++ b/web/src/components/ImageCarousel/ImageCarousel.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly imageModal: string - readonly content: string - readonly image: string - readonly vertical: string - readonly portalContainer: string -} -export default styles +// This is an auto-generated file +export declare const content: string +export declare const image: string +export declare const imageModal: string +export declare const portalContainer: string +export declare const vertical: string diff --git a/web/src/components/LatestCommit/LatestCommit.module.scss.d.ts b/web/src/components/LatestCommit/LatestCommit.module.scss.d.ts index d54c6dfda..c9d1e08f2 100644 --- a/web/src/components/LatestCommit/LatestCommit.module.scss.d.ts +++ b/web/src/components/LatestCommit/LatestCommit.module.scss.d.ts @@ -1,11 +1,8 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly latestCommit: string - readonly standalone: string - readonly forFile: string - readonly shaBtn: string - readonly commitLink: string - readonly time: string -} -export default styles +// This is an auto-generated file +export declare const commitLink: string +export declare const forFile: string +export declare const latestCommit: string +export declare const shaBtn: string +export declare const standalone: string +export declare const time: string diff --git a/web/src/components/LoadingSpinner/LoadingSpinner.module.scss.d.ts b/web/src/components/LoadingSpinner/LoadingSpinner.module.scss.d.ts index bfa8c4d6d..3398fb77e 100644 --- a/web/src/components/LoadingSpinner/LoadingSpinner.module.scss.d.ts +++ b/web/src/components/LoadingSpinner/LoadingSpinner.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly withBorder: string - readonly standalone: string - readonly layout: string - readonly text: string -} -export default styles +// This is an auto-generated file +export declare const layout: string +export declare const main: string +export declare const standalone: string +export declare const text: string +export declare const withBorder: string diff --git a/web/src/components/LogViewer/LogViewer.module.scss.d.ts b/web/src/components/LogViewer/LogViewer.module.scss.d.ts index 34b066c05..a824f1546 100644 --- a/web/src/components/LogViewer/LogViewer.module.scss.d.ts +++ b/web/src/components/LogViewer/LogViewer.module.scss.d.ts @@ -1,11 +1,8 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly section: string - readonly sectionHeader: string - readonly isOpen: string - readonly chevron: string - readonly term: string -} -export default styles +// This is an auto-generated file +export declare const chevron: string +export declare const container: string +export declare const isOpen: string +export declare const section: string +export declare const sectionHeader: string +export declare const term: string diff --git a/web/src/components/MarkdownEditorWithPreview/MarkdownEditorWithPreview.module.scss.d.ts b/web/src/components/MarkdownEditorWithPreview/MarkdownEditorWithPreview.module.scss.d.ts index f7ac500c6..f02424e85 100644 --- a/web/src/components/MarkdownEditorWithPreview/MarkdownEditorWithPreview.module.scss.d.ts +++ b/web/src/components/MarkdownEditorWithPreview/MarkdownEditorWithPreview.module.scss.d.ts @@ -1,16 +1,13 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly withPreview: string - readonly tabs: string - readonly preview: string - readonly markdownEditor: string - readonly container: string - readonly noBorder: string - readonly toolbar: string - readonly tabContent: string - readonly buttonsBar: string - readonly hidden: string -} -export default styles +// This is an auto-generated file +export declare const buttonsBar: string +export declare const container: string +export declare const hidden: string +export declare const main: string +export declare const markdownEditor: string +export declare const noBorder: string +export declare const preview: string +export declare const tabContent: string +export declare const tabs: string +export declare const toolbar: string +export declare const withPreview: string diff --git a/web/src/components/MarkdownViewer/MarkdownViewer.module.scss.d.ts b/web/src/components/MarkdownViewer/MarkdownViewer.module.scss.d.ts index de7f5e2f4..ed3bdaeaa 100644 --- a/web/src/components/MarkdownViewer/MarkdownViewer.module.scss.d.ts +++ b/web/src/components/MarkdownViewer/MarkdownViewer.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly withMaxHeight: string -} -export default styles +// This is an auto-generated file +export declare const main: string +export declare const withMaxHeight: string diff --git a/web/src/components/NavigationCheck/NavigationCheck.module.scss.d.ts b/web/src/components/NavigationCheck/NavigationCheck.module.scss.d.ts index 9e614bf2d..b8f356255 100644 --- a/web/src/components/NavigationCheck/NavigationCheck.module.scss.d.ts +++ b/web/src/components/NavigationCheck/NavigationCheck.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string -} -export default styles +// This is an auto-generated file +export declare const main: string diff --git a/web/src/components/NewRepoModalButton/NewRepoModalButton.module.scss.d.ts b/web/src/components/NewRepoModalButton/NewRepoModalButton.module.scss.d.ts index 6c0f6ebb6..b4758aa9c 100644 --- a/web/src/components/NewRepoModalButton/NewRepoModalButton.module.scss.d.ts +++ b/web/src/components/NewRepoModalButton/NewRepoModalButton.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly divider: string -} -export default styles +// This is an auto-generated file +export declare const divider: string diff --git a/web/src/components/NewSpaceModalButton/NewSpaceModalButton.module.scss.d.ts b/web/src/components/NewSpaceModalButton/NewSpaceModalButton.module.scss.d.ts index 6c0f6ebb6..b4758aa9c 100644 --- a/web/src/components/NewSpaceModalButton/NewSpaceModalButton.module.scss.d.ts +++ b/web/src/components/NewSpaceModalButton/NewSpaceModalButton.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly divider: string -} -export default styles +// This is an auto-generated file +export declare const divider: string diff --git a/web/src/components/NoResultCard/NoResultCard.module.scss.d.ts b/web/src/components/NoResultCard/NoResultCard.module.scss.d.ts index 9e614bf2d..b8f356255 100644 --- a/web/src/components/NoResultCard/NoResultCard.module.scss.d.ts +++ b/web/src/components/NoResultCard/NoResultCard.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string -} -export default styles +// This is an auto-generated file +export declare const main: string diff --git a/web/src/components/OptionsMenuButton/OptionsMenuButton.module.scss.d.ts b/web/src/components/OptionsMenuButton/OptionsMenuButton.module.scss.d.ts index 4e9c982ba..85e1c4bc1 100644 --- a/web/src/components/OptionsMenuButton/OptionsMenuButton.module.scss.d.ts +++ b/web/src/components/OptionsMenuButton/OptionsMenuButton.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly danger: string - readonly isDark: string - readonly icon: string -} -export default styles +// This is an auto-generated file +export declare const danger: string +export declare const icon: string +export declare const isDark: string diff --git a/web/src/components/PlainButton/PlainButton.module.scss.d.ts b/web/src/components/PlainButton/PlainButton.module.scss.d.ts index ffe9a05be..096a2b317 100644 --- a/web/src/components/PlainButton/PlainButton.module.scss.d.ts +++ b/web/src/components/PlainButton/PlainButton.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly btn: string - readonly prefix: string -} -export default styles +// This is an auto-generated file +export declare const btn: string +export declare const prefix: string diff --git a/web/src/components/PullRequestStateLabel/PullRequestStateLabel.module.scss.d.ts b/web/src/components/PullRequestStateLabel/PullRequestStateLabel.module.scss.d.ts index 8f5808740..f86f2c495 100644 --- a/web/src/components/PullRequestStateLabel/PullRequestStateLabel.module.scss.d.ts +++ b/web/src/components/PullRequestStateLabel/PullRequestStateLabel.module.scss.d.ts @@ -1,11 +1,8 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly prStatus: string - readonly iconOnly: string - readonly open: string - readonly merged: string - readonly closed: string - readonly draft: string -} -export default styles +// This is an auto-generated file +export declare const closed: string +export declare const draft: string +export declare const iconOnly: string +export declare const merged: string +export declare const open: string +export declare const prStatus: string diff --git a/web/src/components/RepositoryPageHeader/RepositoryPageHeader.module.scss.d.ts b/web/src/components/RepositoryPageHeader/RepositoryPageHeader.module.scss.d.ts index 5cfcac967..23b374e2e 100644 --- a/web/src/components/RepositoryPageHeader/RepositoryPageHeader.module.scss.d.ts +++ b/web/src/components/RepositoryPageHeader/RepositoryPageHeader.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly header: string - readonly breadcrumb: string -} -export default styles +// This is an auto-generated file +export declare const breadcrumb: string +export declare const header: string diff --git a/web/src/components/ResourceListingPagination/ResourceListingPagination.module.scss.d.ts b/web/src/components/ResourceListingPagination/ResourceListingPagination.module.scss.d.ts index 507297189..afc12c581 100644 --- a/web/src/components/ResourceListingPagination/ResourceListingPagination.module.scss.d.ts +++ b/web/src/components/ResourceListingPagination/ResourceListingPagination.module.scss.d.ts @@ -1,11 +1,8 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly pagination: string - readonly main: string - readonly roundedButton: string - readonly selected: string - readonly buttonLeft: string - readonly buttonRight: string -} -export default styles +// This is an auto-generated file +export declare const buttonLeft: string +export declare const buttonRight: string +export declare const main: string +export declare const pagination: string +export declare const roundedButton: string +export declare const selected: string diff --git a/web/src/components/ReviewerSelect/ReviewerSelect.module.scss.d.ts b/web/src/components/ReviewerSelect/ReviewerSelect.module.scss.d.ts index 58aba4be3..ad82a5513 100644 --- a/web/src/components/ReviewerSelect/ReviewerSelect.module.scss.d.ts +++ b/web/src/components/ReviewerSelect/ReviewerSelect.module.scss.d.ts @@ -1,18 +1,15 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly button: string - readonly prefix: string - readonly layout: string - readonly textInputMain: string - readonly main: string - readonly input: string - readonly tabContainer: string - readonly branchesOnly: string - readonly popover: string - readonly listContainer: string - readonly menuItem: string - readonly newBtnText: string - readonly avatar: string -} -export default styles +// This is an auto-generated file +export declare const avatar: string +export declare const branchesOnly: string +export declare const button: string +export declare const input: string +export declare const layout: string +export declare const listContainer: string +export declare const main: string +export declare const menuItem: string +export declare const newBtnText: string +export declare const popover: string +export declare const prefix: string +export declare const tabContainer: string +export declare const textInputMain: string diff --git a/web/src/components/SearchInputWithSpinner/SearchInputWithSpinner.module.scss.d.ts b/web/src/components/SearchInputWithSpinner/SearchInputWithSpinner.module.scss.d.ts index 031dcf0db..79473a6b6 100644 --- a/web/src/components/SearchInputWithSpinner/SearchInputWithSpinner.module.scss.d.ts +++ b/web/src/components/SearchInputWithSpinner/SearchInputWithSpinner.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string - readonly wrapper: string - readonly spinnerOnRight: string - readonly input: string -} -export default styles +// This is an auto-generated file +export declare const input: string +export declare const layout: string +export declare const main: string +export declare const spinnerOnRight: string +export declare const wrapper: string diff --git a/web/src/components/SourceCodeViewer/SourceCodeViewer.module.scss.d.ts b/web/src/components/SourceCodeViewer/SourceCodeViewer.module.scss.d.ts index 9e614bf2d..b8f356255 100644 --- a/web/src/components/SourceCodeViewer/SourceCodeViewer.module.scss.d.ts +++ b/web/src/components/SourceCodeViewer/SourceCodeViewer.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string -} -export default styles +// This is an auto-generated file +export declare const main: string diff --git a/web/src/components/SpaceSelector/SpaceSelector.module.scss.d.ts b/web/src/components/SpaceSelector/SpaceSelector.module.scss.d.ts index 5e125f983..bab2323a8 100644 --- a/web/src/components/SpaceSelector/SpaceSelector.module.scss.d.ts +++ b/web/src/components/SpaceSelector/SpaceSelector.module.scss.d.ts @@ -1,25 +1,22 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly spaceSelector: string - readonly selected: string - readonly icon: string - readonly label: string - readonly spaceLabel: string - readonly spaceName: string - readonly popoverPortal: string - readonly popoverTarget: string - readonly popoverContent: string - readonly nameContainer: string - readonly name: string - readonly pinned: string - readonly repoName: string - readonly repoScope: string - readonly desc: string - readonly table: string - readonly row: string - readonly noDesc: string - readonly iconContainer: string - readonly tableContainer: string -} -export default styles +// This is an auto-generated file +export declare const desc: string +export declare const icon: string +export declare const iconContainer: string +export declare const label: string +export declare const name: string +export declare const nameContainer: string +export declare const noDesc: string +export declare const pinned: string +export declare const popoverContent: string +export declare const popoverPortal: string +export declare const popoverTarget: string +export declare const repoName: string +export declare const repoScope: string +export declare const row: string +export declare const selected: string +export declare const spaceLabel: string +export declare const spaceName: string +export declare const spaceSelector: string +export declare const table: string +export declare const tableContainer: string diff --git a/web/src/components/TabTitleWithCount/TabTitleWithCount.module.scss.d.ts b/web/src/components/TabTitleWithCount/TabTitleWithCount.module.scss.d.ts index 25e3e4e5e..44537915e 100644 --- a/web/src/components/TabTitleWithCount/TabTitleWithCount.module.scss.d.ts +++ b/web/src/components/TabTitleWithCount/TabTitleWithCount.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly tabsContainer: string - readonly tabTitle: string - readonly count: string -} -export default styles +// This is an auto-generated file +export declare const count: string +export declare const tabsContainer: string +export declare const tabTitle: string diff --git a/web/src/components/ThreadSection/ThreadSection.module.scss.d.ts b/web/src/components/ThreadSection/ThreadSection.module.scss.d.ts index 647dda3a3..2c6fcf364 100644 --- a/web/src/components/ThreadSection/ThreadSection.module.scss.d.ts +++ b/web/src/components/ThreadSection/ThreadSection.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly thread: string - readonly content: string - readonly hideGutter: string - readonly hideTitleGutter: string - readonly titleContent: string - readonly inCommentBox: string - readonly threadLessSpace: string -} -export default styles +// This is an auto-generated file +export declare const content: string +export declare const hideGutter: string +export declare const hideTitleGutter: string +export declare const inCommentBox: string +export declare const thread: string +export declare const threadLessSpace: string +export declare const titleContent: string diff --git a/web/src/components/UserManagementFlows/UserManagementFlows.module.scss.d.ts b/web/src/components/UserManagementFlows/UserManagementFlows.module.scss.d.ts index 65a5f8529..cfe8f0471 100644 --- a/web/src/components/UserManagementFlows/UserManagementFlows.module.scss.d.ts +++ b/web/src/components/UserManagementFlows/UserManagementFlows.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly dialogCtn: string - readonly passwordCtn: string - readonly layout: string - readonly text: string - readonly formikForm: string - readonly inputWrapper: string - readonly copyBtn: string -} -export default styles +// This is an auto-generated file +export declare const copyBtn: string +export declare const dialogCtn: string +export declare const formikForm: string +export declare const inputWrapper: string +export declare const layout: string +export declare const passwordCtn: string +export declare const text: string diff --git a/web/src/layouts/layout.module.scss.d.ts b/web/src/layouts/layout.module.scss.d.ts index bcc0aec7d..51cc17116 100644 --- a/web/src/layouts/layout.module.scss.d.ts +++ b/web/src/layouts/layout.module.scss.d.ts @@ -1,11 +1,8 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string - readonly menu: string - readonly settings: string - readonly profile: string - readonly content: string -} -export default styles +// This is an auto-generated file +export declare const content: string +export declare const layout: string +export declare const main: string +export declare const menu: string +export declare const profile: string +export declare const settings: string diff --git a/web/src/layouts/menu/DefaultMenu.module.scss.d.ts b/web/src/layouts/menu/DefaultMenu.module.scss.d.ts index 156fca2b5..430ae4445 100644 --- a/web/src/layouts/menu/DefaultMenu.module.scss.d.ts +++ b/web/src/layouts/menu/DefaultMenu.module.scss.d.ts @@ -1,16 +1,13 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly spaceSelector: string - readonly selected: string - readonly icon: string - readonly label: string - readonly spaceLabel: string - readonly spaceName: string - readonly repoLinks: string - readonly popoverPortal: string - readonly popoverTarget: string - readonly popoverContent: string -} -export default styles +// This is an auto-generated file +export declare const icon: string +export declare const label: string +export declare const main: string +export declare const popoverContent: string +export declare const popoverPortal: string +export declare const popoverTarget: string +export declare const repoLinks: string +export declare const selected: string +export declare const spaceLabel: string +export declare const spaceName: string +export declare const spaceSelector: string diff --git a/web/src/layouts/menu/NavMenuItem.module.scss.d.ts b/web/src/layouts/menu/NavMenuItem.module.scss.d.ts index 97e4ad7ae..03fdea4af 100644 --- a/web/src/layouts/menu/NavMenuItem.module.scss.d.ts +++ b/web/src/layouts/menu/NavMenuItem.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly link: string - readonly subLink: string - readonly highlighted: string - readonly text: string - readonly selected: string -} -export default styles +// This is an auto-generated file +export declare const highlighted: string +export declare const link: string +export declare const selected: string +export declare const subLink: string +export declare const text: string diff --git a/web/src/pages/ChangePassword/ChangePassword.module.scss.d.ts b/web/src/pages/ChangePassword/ChangePassword.module.scss.d.ts index 0e21914d8..845c77ae3 100644 --- a/web/src/pages/ChangePassword/ChangePassword.module.scss.d.ts +++ b/web/src/pages/ChangePassword/ChangePassword.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly mainCtn: string - readonly pageCtn: string - readonly passwordCard: string -} -export default styles +// This is an auto-generated file +export declare const mainCtn: string +export declare const pageCtn: string +export declare const passwordCard: string diff --git a/web/src/pages/Compare/Compare.module.scss.d.ts b/web/src/pages/Compare/Compare.module.scss.d.ts index 92c9ac597..5e885d90b 100644 --- a/web/src/pages/Compare/Compare.module.scss.d.ts +++ b/web/src/pages/Compare/Compare.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly pageBody: string - readonly noDataContainer: string - readonly tabsContainer: string - readonly changesContainer: string - readonly generalTab: string - readonly markdownContainer: string - readonly hyperlink: string -} -export default styles +// This is an auto-generated file +export declare const changesContainer: string +export declare const generalTab: string +export declare const hyperlink: string +export declare const main: string +export declare const markdownContainer: string +export declare const noDataContainer: string +export declare const pageBody: string +export declare const tabsContainer: string diff --git a/web/src/pages/Compare/CompareContentHeader/CompareContentHeader.module.scss.d.ts b/web/src/pages/Compare/CompareContentHeader/CompareContentHeader.module.scss.d.ts index 051e591be..01618b803 100644 --- a/web/src/pages/Compare/CompareContentHeader/CompareContentHeader.module.scss.d.ts +++ b/web/src/pages/Compare/CompareContentHeader/CompareContentHeader.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly branchTagDropdown: string - readonly mergeText: string - readonly popover: string - readonly menuItem: string -} -export default styles +// This is an auto-generated file +export declare const branchTagDropdown: string +export declare const main: string +export declare const menuItem: string +export declare const mergeText: string +export declare const popover: string diff --git a/web/src/pages/Execution/Execution.module.scss.d.ts b/web/src/pages/Execution/Execution.module.scss.d.ts index 9828b69dc..8bc758703 100644 --- a/web/src/pages/Execution/Execution.module.scss.d.ts +++ b/web/src/pages/Execution/Execution.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly container: string - readonly withError: string -} -export default styles +// This is an auto-generated file +export declare const container: string +export declare const main: string +export declare const withError: string diff --git a/web/src/pages/ExecutionList/ExecutionList.module.scss.d.ts b/web/src/pages/ExecutionList/ExecutionList.module.scss.d.ts index 0fd6a5b97..a6fb32573 100644 --- a/web/src/pages/ExecutionList/ExecutionList.module.scss.d.ts +++ b/web/src/pages/ExecutionList/ExecutionList.module.scss.d.ts @@ -1,16 +1,13 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string - readonly withError: string - readonly nameContainer: string - readonly name: string - readonly pinned: string - readonly number: string - readonly desc: string - readonly author: string - readonly hash: string - readonly triggerLayout: string -} -export default styles +// This is an auto-generated file +export declare const author: string +export declare const desc: string +export declare const hash: string +export declare const layout: string +export declare const main: string +export declare const name: string +export declare const nameContainer: string +export declare const number: string +export declare const pinned: string +export declare const triggerLayout: string +export declare const withError: string diff --git a/web/src/pages/Home/Home.module.scss.d.ts b/web/src/pages/Home/Home.module.scss.d.ts index 09847d79d..e948d155b 100644 --- a/web/src/pages/Home/Home.module.scss.d.ts +++ b/web/src/pages/Home/Home.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly container: string - readonly spaceContainer: string -} -export default styles +// This is an auto-generated file +export declare const container: string +export declare const main: string +export declare const spaceContainer: string diff --git a/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts b/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts index 02a1a8a7a..6b8b7f711 100644 --- a/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts +++ b/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string -} -export default styles +// This is an auto-generated file +export declare const layout: string +export declare const main: string diff --git a/web/src/pages/PipelineList/PipelineList.module.scss.d.ts b/web/src/pages/PipelineList/PipelineList.module.scss.d.ts index 287329376..cf4eb0467 100644 --- a/web/src/pages/PipelineList/PipelineList.module.scss.d.ts +++ b/web/src/pages/PipelineList/PipelineList.module.scss.d.ts @@ -1,17 +1,14 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string - readonly withError: string - readonly nameContainer: string - readonly repoName: string - readonly desc: string - readonly avatar: string - readonly author: string - readonly hash: string - readonly triggerLayout: string - readonly spacer: string - readonly statusIcon: string -} -export default styles +// This is an auto-generated file +export declare const author: string +export declare const avatar: string +export declare const desc: string +export declare const hash: string +export declare const layout: string +export declare const main: string +export declare const nameContainer: string +export declare const repoName: string +export declare const spacer: string +export declare const statusIcon: string +export declare const triggerLayout: string +export declare const withError: string diff --git a/web/src/pages/PullRequest/Checks/Checks.module.scss.d.ts b/web/src/pages/PullRequest/Checks/Checks.module.scss.d.ts index 7473ee894..5c3376846 100644 --- a/web/src/pages/PullRequest/Checks/Checks.module.scss.d.ts +++ b/web/src/pages/PullRequest/Checks/Checks.module.scss.d.ts @@ -1,26 +1,23 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly menu: string - readonly content: string - readonly menuItem: string - readonly layout: string - readonly expanded: string - readonly chevron: string - readonly selected: string - readonly uid: string - readonly subMenu: string - readonly text: string - readonly active: string - readonly markdown: string - readonly terminal: string - readonly header: string - readonly headerLayout: string - readonly markdownContainer: string - readonly terminalContainer: string - readonly status: string - readonly invert: string - readonly noShrink: string -} -export default styles +// This is an auto-generated file +export declare const active: string +export declare const chevron: string +export declare const content: string +export declare const expanded: string +export declare const header: string +export declare const headerLayout: string +export declare const invert: string +export declare const layout: string +export declare const main: string +export declare const markdown: string +export declare const markdownContainer: string +export declare const menu: string +export declare const menuItem: string +export declare const noShrink: string +export declare const selected: string +export declare const status: string +export declare const subMenu: string +export declare const terminal: string +export declare const terminalContainer: string +export declare const text: string +export declare const uid: string diff --git a/web/src/pages/PullRequest/Checks/ChecksOverview.module.scss.d.ts b/web/src/pages/PullRequest/Checks/ChecksOverview.module.scss.d.ts index 159e04b64..c2b0d1dc9 100644 --- a/web/src/pages/PullRequest/Checks/ChecksOverview.module.scss.d.ts +++ b/web/src/pages/PullRequest/Checks/ChecksOverview.module.scss.d.ts @@ -1,16 +1,13 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly showMore: string - readonly layout: string - readonly checks: string - readonly table: string - readonly row: string - readonly rowLayout: string - readonly status: string - readonly name: string - readonly desc: string - readonly time: string -} -export default styles +// This is an auto-generated file +export declare const checks: string +export declare const desc: string +export declare const layout: string +export declare const main: string +export declare const name: string +export declare const row: string +export declare const rowLayout: string +export declare const showMore: string +export declare const status: string +export declare const table: string +export declare const time: string diff --git a/web/src/pages/PullRequest/Conversation/Conversation.module.scss.d.ts b/web/src/pages/PullRequest/Conversation/Conversation.module.scss.d.ts index c5f9bcb34..215a410af 100644 --- a/web/src/pages/PullRequest/Conversation/Conversation.module.scss.d.ts +++ b/web/src/pages/PullRequest/Conversation/Conversation.module.scss.d.ts @@ -1,30 +1,27 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly box: string - readonly desc: string - readonly mdWrapper: string - readonly menuWrapper: string - readonly selectButton: string - readonly timeButton: string - readonly timeText: string - readonly sortContainer: string - readonly sortDropdown: string - readonly bp3PopoverWrapper: string - readonly mergedBox: string - readonly mergeContainer: string - readonly descBox: string - readonly snapshot: string - readonly title: string - readonly fname: string - readonly snapshotContent: string - readonly hideDottedLine: string - readonly refreshIcon: string - readonly optionMenuIcon: string - readonly bp3Icon: string - readonly repeatBtn: string - readonly bp3ButtonText: string - readonly commitLink: string - readonly commitContainer: string -} -export default styles +// This is an auto-generated file +export declare const box: string +export declare const bp3ButtonText: string +export declare const bp3Icon: string +export declare const bp3PopoverWrapper: string +export declare const commitContainer: string +export declare const commitLink: string +export declare const desc: string +export declare const descBox: string +export declare const fname: string +export declare const hideDottedLine: string +export declare const mdWrapper: string +export declare const menuWrapper: string +export declare const mergeContainer: string +export declare const mergedBox: string +export declare const optionMenuIcon: string +export declare const refreshIcon: string +export declare const repeatBtn: string +export declare const selectButton: string +export declare const snapshot: string +export declare const snapshotContent: string +export declare const sortContainer: string +export declare const sortDropdown: string +export declare const timeButton: string +export declare const timeText: string +export declare const title: string diff --git a/web/src/pages/PullRequest/Conversation/PullRequestActionsBox/PullRequestActionsBox.module.scss.d.ts b/web/src/pages/PullRequest/Conversation/PullRequestActionsBox/PullRequestActionsBox.module.scss.d.ts index f19245d73..4d0c9ecee 100644 --- a/web/src/pages/PullRequest/Conversation/PullRequestActionsBox/PullRequestActionsBox.module.scss.d.ts +++ b/web/src/pages/PullRequest/Conversation/PullRequestActionsBox/PullRequestActionsBox.module.scss.d.ts @@ -1,24 +1,21 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly merged: string - readonly error: string - readonly closed: string - readonly draft: string - readonly unchecked: string - readonly layout: string - readonly secondaryButton: string - readonly btn: string - readonly heading: string - readonly sub: string - readonly unmergeable: string - readonly popover: string - readonly menuItem: string - readonly menuReviewItem: string - readonly btnWrapper: string - readonly hasError: string - readonly disabled: string - readonly mergeContainer: string -} -export default styles +// This is an auto-generated file +export declare const btn: string +export declare const btnWrapper: string +export declare const closed: string +export declare const disabled: string +export declare const draft: string +export declare const error: string +export declare const hasError: string +export declare const heading: string +export declare const layout: string +export declare const main: string +export declare const menuItem: string +export declare const menuReviewItem: string +export declare const mergeContainer: string +export declare const merged: string +export declare const popover: string +export declare const secondaryButton: string +export declare const sub: string +export declare const unchecked: string +export declare const unmergeable: string diff --git a/web/src/pages/PullRequest/Conversation/PullRequestSideBar/PullRequestSideBar.module.scss.d.ts b/web/src/pages/PullRequest/Conversation/PullRequestSideBar/PullRequestSideBar.module.scss.d.ts index 66328b0ac..b5497565c 100644 --- a/web/src/pages/PullRequest/Conversation/PullRequestSideBar/PullRequestSideBar.module.scss.d.ts +++ b/web/src/pages/PullRequest/Conversation/PullRequestSideBar/PullRequestSideBar.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly reviewerPadding: string - readonly reviewerName: string - readonly reviewerAvatar: string - readonly semiBoldText: string - readonly selectButton: string -} -export default styles +// This is an auto-generated file +export declare const reviewerAvatar: string +export declare const reviewerName: string +export declare const reviewerPadding: string +export declare const selectButton: string +export declare const semiBoldText: string diff --git a/web/src/pages/PullRequest/PullRequest.module.scss.d.ts b/web/src/pages/PullRequest/PullRequest.module.scss.d.ts index b30216169..e1c219d66 100644 --- a/web/src/pages/PullRequest/PullRequest.module.scss.d.ts +++ b/web/src/pages/PullRequest/PullRequest.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly prNumber: string - readonly prTitle: string - readonly btn: string - readonly input: string - readonly changes: string - readonly checksCount: string - readonly checksCountLayout: string -} -export default styles +// This is an auto-generated file +export declare const btn: string +export declare const changes: string +export declare const checksCount: string +export declare const checksCountLayout: string +export declare const input: string +export declare const main: string +export declare const prNumber: string +export declare const prTitle: string diff --git a/web/src/pages/PullRequest/PullRequestCommits/PullRequestCommits.module.scss.d.ts b/web/src/pages/PullRequest/PullRequestCommits/PullRequestCommits.module.scss.d.ts deleted file mode 100644 index 9e614bf2d..000000000 --- a/web/src/pages/PullRequest/PullRequestCommits/PullRequestCommits.module.scss.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string -} -export default styles diff --git a/web/src/pages/PullRequest/PullRequestMetaLine.module.scss.d.ts b/web/src/pages/PullRequest/PullRequestMetaLine.module.scss.d.ts index 349074ad4..28b07366b 100644 --- a/web/src/pages/PullRequest/PullRequestMetaLine.module.scss.d.ts +++ b/web/src/pages/PullRequest/PullRequestMetaLine.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly metaline: string - readonly time: string - readonly layout: string - readonly copyContainer: string - readonly linkText: string - readonly link: string -} -export default styles +// This is an auto-generated file +export declare const copyContainer: string +export declare const layout: string +export declare const link: string +export declare const linkText: string +export declare const main: string +export declare const metaline: string +export declare const time: string diff --git a/web/src/pages/PullRequests/PullRequests.module.scss.d.ts b/web/src/pages/PullRequests/PullRequests.module.scss.d.ts index 344c7d347..76549f71b 100644 --- a/web/src/pages/PullRequests/PullRequests.module.scss.d.ts +++ b/web/src/pages/PullRequests/PullRequests.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly table: string - readonly row: string - readonly title: string - readonly convoIcon: string - readonly titleRow: string - readonly state: string -} -export default styles +// This is an auto-generated file +export declare const convoIcon: string +export declare const main: string +export declare const row: string +export declare const state: string +export declare const table: string +export declare const title: string +export declare const titleRow: string diff --git a/web/src/pages/PullRequests/PullRequestsContentHeader/PullRequestsContentHeader.module.scss.d.ts b/web/src/pages/PullRequests/PullRequestsContentHeader/PullRequestsContentHeader.module.scss.d.ts index 4978d5867..35b79d412 100644 --- a/web/src/pages/PullRequests/PullRequestsContentHeader/PullRequestsContentHeader.module.scss.d.ts +++ b/web/src/pages/PullRequests/PullRequestsContentHeader/PullRequestsContentHeader.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly branchDropdown: string -} -export default styles +// This is an auto-generated file +export declare const branchDropdown: string +export declare const main: string diff --git a/web/src/pages/RepositoriesListing/RepositoriesListing.module.scss.d.ts b/web/src/pages/RepositoriesListing/RepositoriesListing.module.scss.d.ts index d271d3470..14776345b 100644 --- a/web/src/pages/RepositoriesListing/RepositoriesListing.module.scss.d.ts +++ b/web/src/pages/RepositoriesListing/RepositoriesListing.module.scss.d.ts @@ -1,18 +1,15 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string - readonly input: string - readonly withError: string - readonly table: string - readonly row: string - readonly noDesc: string - readonly nameContainer: string - readonly name: string - readonly pinned: string - readonly repoName: string - readonly repoScope: string - readonly desc: string -} -export default styles +// This is an auto-generated file +export declare const desc: string +export declare const input: string +export declare const layout: string +export declare const main: string +export declare const name: string +export declare const nameContainer: string +export declare const noDesc: string +export declare const pinned: string +export declare const repoName: string +export declare const repoScope: string +export declare const row: string +export declare const table: string +export declare const withError: string diff --git a/web/src/pages/Repository/EmptyRepositoryInfo.module.scss.d.ts b/web/src/pages/Repository/EmptyRepositoryInfo.module.scss.d.ts index 722eeb01a..d9ecd041c 100644 --- a/web/src/pages/Repository/EmptyRepositoryInfo.module.scss.d.ts +++ b/web/src/pages/Repository/EmptyRepositoryInfo.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly emptyRepo: string - readonly divContainer: string - readonly textContainer: string - readonly layout: string - readonly url: string - readonly cloneCopyButton: string - readonly text: string -} -export default styles +// This is an auto-generated file +export declare const cloneCopyButton: string +export declare const divContainer: string +export declare const emptyRepo: string +export declare const layout: string +export declare const text: string +export declare const textContainer: string +export declare const url: string diff --git a/web/src/pages/Repository/Repository.module.scss.d.ts b/web/src/pages/Repository/Repository.module.scss.d.ts index dda8375c2..98ce1314e 100644 --- a/web/src/pages/Repository/Repository.module.scss.d.ts +++ b/web/src/pages/Repository/Repository.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly withFileViewer: string - readonly bannerContainer: string - readonly layout: string - readonly url: string - readonly cloneCopyButton: string - readonly text: string -} -export default styles +// This is an auto-generated file +export declare const bannerContainer: string +export declare const cloneCopyButton: string +export declare const layout: string +export declare const main: string +export declare const text: string +export declare const url: string +export declare const withFileViewer: string diff --git a/web/src/pages/Repository/RepositoryContent/ContentHeader/ContentHeader.module.scss.d.ts b/web/src/pages/Repository/RepositoryContent/ContentHeader/ContentHeader.module.scss.d.ts index d040cb4fa..3de56dd26 100644 --- a/web/src/pages/Repository/RepositoryContent/ContentHeader/ContentHeader.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryContent/ContentHeader/ContentHeader.module.scss.d.ts @@ -1,10 +1,7 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly btnColorFix: string - readonly refRoot: string - readonly rootSlash: string - readonly breadcrumbItem: string -} -export default styles +// This is an auto-generated file +export declare const breadcrumbItem: string +export declare const btnColorFix: string +export declare const main: string +export declare const refRoot: string +export declare const rootSlash: string diff --git a/web/src/pages/Repository/RepositoryContent/FileContent/FileContent.module.scss.d.ts b/web/src/pages/Repository/RepositoryContent/FileContent/FileContent.module.scss.d.ts index 9d45e77c1..6d30262e4 100644 --- a/web/src/pages/Repository/RepositoryContent/FileContent/FileContent.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryContent/FileContent/FileContent.module.scss.d.ts @@ -1,15 +1,12 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly heading: string - readonly content: string - readonly fileContent: string - readonly gitBlame: string - readonly gitCommit: string - readonly gitHistory: string - readonly tabsContainer: string - readonly tabTitle: string - readonly count: string -} -export default styles +// This is an auto-generated file +export declare const container: string +export declare const content: string +export declare const count: string +export declare const fileContent: string +export declare const gitBlame: string +export declare const gitCommit: string +export declare const gitHistory: string +export declare const heading: string +export declare const tabsContainer: string +export declare const tabTitle: string diff --git a/web/src/pages/Repository/RepositoryContent/FileContent/GitBlame.module.scss.d.ts b/web/src/pages/Repository/RepositoryContent/FileContent/GitBlame.module.scss.d.ts index f3b5e70e3..17651f703 100644 --- a/web/src/pages/Repository/RepositoryContent/FileContent/GitBlame.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryContent/FileContent/GitBlame.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly lineNo: string - readonly gitBlame: string - readonly layout: string - readonly blameColumn: string - readonly blameBox: string - readonly blameBoxLayout: string - readonly blameCommitPortalClass: string -} -export default styles +// This is an auto-generated file +export declare const blameBox: string +export declare const blameBoxLayout: string +export declare const blameColumn: string +export declare const blameCommitPortalClass: string +export declare const codeViewer: string +export declare const layout: string +export declare const lineNo: string +export declare const main: string diff --git a/web/src/pages/Repository/RepositoryContent/FileContent/RenameContentHistory.module.scss.d.ts b/web/src/pages/Repository/RepositoryContent/FileContent/RenameContentHistory.module.scss.d.ts index 902301075..d5b6ec8e1 100644 --- a/web/src/pages/Repository/RepositoryContent/FileContent/RenameContentHistory.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryContent/FileContent/RenameContentHistory.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly contentSection: string - readonly hideText: string - readonly lineDiv: string -} -export default styles +// This is an auto-generated file +export declare const contentSection: string +export declare const hideText: string +export declare const lineDiv: string diff --git a/web/src/pages/Repository/RepositoryContent/FolderContent/FolderContent.module.scss.d.ts b/web/src/pages/Repository/RepositoryContent/FolderContent/FolderContent.module.scss.d.ts index c51cbf46b..a6c636d55 100644 --- a/web/src/pages/Repository/RepositoryContent/FolderContent/FolderContent.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryContent/FolderContent/FolderContent.module.scss.d.ts @@ -1,19 +1,16 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly folderContent: string - readonly table: string - readonly row: string - readonly rowText: string - readonly readmeContainer: string - readonly heading: string - readonly readmeContent: string - readonly commitMsgLayout: string - readonly linkContainer: string - readonly noShrink: string - readonly link: string - readonly text: string - readonly hightlight: string - readonly commitContainer: string -} -export default styles +// This is an auto-generated file +export declare const commitContainer: string +export declare const commitMsgLayout: string +export declare const folderContent: string +export declare const heading: string +export declare const hightlight: string +export declare const link: string +export declare const linkContainer: string +export declare const noShrink: string +export declare const readmeContainer: string +export declare const readmeContent: string +export declare const row: string +export declare const rowText: string +export declare const table: string +export declare const text: string diff --git a/web/src/pages/Repository/RepositoryContent/FolderContent/Readme.module.scss.d.ts b/web/src/pages/Repository/RepositoryContent/FolderContent/Readme.module.scss.d.ts index 58fa68ded..fbb5137f6 100644 --- a/web/src/pages/Repository/RepositoryContent/FolderContent/Readme.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryContent/FolderContent/Readme.module.scss.d.ts @@ -1,9 +1,6 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly readmeContainer: string - readonly contentOnly: string - readonly heading: string - readonly readmeContent: string -} -export default styles +// This is an auto-generated file +export declare const contentOnly: string +export declare const heading: string +export declare const readmeContainer: string +export declare const readmeContent: string diff --git a/web/src/pages/Repository/RepositoryContent/RepositoryContent.module.scss.d.ts b/web/src/pages/Repository/RepositoryContent/RepositoryContent.module.scss.d.ts index 442d643fe..86727e67c 100644 --- a/web/src/pages/Repository/RepositoryContent/RepositoryContent.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryContent/RepositoryContent.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly resourceContent: string -} -export default styles +// This is an auto-generated file +export declare const resourceContent: string diff --git a/web/src/pages/Repository/RepositoryHeader/RepositoryHeader.module.scss.d.ts b/web/src/pages/Repository/RepositoryHeader/RepositoryHeader.module.scss.d.ts index 3ca74d6f5..bb288a9b4 100644 --- a/web/src/pages/Repository/RepositoryHeader/RepositoryHeader.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryHeader/RepositoryHeader.module.scss.d.ts @@ -1,9 +1,6 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly name: string - readonly breadcrumb: string - readonly repoDropdown: string - readonly targetClassName: string -} -export default styles +// This is an auto-generated file +export declare const breadcrumb: string +export declare const name: string +export declare const repoDropdown: string +export declare const targetClassName: string diff --git a/web/src/pages/Repository/RepositoryTree/ResourceTree.module.scss.d.ts b/web/src/pages/Repository/RepositoryTree/ResourceTree.module.scss.d.ts index b3e048c95..dda74c4cb 100644 --- a/web/src/pages/Repository/RepositoryTree/ResourceTree.module.scss.d.ts +++ b/web/src/pages/Repository/RepositoryTree/ResourceTree.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly tabContent: string - readonly resourceTree: string - readonly repoBranch: string - readonly dropdown: string - readonly branchDropdown: string - readonly fileTree: string - readonly fileNewActions: string -} -export default styles +// This is an auto-generated file +export declare const branchDropdown: string +export declare const dropdown: string +export declare const fileNewActions: string +export declare const fileTree: string +export declare const repoBranch: string +export declare const resourceTree: string +export declare const tabContent: string diff --git a/web/src/pages/RepositoryBranches/RepositoryBranches.module.scss.d.ts b/web/src/pages/RepositoryBranches/RepositoryBranches.module.scss.d.ts index 9e614bf2d..b8f356255 100644 --- a/web/src/pages/RepositoryBranches/RepositoryBranches.module.scss.d.ts +++ b/web/src/pages/RepositoryBranches/RepositoryBranches.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string -} -export default styles +// This is an auto-generated file +export declare const main: string diff --git a/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContent/BranchesContent.module.scss.d.ts b/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContent/BranchesContent.module.scss.d.ts index 38f5d8d96..9c5fd7c97 100644 --- a/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContent/BranchesContent.module.scss.d.ts +++ b/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContent/BranchesContent.module.scss.d.ts @@ -1,13 +1,10 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly table: string - readonly row: string - readonly odd: string - readonly rowText: string - readonly defaultBranch: string - readonly commitLink: string - readonly spacer: string -} -export default styles +// This is an auto-generated file +export declare const commitLink: string +export declare const container: string +export declare const defaultBranch: string +export declare const odd: string +export declare const row: string +export declare const rowText: string +export declare const spacer: string +export declare const table: string diff --git a/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContentHeader/BranchesContentHeader.module.scss.d.ts b/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContentHeader/BranchesContentHeader.module.scss.d.ts index 4978d5867..35b79d412 100644 --- a/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContentHeader/BranchesContentHeader.module.scss.d.ts +++ b/web/src/pages/RepositoryBranches/RepositoryBranchesContent/BranchesContentHeader/BranchesContentHeader.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly branchDropdown: string -} -export default styles +// This is an auto-generated file +export declare const branchDropdown: string +export declare const main: string diff --git a/web/src/pages/RepositoryBranches/RepositoryBranchesContent/RepositoryBranchesContent.module.scss.d.ts b/web/src/pages/RepositoryBranches/RepositoryBranchesContent/RepositoryBranchesContent.module.scss.d.ts index 74c2ff5a1..57738655e 100644 --- a/web/src/pages/RepositoryBranches/RepositoryBranchesContent/RepositoryBranchesContent.module.scss.d.ts +++ b/web/src/pages/RepositoryBranches/RepositoryBranchesContent/RepositoryBranchesContent.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly resourceContent: string - readonly noData: string -} -export default styles +// This is an auto-generated file +export declare const noData: string +export declare const resourceContent: string diff --git a/web/src/pages/RepositoryCommit/RepositoryCommit.module.scss.d.ts b/web/src/pages/RepositoryCommit/RepositoryCommit.module.scss.d.ts index 181c271c5..0bb6572fe 100644 --- a/web/src/pages/RepositoryCommit/RepositoryCommit.module.scss.d.ts +++ b/web/src/pages/RepositoryCommit/RepositoryCommit.module.scss.d.ts @@ -1,9 +1,6 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly resourceContent: string - readonly contentHeader: string - readonly changesContainer: string -} -export default styles +// This is an auto-generated file +export declare const changesContainer: string +export declare const contentHeader: string +export declare const main: string +export declare const resourceContent: string diff --git a/web/src/pages/RepositoryCommits/RepositoryCommits.module.scss.d.ts b/web/src/pages/RepositoryCommits/RepositoryCommits.module.scss.d.ts index 181c271c5..0bb6572fe 100644 --- a/web/src/pages/RepositoryCommits/RepositoryCommits.module.scss.d.ts +++ b/web/src/pages/RepositoryCommits/RepositoryCommits.module.scss.d.ts @@ -1,9 +1,6 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly resourceContent: string - readonly contentHeader: string - readonly changesContainer: string -} -export default styles +// This is an auto-generated file +export declare const changesContainer: string +export declare const contentHeader: string +export declare const main: string +export declare const resourceContent: string diff --git a/web/src/pages/RepositoryFileEdit/FileEditor/FileEditor.module.scss.d.ts b/web/src/pages/RepositoryFileEdit/FileEditor/FileEditor.module.scss.d.ts index 17c081bed..08e003755 100644 --- a/web/src/pages/RepositoryFileEdit/FileEditor/FileEditor.module.scss.d.ts +++ b/web/src/pages/RepositoryFileEdit/FileEditor/FileEditor.module.scss.d.ts @@ -1,14 +1,11 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly heading: string - readonly path: string - readonly inputContainer: string - readonly refLink: string - readonly breadcrumbItem: string - readonly tabs: string - readonly selectedView: string - readonly editorContainer: string -} -export default styles +// This is an auto-generated file +export declare const breadcrumbItem: string +export declare const container: string +export declare const editorContainer: string +export declare const heading: string +export declare const inputContainer: string +export declare const path: string +export declare const refLink: string +export declare const selectedView: string +export declare const tabs: string diff --git a/web/src/pages/RepositoryFileEdit/RepositoryFileEdit.module.scss.d.ts b/web/src/pages/RepositoryFileEdit/RepositoryFileEdit.module.scss.d.ts index 88ce32e45..c094ba0bd 100644 --- a/web/src/pages/RepositoryFileEdit/RepositoryFileEdit.module.scss.d.ts +++ b/web/src/pages/RepositoryFileEdit/RepositoryFileEdit.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly resourceContent: string -} -export default styles +// This is an auto-generated file +export declare const main: string +export declare const resourceContent: string diff --git a/web/src/pages/RepositoryFileEdit/RepositoryFileEditHeader/RepositoryFileEditHeader.module.scss.d.ts b/web/src/pages/RepositoryFileEdit/RepositoryFileEditHeader/RepositoryFileEditHeader.module.scss.d.ts index b646941ad..7f4c418c1 100644 --- a/web/src/pages/RepositoryFileEdit/RepositoryFileEditHeader/RepositoryFileEditHeader.module.scss.d.ts +++ b/web/src/pages/RepositoryFileEdit/RepositoryFileEditHeader/RepositoryFileEditHeader.module.scss.d.ts @@ -1,9 +1,6 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly header: string - readonly breadcrumb: string - readonly repoDropdown: string - readonly targetClassName: string -} -export default styles +// This is an auto-generated file +export declare const breadcrumb: string +export declare const header: string +export declare const repoDropdown: string +export declare const targetClassName: string diff --git a/web/src/pages/RepositorySettings/RepositorySettings.module.scss.d.ts b/web/src/pages/RepositorySettings/RepositorySettings.module.scss.d.ts index 1e467f0ea..e979183c4 100644 --- a/web/src/pages/RepositorySettings/RepositorySettings.module.scss.d.ts +++ b/web/src/pages/RepositorySettings/RepositorySettings.module.scss.d.ts @@ -1,17 +1,14 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly webhooksContent: string - readonly btn: string - readonly webhookHeader: string - readonly contentContainer: string - readonly generalContainer: string - readonly label: string - readonly content: string - readonly deleteContainer: string - readonly saveBtn: string - readonly textContainer: string - readonly buttonContainer: string -} -export default styles +// This is an auto-generated file +export declare const btn: string +export declare const buttonContainer: string +export declare const content: string +export declare const contentContainer: string +export declare const deleteContainer: string +export declare const generalContainer: string +export declare const label: string +export declare const main: string +export declare const saveBtn: string +export declare const textContainer: string +export declare const webhookHeader: string +export declare const webhooksContent: string diff --git a/web/src/pages/RepositoryTags/RepositoryTags.module.scss.d.ts b/web/src/pages/RepositoryTags/RepositoryTags.module.scss.d.ts index 9e614bf2d..b8f356255 100644 --- a/web/src/pages/RepositoryTags/RepositoryTags.module.scss.d.ts +++ b/web/src/pages/RepositoryTags/RepositoryTags.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string -} -export default styles +// This is an auto-generated file +export declare const main: string diff --git a/web/src/pages/RepositoryTags/RepositoryTagsContent/RepositoryTagsContent.module.scss.d.ts b/web/src/pages/RepositoryTags/RepositoryTagsContent/RepositoryTagsContent.module.scss.d.ts index 74c2ff5a1..57738655e 100644 --- a/web/src/pages/RepositoryTags/RepositoryTagsContent/RepositoryTagsContent.module.scss.d.ts +++ b/web/src/pages/RepositoryTags/RepositoryTagsContent/RepositoryTagsContent.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly resourceContent: string - readonly noData: string -} -export default styles +// This is an auto-generated file +export declare const noData: string +export declare const resourceContent: string diff --git a/web/src/pages/RepositoryTags/RepositoryTagsContentHeader/RepositoryTagsContentHeader.module.scss.d.ts b/web/src/pages/RepositoryTags/RepositoryTagsContentHeader/RepositoryTagsContentHeader.module.scss.d.ts index 4978d5867..35b79d412 100644 --- a/web/src/pages/RepositoryTags/RepositoryTagsContentHeader/RepositoryTagsContentHeader.module.scss.d.ts +++ b/web/src/pages/RepositoryTags/RepositoryTagsContentHeader/RepositoryTagsContentHeader.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly branchDropdown: string -} -export default styles +// This is an auto-generated file +export declare const branchDropdown: string +export declare const main: string diff --git a/web/src/pages/RepositoryTags/TagsContent/TagsContent.module.scss.d.ts b/web/src/pages/RepositoryTags/TagsContent/TagsContent.module.scss.d.ts index b5cab23be..fb5185333 100644 --- a/web/src/pages/RepositoryTags/TagsContent/TagsContent.module.scss.d.ts +++ b/web/src/pages/RepositoryTags/TagsContent/TagsContent.module.scss.d.ts @@ -1,14 +1,11 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly container: string - readonly table: string - readonly row: string - readonly odd: string - readonly rowText: string - readonly defaultBranch: string - readonly commitLink: string - readonly spacer: string - readonly popover: string -} -export default styles +// This is an auto-generated file +export declare const commitLink: string +export declare const container: string +export declare const defaultBranch: string +export declare const odd: string +export declare const popover: string +export declare const row: string +export declare const rowText: string +export declare const spacer: string +export declare const table: string diff --git a/web/src/pages/Secret/Secret.module.scss.d.ts b/web/src/pages/Secret/Secret.module.scss.d.ts index 9e614bf2d..b8f356255 100644 --- a/web/src/pages/Secret/Secret.module.scss.d.ts +++ b/web/src/pages/Secret/Secret.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string -} -export default styles +// This is an auto-generated file +export declare const main: string diff --git a/web/src/pages/SecretList/SecretList.module.scss.d.ts b/web/src/pages/SecretList/SecretList.module.scss.d.ts index c83440288..0e9e3687f 100644 --- a/web/src/pages/SecretList/SecretList.module.scss.d.ts +++ b/web/src/pages/SecretList/SecretList.module.scss.d.ts @@ -1,17 +1,14 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly layout: string - readonly withError: string - readonly table: string - readonly row: string - readonly noDesc: string - readonly nameContainer: string - readonly name: string - readonly pinned: string - readonly repoName: string - readonly repoScope: string - readonly desc: string -} -export default styles +// This is an auto-generated file +export declare const desc: string +export declare const layout: string +export declare const main: string +export declare const name: string +export declare const nameContainer: string +export declare const noDesc: string +export declare const pinned: string +export declare const repoName: string +export declare const repoScope: string +export declare const row: string +export declare const table: string +export declare const withError: string diff --git a/web/src/pages/SignIn/SignIn.module.scss.d.ts b/web/src/pages/SignIn/SignIn.module.scss.d.ts index e5b3ce6ea..cc9924b1b 100644 --- a/web/src/pages/SignIn/SignIn.module.scss.d.ts +++ b/web/src/pages/SignIn/SignIn.module.scss.d.ts @@ -1,6 +1,3 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly signInContainer: string -} -export default styles +// This is an auto-generated file +export declare const signInContainer: string diff --git a/web/src/pages/SignUp/SignUp.module.scss.d.ts b/web/src/pages/SignUp/SignUp.module.scss.d.ts index 5c78e2391..22c53bc5f 100644 --- a/web/src/pages/SignUp/SignUp.module.scss.d.ts +++ b/web/src/pages/SignUp/SignUp.module.scss.d.ts @@ -1,12 +1,9 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly root: string - readonly input: string - readonly submit: string - readonly field: string - readonly actions: string - readonly logo: string - readonly signUpContainer: string -} -export default styles +// This is an auto-generated file +export declare const actions: string +export declare const field: string +export declare const input: string +export declare const logo: string +export declare const root: string +export declare const signUpContainer: string +export declare const submit: string diff --git a/web/src/pages/SpaceAccessControl/SpaceAccessControl.module.scss.d.ts b/web/src/pages/SpaceAccessControl/SpaceAccessControl.module.scss.d.ts index c98647169..0f8db1288 100644 --- a/web/src/pages/SpaceAccessControl/SpaceAccessControl.module.scss.d.ts +++ b/web/src/pages/SpaceAccessControl/SpaceAccessControl.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly mainCtn: string - readonly roleBadge: string -} -export default styles +// This is an auto-generated file +export declare const mainCtn: string +export declare const roleBadge: string diff --git a/web/src/pages/SpaceSettings/SpaceSettings.module.scss.d.ts b/web/src/pages/SpaceSettings/SpaceSettings.module.scss.d.ts index 9400ac434..1d08872c3 100644 --- a/web/src/pages/SpaceSettings/SpaceSettings.module.scss.d.ts +++ b/web/src/pages/SpaceSettings/SpaceSettings.module.scss.d.ts @@ -1,17 +1,14 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly mainCtn: string - readonly roleBadge: string - readonly label: string - readonly content: string - readonly deleteContainer: string - readonly deleteBtn: string - readonly saveBtn: string - readonly textContainer: string - readonly buttonContainer: string - readonly generalContainer: string - readonly yellowContainer: string - readonly verticalContainer: string -} -export default styles +// This is an auto-generated file +export declare const buttonContainer: string +export declare const content: string +export declare const deleteBtn: string +export declare const deleteContainer: string +export declare const generalContainer: string +export declare const label: string +export declare const mainCtn: string +export declare const roleBadge: string +export declare const saveBtn: string +export declare const textContainer: string +export declare const verticalContainer: string +export declare const yellowContainer: string diff --git a/web/src/pages/UserProfile/UserProfile.module.scss.d.ts b/web/src/pages/UserProfile/UserProfile.module.scss.d.ts index 97b39dc06..9049adcd4 100644 --- a/web/src/pages/UserProfile/UserProfile.module.scss.d.ts +++ b/web/src/pages/UserProfile/UserProfile.module.scss.d.ts @@ -1,14 +1,11 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly mainCtn: string - readonly pageCtn: string - readonly table: string - readonly profileCard: string - readonly detailsCtn: string - readonly detailField: string - readonly editableTextWrapper: string - readonly textInput: string - readonly logoutCard: string -} -export default styles +// This is an auto-generated file +export declare const detailField: string +export declare const detailsCtn: string +export declare const editableTextWrapper: string +export declare const logoutCard: string +export declare const mainCtn: string +export declare const pageCtn: string +export declare const profileCard: string +export declare const table: string +export declare const textInput: string diff --git a/web/src/pages/UsersListing/UsersListing.module.scss.d.ts b/web/src/pages/UsersListing/UsersListing.module.scss.d.ts index 4f0a27a5e..0783ee09b 100644 --- a/web/src/pages/UsersListing/UsersListing.module.scss.d.ts +++ b/web/src/pages/UsersListing/UsersListing.module.scss.d.ts @@ -1,7 +1,4 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly mainCtn: string - readonly adminBadge: string -} -export default styles +// This is an auto-generated file +export declare const adminBadge: string +export declare const mainCtn: string diff --git a/web/src/pages/WebhookNew/WehookForm.module.scss.d.ts b/web/src/pages/WebhookNew/WehookForm.module.scss.d.ts index 24c30f4f8..60f7ac8ec 100644 --- a/web/src/pages/WebhookNew/WehookForm.module.scss.d.ts +++ b/web/src/pages/WebhookNew/WehookForm.module.scss.d.ts @@ -1,23 +1,20 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly form: string - readonly title: string - readonly label: string - readonly eventRadioGroup: string - readonly addVerticalAlign: string - readonly sslVerificationLabel: string - readonly checkbox: string - readonly breadcrumb: string - readonly resourceContent: string - readonly header: string - readonly container: string - readonly heading: string - readonly path: string - readonly inputContainer: string - readonly refLink: string - readonly content: string - readonly editorContainer: string -} -export default styles +// This is an auto-generated file +export declare const addVerticalAlign: string +export declare const breadcrumb: string +export declare const checkbox: string +export declare const container: string +export declare const content: string +export declare const editorContainer: string +export declare const eventRadioGroup: string +export declare const form: string +export declare const header: string +export declare const heading: string +export declare const inputContainer: string +export declare const label: string +export declare const main: string +export declare const path: string +export declare const refLink: string +export declare const resourceContent: string +export declare const sslVerificationLabel: string +export declare const title: string diff --git a/web/src/pages/Webhooks/Webhooks.module.scss.d.ts b/web/src/pages/Webhooks/Webhooks.module.scss.d.ts index 0fb00c176..3e7cb06bd 100644 --- a/web/src/pages/Webhooks/Webhooks.module.scss.d.ts +++ b/web/src/pages/Webhooks/Webhooks.module.scss.d.ts @@ -1,14 +1,11 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly table: string - readonly row: string - readonly title: string - readonly noData: string - readonly toggle: string - readonly toggleEnable: string - readonly toggleDisable: string - readonly cancelButton: string -} -export default styles +// This is an auto-generated file +export declare const cancelButton: string +export declare const main: string +export declare const noData: string +export declare const row: string +export declare const table: string +export declare const title: string +export declare const toggle: string +export declare const toggleDisable: string +export declare const toggleEnable: string diff --git a/web/src/pages/Webhooks/WebhooksHeader/WebhooksHeader.module.scss.d.ts b/web/src/pages/Webhooks/WebhooksHeader/WebhooksHeader.module.scss.d.ts index b6413ae9e..dcef91bf3 100644 --- a/web/src/pages/Webhooks/WebhooksHeader/WebhooksHeader.module.scss.d.ts +++ b/web/src/pages/Webhooks/WebhooksHeader/WebhooksHeader.module.scss.d.ts @@ -1,8 +1,5 @@ /* eslint-disable */ -// this is an auto-generated file -declare const styles: { - readonly main: string - readonly input: string - readonly branchDropdown: string -} -export default styles +// This is an auto-generated file +export declare const branchDropdown: string +export declare const input: string +export declare const main: string diff --git a/web/src/utils/test/testUtils.module.scss.d.ts b/web/src/utils/test/testUtils.module.scss.d.ts new file mode 100644 index 000000000..32b6f277c --- /dev/null +++ b/web/src/utils/test/testUtils.module.scss.d.ts @@ -0,0 +1,6 @@ +/* eslint-disable */ +// This is an auto-generated file +export declare const browser: string +export declare const browserContent: string +export declare const browserHeader: string +export declare const browserPath: string diff --git a/web/typed-scss-modules.config.js b/web/typed-scss-modules.config.js new file mode 100644 index 000000000..99799569f --- /dev/null +++ b/web/typed-scss-modules.config.js @@ -0,0 +1,4 @@ +export const config = { + banner: '/* eslint-disable */\r\n// This is an auto-generated file', + logLevel: 'error' +} diff --git a/web/yarn.lock b/web/yarn.lock index b28574b68..89ea36a8a 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -622,6 +622,11 @@ resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1499,9 +1504,9 @@ dependencies: react-monaco-editor "*" -"@types/react-router-dom@^5.1.7": +"@types/react-router-dom@^5.2.1": version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== dependencies: "@types/history" "^4.7.11" @@ -2307,6 +2312,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2763,6 +2773,13 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +bundle-require@^3.0.4: + version "3.1.2" + resolved "https://registry.npmjs.org/bundle-require/-/bundle-require-3.1.2.tgz#1374a7bdcb8b330a7ccc862ccbf7c137cc43ad27" + integrity sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA== + dependencies: + load-tsconfig "^0.2.0" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -2842,6 +2859,15 @@ canvas@^2.11.2: version "0.0.0" uid "" +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -2869,6 +2895,25 @@ ccount@^2.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2886,13 +2931,23 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: +change-case@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" char-regex@^1.0.2: version "1.0.2" @@ -3195,6 +3250,15 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -3318,6 +3382,18 @@ css-loader@^6.3.0: postcss-value-parser "^4.2.0" semver "^7.3.8" +css-modules-loader-core@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + integrity sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew== + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + css-select@^4.1.3: version "4.3.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" @@ -3334,6 +3410,14 @@ css-selector-parser@^1.0.0: resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== +css-selector-tokenizer@^0.7.0: + version "0.7.3" + resolved "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + css-what@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" @@ -3898,6 +3982,133 @@ es6-promise@^3.2.1: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + +esbuild-darwin-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" + integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== + +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + +esbuild@^0.14.21: + version "0.14.54" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" + integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== + optionalDependencies: + "@esbuild/linux-loong64" "0.14.54" + esbuild-android-64 "0.14.54" + esbuild-android-arm64 "0.14.54" + esbuild-darwin-64 "0.14.54" + esbuild-darwin-arm64 "0.14.54" + esbuild-freebsd-64 "0.14.54" + esbuild-freebsd-arm64 "0.14.54" + esbuild-linux-32 "0.14.54" + esbuild-linux-64 "0.14.54" + esbuild-linux-arm "0.14.54" + esbuild-linux-arm64 "0.14.54" + esbuild-linux-mips64le "0.14.54" + esbuild-linux-ppc64le "0.14.54" + esbuild-linux-riscv64 "0.14.54" + esbuild-linux-s390x "0.14.54" + esbuild-netbsd-64 "0.14.54" + esbuild-openbsd-64 "0.14.54" + esbuild-sunos-64 "0.14.54" + esbuild-windows-32 "0.14.54" + esbuild-windows-64 "0.14.54" + esbuild-windows-arm64 "0.14.54" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -3908,7 +4119,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -4417,6 +4628,11 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -4917,11 +5133,23 @@ harmony-reflect@^1.4.6: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -5112,6 +5340,14 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + highlight.js@11.6.0: version "11.6.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a" @@ -5352,6 +5588,11 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" @@ -6423,6 +6664,11 @@ jest@^26.2.0: import-local "^3.0.2" jest-cli "^26.6.3" +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6709,6 +6955,11 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +load-tsconfig@^0.2.0: + version "0.2.5" + resolved "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -7465,10 +7716,10 @@ moment@^2.25.3: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -monaco-editor-webpack-plugin@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.0.1.tgz#ba19c60aba990184e36ad8722b1ed6a564527c7c" - integrity sha512-M8qIqizltrPlIbrb73cZdTWfU9sIsUVFvAZkL3KGjAHmVWEJ0hZKa/uad14JuOckc0GwnCaoGHvMoYtJjVyCzw== +monaco-editor-webpack-plugin@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.1.0.tgz#16f265c2b5dbb5fe08681b6b3b7d00d3c5b2ee97" + integrity sha512-ZjnGINHN963JQkFqjjcBtn1XBtUATDZBMgNQhDQwd78w2ukRhFXAPNgWuacaQiDZsUr4h1rWv5Mv6eriKuOSzA== dependencies: loader-utils "^2.0.2" @@ -8085,6 +8336,14 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -8216,11 +8475,26 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA== + dependencies: + postcss "^6.0.1" + postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-local-by-default@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-local-by-default@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" @@ -8230,6 +8504,14 @@ postcss-modules-local-by-default@^4.0.0: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" +postcss-modules-scope@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw== + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-scope@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" @@ -8237,6 +8519,14 @@ postcss-modules-scope@^3.0.0: dependencies: postcss-selector-parser "^6.0.4" +postcss-modules-values@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + postcss-modules-values@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" @@ -8257,6 +8547,24 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + integrity sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw== + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + postcss@^8.4.19: version "8.4.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" @@ -9043,6 +9351,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reserved-words@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" + integrity sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw== + resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -9346,6 +9659,15 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + serialize-javascript@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" @@ -9524,6 +9846,14 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -9893,7 +10223,19 @@ style-to-object@^0.4.0: dependencies: inline-style-parser "0.1.1" -supports-color@^5.3.0: +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -10289,6 +10631,23 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +typed-scss-modules@^7.1.4: + version "7.1.4" + resolved "https://registry.npmjs.org/typed-scss-modules/-/typed-scss-modules-7.1.4.tgz#b2f9017b3d45c5014bd284ef3e4402d34337568f" + integrity sha512-7IjCBxxnNPV5iY1b6Vz2HufXku04iYF8EmWIPkqWtVlM6cX+azKbSVhIIGImQtJSgMWUsOwdlcs0HoqFcYKYsw== + dependencies: + bundle-require "^3.0.4" + chalk "4.1.2" + change-case "^4.1.2" + chokidar "^3.5.3" + css-modules-loader-core "^1.1.0" + esbuild "^0.14.21" + glob "^7.2.0" + joycon "^3.1.1" + reserved-words "^0.1.2" + slash "^3.0.0" + yargs "^17.3.1" + typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" @@ -10450,6 +10809,20 @@ update-notifier@^2.5.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -11118,6 +11491,19 @@ yargs@^17.0.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yup@^0.29.1: version "0.29.3" resolved "https://registry.yarnpkg.com/yup/-/yup-0.29.3.tgz#69a30fd3f1c19f5d9e31b1cf1c2b851ce8045fea" From b0460b365859ef537908fba401c7936137059c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ga=C4=87e=C5=A1a?= Date: Mon, 11 Sep 2023 12:01:40 +0200 Subject: [PATCH 09/13] simplify import job starting --- internal/api/controller/repo/import.go | 13 ++-- internal/api/controller/space/import.go | 15 ++--- internal/services/importer/repository.go | 2 +- internal/services/job/scheduler.go | 83 +++++------------------- internal/services/job/timer.go | 5 -- 5 files changed, 28 insertions(+), 90 deletions(-) diff --git a/internal/api/controller/repo/import.go b/internal/api/controller/repo/import.go index cdad3bfde..09dd919dd 100644 --- a/internal/api/controller/repo/import.go +++ b/internal/api/controller/repo/import.go @@ -7,7 +7,6 @@ package repo import ( "context" "fmt" - "github.com/harness/gitness/internal/api/usererror" "github.com/harness/gitness/internal/auth" "github.com/harness/gitness/internal/paths" @@ -16,8 +15,6 @@ import ( "github.com/harness/gitness/store/database/dbtx" "github.com/harness/gitness/types" "github.com/harness/gitness/types/enum" - - "github.com/rs/zerolog/log" ) type ImportInput struct { @@ -83,17 +80,17 @@ func (c *Controller) Import(ctx context.Context, session *auth.Session, in *Impo return fmt.Errorf("failed to create path: %w", err) } + err = c.importer.Run(ctx, in.Provider, repo, remoteRepository.CloneURL) + if err != nil { + return fmt.Errorf("failed to start import repository job: %w", err) + } + return nil }) if err != nil { return nil, err } - err = c.importer.Run(ctx, in.Provider, repo, remoteRepository.CloneURL) - if err != nil { - log.Ctx(ctx).Err(err).Msg("failed to start import repository job") - } - repo.GitURL = c.urlProvider.GenerateRepoCloneURL(repo.Path) return repo, nil diff --git a/internal/api/controller/space/import.go b/internal/api/controller/space/import.go index ce00c9749..0720632fb 100644 --- a/internal/api/controller/space/import.go +++ b/internal/api/controller/space/import.go @@ -7,8 +7,6 @@ package space import ( "context" "fmt" - "github.com/harness/gitness/types/check" - "github.com/rs/zerolog/log" "strconv" "strings" "time" @@ -21,6 +19,7 @@ import ( "github.com/harness/gitness/internal/services/job" "github.com/harness/gitness/store/database/dbtx" "github.com/harness/gitness/types" + "github.com/harness/gitness/types/check" "github.com/harness/gitness/types/enum" ) @@ -168,17 +167,17 @@ func (c *Controller) Import(ctx context.Context, session *auth.Session, in *Impo cloneURLs[i] = remoteRepository.CloneURL } + jobGroupID := fmt.Sprintf("space-import-%d", space.ID) + err = c.importer.RunMany(ctx, jobGroupID, in.Provider, localRepositories, cloneURLs) + if err != nil { + return fmt.Errorf("failed to start import repository jobs: %w", err) + } + return nil }) if err != nil { return nil, err } - jobGroupID := fmt.Sprintf("space-import-%d", space.ID) - err = c.importer.RunMany(ctx, jobGroupID, in.Provider, localRepositories, cloneURLs) - if err != nil { - log.Ctx(ctx).Err(err).Msg("failed to start import repository job") - } - return space, nil } diff --git a/internal/services/importer/repository.go b/internal/services/importer/repository.go index 399168587..41a4982ee 100644 --- a/internal/services/importer/repository.go +++ b/internal/services/importer/repository.go @@ -199,7 +199,7 @@ func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressRepo return "", fmt.Errorf("failed to import repository: %w", err) } - return "", err + return "", nil } func (i *Repository) GetProgress(ctx context.Context, repo *types.Repository) (types.JobProgress, error) { diff --git a/internal/services/job/scheduler.go b/internal/services/job/scheduler.go index 1ca8545cb..f769e65f7 100644 --- a/internal/services/job/scheduler.go +++ b/internal/services/job/scheduler.go @@ -40,7 +40,6 @@ type Scheduler struct { // synchronization stuff signal chan time.Time - signalEdgy chan struct{} done chan struct{} wgRunning sync.WaitGroup cancelJobMx sync.Mutex @@ -105,7 +104,6 @@ func (s *Scheduler) Run(ctx context.Context) error { defer close(s.done) s.signal = make(chan time.Time, 1) - s.signalEdgy = make(chan struct{}, 1) s.globalCtx = ctx timer := newSchedulerTimer() @@ -126,10 +124,6 @@ func (s *Scheduler) Run(ctx context.Context) error { case <-ctx.Done(): return ctx.Err() - case <-s.signalEdgy: - timer.MakeEdgy() - return nil - case newTime := <-s.signal: dur := timer.RescheduleEarlier(newTime) if dur > 0 { @@ -264,13 +258,6 @@ func (s *Scheduler) scheduleProcessing(scheduled time.Time) { }() } -func (s *Scheduler) makeTimerEdgy() { - select { - case s.signalEdgy <- struct{}{}: - default: - } -} - // scheduleIfHaveMoreJobs triggers processing of ready jobs if the timer is edgy. // The timer would be edgy if the previous iteration found more jobs that it could start (full capacity). // This should be run after a non-recurring job has finished. @@ -286,12 +273,24 @@ func (s *Scheduler) RunJob(ctx context.Context, def Definition) error { return err } - return s.startNewJobs(ctx, []*types.Job{def.toNewJob()}) + job := def.toNewJob() + + if err := s.store.Create(ctx, job); err != nil { + return fmt.Errorf("failed to add new job to the database: %w", err) + } + + s.scheduleProcessing(time.UnixMilli(job.Scheduled)) + + return nil } // RunJobs runs a several jobs. It's more efficient than calling RunJob several times // because it locks the DB only once. func (s *Scheduler) RunJobs(ctx context.Context, groupID string, defs []Definition) error { + if len(defs) == 0 { + return nil + } + jobs := make([]*types.Job, len(defs)) for i, def := range defs { if err := def.Validate(); err != nil { @@ -301,65 +300,13 @@ func (s *Scheduler) RunJobs(ctx context.Context, groupID string, defs []Definiti jobs[i].GroupID = groupID } - return s.startNewJobs(ctx, jobs) -} - -func (s *Scheduler) startNewJobs(ctx context.Context, jobs []*types.Job) error { - mx, err := globalLock(ctx, s.mxManager) - if err != nil { - return fmt.Errorf("failed to obtain global lock to start new jobs: %w", err) - } - - defer func() { - if err := mx.Unlock(ctx); err != nil { - log.Ctx(ctx).Err(err).Msg("failed to release global lock after starting new jobs") - } - }() - - return s.startNewJobsNoLock(ctx, jobs) -} - -func (s *Scheduler) startNewJobsNoLock(ctx context.Context, jobs []*types.Job) error { - available, err := s.availableSlots(ctx) - if err != nil { - return fmt.Errorf("failed to count available slots for job execution: %w", err) - } - - canRunAll := available >= len(jobs) - for _, job := range jobs { - if available > 0 { - available-- - s.preExec(job) // Update the job fields for the new execution: It will be added to the DB as "running". - } - - err = s.store.Create(ctx, job) - if err != nil { + if err := s.store.Create(ctx, job); err != nil { return fmt.Errorf("failed to add new job to the database: %w", err) } - - if job.State != enum.JobStateRunning { - continue - } - - func(ctx context.Context) { - ctx = log.Ctx(ctx).With(). - Str("job.UID", job.UID). - Str("job.Type", job.Type). - Logger().WithContext(ctx) - - // tell everybody that a job has started - if err := publishStateChange(ctx, s.pubsubService, job); err != nil { - log.Err(err).Msg("failed to publish job state change") - } - - s.runJob(ctx, job) - }(s.globalCtx) } - if !canRunAll { - s.makeTimerEdgy() - } + s.scheduleProcessing(time.Now()) return nil } diff --git a/internal/services/job/timer.go b/internal/services/job/timer.go index 819cb884b..dfc93f70a 100644 --- a/internal/services/job/timer.go +++ b/internal/services/job/timer.go @@ -31,11 +31,6 @@ func (t *schedulerTimer) ResetAt(next time.Time, edgy bool) time.Duration { return t.resetAt(time.Now(), next, edgy) } -// MakeEdgy makes the timer edgy which meant it will be triggered immediately on reschedule attempt. -func (t *schedulerTimer) MakeEdgy() { - t.edgy = true -} - func (t *schedulerTimer) resetAt(now, next time.Time, edgy bool) time.Duration { var dur time.Duration From 1fd4de9ae74d0dfb67c97790623b145d0c282f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ga=C4=87e=C5=A1a?= Date: Mon, 11 Sep 2023 14:04:28 +0200 Subject: [PATCH 10/13] fix importing of empty and large repositories --- gitrpc/internal/gitea/repo.go | 5 +- gitrpc/internal/service/repo.go | 5 ++ internal/services/importer/repository.go | 66 +++++++++++++----------- internal/services/job/scheduler.go | 4 -- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/gitrpc/internal/gitea/repo.go b/gitrpc/internal/gitea/repo.go index c119dcb7b..15c791211 100644 --- a/gitrpc/internal/gitea/repo.go +++ b/gitrpc/internal/gitea/repo.go @@ -69,6 +69,7 @@ func (g Adapter) GetDefaultBranch(ctx context.Context, repoPath string) (string, // If the repo doesn't have a default branch, types.ErrNoDefaultBranch is returned. func (g Adapter) GetRemoteDefaultBranch(ctx context.Context, remoteURL string) (string, error) { args := []string{ + "-c", "credential.helper=", "ls-remote", "--symref", "-q", @@ -118,6 +119,7 @@ func (g Adapter) Clone(ctx context.Context, from, to string, opts types.CloneRep func (g Adapter) Sync(ctx context.Context, repoPath string, remoteURL string) error { args := []string{ "-c", "advice.fetchShowForcedUpdates=false", + "-c", "credential.helper=", "fetch", "--quiet", "--prune", @@ -131,7 +133,8 @@ func (g Adapter) Sync(ctx context.Context, repoPath string, remoteURL string) er cmd := gitea.NewCommand(ctx, args...) _, _, err := cmd.RunStdString(&gitea.RunOpts{ - Dir: repoPath, + Dir: repoPath, + UseContextTimeout: true, }) if err != nil { return processGiteaErrorf(err, "failed to sync repo") diff --git a/gitrpc/internal/service/repo.go b/gitrpc/internal/service/repo.go index b84daf4e0..928ae2f9f 100644 --- a/gitrpc/internal/service/repo.go +++ b/gitrpc/internal/service/repo.go @@ -344,6 +344,11 @@ func (s RepositoryService) SyncRepository( // get remote default branch defaultBranch, err := s.adapter.GetRemoteDefaultBranch(ctx, request.GetSource()) + if errors.Is(err, types.ErrNoDefaultBranch) { + return &rpc.SyncRepositoryResponse{ + DefaultBranch: "", + }, nil + } if err != nil { return nil, processGitErrorf(err, "failed to get default branch from repo") } diff --git a/internal/services/importer/repository.go b/internal/services/importer/repository.go index 41a4982ee..a6e9add4a 100644 --- a/internal/services/importer/repository.go +++ b/internal/services/importer/repository.go @@ -49,11 +49,12 @@ type Input struct { const jobType = "repository_import" -func (i *Repository) Register(executor *job.Executor) error { - return executor.Register(jobType, i) +func (r *Repository) Register(executor *job.Executor) error { + return executor.Register(jobType, r) } -func (i *Repository) Run(ctx context.Context, provider Provider, repo *types.Repository, cloneURL string) error { +// Run starts a background job that imports the provided repository from the provided clone URL. +func (r *Repository) Run(ctx context.Context, provider Provider, repo *types.Repository, cloneURL string) error { input := Input{ RepoID: repo.ID, GitUser: provider.Username, @@ -68,7 +69,7 @@ func (i *Repository) Run(ctx context.Context, provider Provider, repo *types.Rep strData := strings.TrimSpace(string(data)) - return i.scheduler.RunJob(ctx, job.Definition{ + return r.scheduler.RunJob(ctx, job.Definition{ UID: *repo.ImportingJobUID, Type: jobType, MaxRetries: importJobMaxRetries, @@ -77,7 +78,8 @@ func (i *Repository) Run(ctx context.Context, provider Provider, repo *types.Rep }) } -func (i *Repository) RunMany(ctx context.Context, +// RunMany starts background jobs that import the provided repositories from the provided clone URLs. +func (r *Repository) RunMany(ctx context.Context, groupID string, provider Provider, repos []*types.Repository, @@ -119,7 +121,7 @@ func (i *Repository) RunMany(ctx context.Context, } } - err := i.scheduler.RunJobs(ctx, groupID, defs) + err := r.scheduler.RunJobs(ctx, groupID, defs) if err != nil { return fmt.Errorf("failed to run jobs: %w", err) } @@ -128,7 +130,7 @@ func (i *Repository) RunMany(ctx context.Context, } // Handle is repository import background job handler. -func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressReporter) (string, error) { +func (r *Repository) Handle(ctx context.Context, data string, _ job.ProgressReporter) (string, error) { systemPrincipal := bootstrap.NewSystemServiceSession().Principal var input Input @@ -150,7 +152,7 @@ func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressRepo input.CloneURL = repoURL.String() } - repo, err := i.repoStore.Find(ctx, input.RepoID) + repo, err := r.repoStore.Find(ctx, input.RepoID) if err != nil { return "", fmt.Errorf("failed to find repo by id: %w", err) } @@ -159,7 +161,7 @@ func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressRepo return "", fmt.Errorf("repository %s is not being imported", repo.UID) } - gitUID, err := i.createGitRepository(ctx, &systemPrincipal, repo.ID) + gitUID, err := r.createGitRepository(ctx, &systemPrincipal, repo.ID) if err != nil { return "", fmt.Errorf("failed to create empty git repository: %w", err) } @@ -167,12 +169,16 @@ func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressRepo err = func() error { repo.GitUID = gitUID - defaultBranch, err := i.syncGitRepository(ctx, &systemPrincipal, repo, input.CloneURL) + defaultBranch, err := r.syncGitRepository(ctx, &systemPrincipal, repo, input.CloneURL) if err != nil { return fmt.Errorf("failed to sync git repository from '%s': %w", input.CloneURL, err) } - repo, err = i.repoStore.UpdateOptLock(ctx, repo, func(repo *types.Repository) error { + if defaultBranch == "" { + defaultBranch = r.defaultBranch + } + + repo, err = r.repoStore.UpdateOptLock(ctx, repo, func(repo *types.Repository) error { if !repo.Importing { return errors.New("repository has already finished importing") } @@ -190,7 +196,7 @@ func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressRepo return nil }() if err != nil { - if errDel := i.deleteGitRepository(ctx, &systemPrincipal, repo); errDel != nil { + if errDel := r.deleteGitRepository(ctx, &systemPrincipal, repo); errDel != nil { log.Ctx(ctx).Err(err). Str("gitUID", gitUID). Msg("failed to delete git repository after failed import") @@ -202,13 +208,13 @@ func (i *Repository) Handle(ctx context.Context, data string, _ job.ProgressRepo return "", nil } -func (i *Repository) GetProgress(ctx context.Context, repo *types.Repository) (types.JobProgress, error) { +func (r *Repository) GetProgress(ctx context.Context, repo *types.Repository) (types.JobProgress, error) { if !repo.Importing || repo.ImportingJobUID == nil || *repo.ImportingJobUID == "" { // if the repo is not being imported, or it's job ID has been cleared (or never existed) return state=finished return job.DoneProgress(), nil } - progress, err := i.scheduler.GetJobProgress(ctx, *repo.ImportingJobUID) + progress, err := r.scheduler.GetJobProgress(ctx, *repo.ImportingJobUID) if errors.Is(err, gitness_store.ErrResourceNotFound) { // if the job is not found return state=failed return job.FailProgress(), nil @@ -220,12 +226,12 @@ func (i *Repository) GetProgress(ctx context.Context, repo *types.Repository) (t return progress, nil } -func (i *Repository) Cancel(ctx context.Context, repo *types.Repository) error { +func (r *Repository) Cancel(ctx context.Context, repo *types.Repository) error { if repo.ImportingJobUID == nil || *repo.ImportingJobUID == "" { return nil } - err := i.scheduler.CancelJob(ctx, *repo.ImportingJobUID) + err := r.scheduler.CancelJob(ctx, *repo.ImportingJobUID) if err != nil { return fmt.Errorf("failed to cancel job: %w", err) } @@ -233,24 +239,24 @@ func (i *Repository) Cancel(ctx context.Context, repo *types.Repository) error { return nil } -func (i *Repository) createGitRepository(ctx context.Context, +func (r *Repository) createGitRepository(ctx context.Context, principal *types.Principal, repoID int64, ) (string, error) { now := time.Now() - envVars, err := i.createEnvVars(ctx, principal, repoID) + envVars, err := r.createEnvVars(ctx, principal, repoID) if err != nil { return "", err } - resp, err := i.git.CreateRepository(ctx, &gitrpc.CreateRepositoryParams{ + resp, err := r.git.CreateRepository(ctx, &gitrpc.CreateRepositoryParams{ Actor: gitrpc.Identity{ Name: principal.DisplayName, Email: principal.Email, }, EnvVars: envVars, - DefaultBranch: i.defaultBranch, + DefaultBranch: r.defaultBranch, Files: nil, Author: &gitrpc.Identity{ Name: principal.DisplayName, @@ -270,17 +276,17 @@ func (i *Repository) createGitRepository(ctx context.Context, return resp.UID, nil } -func (i *Repository) syncGitRepository(ctx context.Context, +func (r *Repository) syncGitRepository(ctx context.Context, principal *types.Principal, repo *types.Repository, sourceCloneURL string, ) (string, error) { - writeParams, err := i.createRPCWriteParams(ctx, principal, repo) + writeParams, err := r.createRPCWriteParams(ctx, principal, repo) if err != nil { return "", err } - syncOut, err := i.git.SyncRepository(ctx, &gitrpc.SyncRepositoryParams{ + syncOut, err := r.git.SyncRepository(ctx, &gitrpc.SyncRepositoryParams{ WriteParams: writeParams, Source: sourceCloneURL, CreateIfNotExists: false, @@ -292,16 +298,16 @@ func (i *Repository) syncGitRepository(ctx context.Context, return syncOut.DefaultBranch, nil } -func (i *Repository) deleteGitRepository(ctx context.Context, +func (r *Repository) deleteGitRepository(ctx context.Context, principal *types.Principal, repo *types.Repository, ) error { - writeParams, err := i.createRPCWriteParams(ctx, principal, repo) + writeParams, err := r.createRPCWriteParams(ctx, principal, repo) if err != nil { return err } - err = i.git.DeleteRepository(ctx, &gitrpc.DeleteRepositoryParams{ + err = r.git.DeleteRepository(ctx, &gitrpc.DeleteRepositoryParams{ WriteParams: writeParams, }) if err != nil { @@ -311,11 +317,11 @@ func (i *Repository) deleteGitRepository(ctx context.Context, return nil } -func (i *Repository) createRPCWriteParams(ctx context.Context, +func (r *Repository) createRPCWriteParams(ctx context.Context, principal *types.Principal, repo *types.Repository, ) (gitrpc.WriteParams, error) { - envVars, err := i.createEnvVars(ctx, principal, repo.ID) + envVars, err := r.createEnvVars(ctx, principal, repo.ID) if err != nil { return gitrpc.WriteParams{}, err } @@ -330,13 +336,13 @@ func (i *Repository) createRPCWriteParams(ctx context.Context, }, nil } -func (i *Repository) createEnvVars(ctx context.Context, +func (r *Repository) createEnvVars(ctx context.Context, principal *types.Principal, repoID int64, ) (map[string]string, error) { envVars, err := githook.GenerateEnvironmentVariables( ctx, - i.urlProvider.GetAPIBaseURLInternal(), + r.urlProvider.GetAPIBaseURLInternal(), repoID, principal.ID, false, diff --git a/internal/services/job/scheduler.go b/internal/services/job/scheduler.go index f769e65f7..379327985 100644 --- a/internal/services/job/scheduler.go +++ b/internal/services/job/scheduler.go @@ -35,9 +35,6 @@ type Scheduler struct { maxRunning int purgeMinOldAge time.Duration - // global context - globalCtx context.Context - // synchronization stuff signal chan time.Time done chan struct{} @@ -104,7 +101,6 @@ func (s *Scheduler) Run(ctx context.Context) error { defer close(s.done) s.signal = make(chan time.Time, 1) - s.globalCtx = ctx timer := newSchedulerTimer() defer timer.Stop() From c4f8dcbfdfc801f6c67bb749bd0284ad8969c84c Mon Sep 17 00:00:00 2001 From: Dan Wilson Date: Mon, 11 Sep 2023 16:55:38 +0100 Subject: [PATCH 11/13] WIP execution event streaming --- web/src/framework/strings/stringTypes.ts | 3 ++ web/src/hooks/usePipelineEventStream.tsx | 50 +++++++++++++++++++ web/src/i18n/strings.en.yaml | 3 ++ web/src/pages/Execution/Execution.tsx | 35 +++++++++++-- web/src/pages/ExecutionList/ExecutionList.tsx | 43 ++++++++++++---- web/src/pages/PipelineList/PipelineList.tsx | 41 +++++++++++---- web/src/pages/SecretList/SecretList.tsx | 2 +- 7 files changed, 150 insertions(+), 27 deletions(-) create mode 100644 web/src/hooks/usePipelineEventStream.tsx diff --git a/web/src/framework/strings/stringTypes.ts b/web/src/framework/strings/stringTypes.ts index d16e6f61c..f7eb80d4d 100644 --- a/web/src/framework/strings/stringTypes.ts +++ b/web/src/framework/strings/stringTypes.ts @@ -171,9 +171,12 @@ export interface StringsMap { error404Text: string 'executions.completedTime': string 'executions.description': string + 'executions.failed': string 'executions.name': string + 'executions.newExecution': string 'executions.newExecutionButton': string 'executions.noData': string + 'executions.started': string 'executions.time': string executor: string existingAccount: string diff --git a/web/src/hooks/usePipelineEventStream.tsx b/web/src/hooks/usePipelineEventStream.tsx new file mode 100644 index 000000000..6e36d088d --- /dev/null +++ b/web/src/hooks/usePipelineEventStream.tsx @@ -0,0 +1,50 @@ +import { useEffect, useRef } from 'react' + +type UsePipelineEventStreamProps = { + space: string + onEvent: (data: any) => void + onError?: (event: Event) => void + shouldRun?: boolean +} + +const usePipelineEventStream = ({ space, onEvent, onError, shouldRun = true }: UsePipelineEventStreamProps) => { + //TODO - this is not working right - need to get to the bottom of too many streams being opened and closed... can miss events! + const eventSourceRef = useRef(null) + + useEffect(() => { + // Conditionally establish the event stream - don't want to open on a finished execution + if (shouldRun) { + if (!eventSourceRef.current) { + eventSourceRef.current = new EventSource(`/api/v1/spaces/${space}/stream`) + + const handleMessage = (event: MessageEvent) => { + const data = JSON.parse(event.data) + onEvent(data) + } + + const handleError = (event: Event) => { + if (onError) onError(event) + eventSourceRef?.current?.close() + } + + eventSourceRef.current.addEventListener('message', handleMessage) + eventSourceRef.current.addEventListener('error', handleError) + + return () => { + eventSourceRef.current?.removeEventListener('message', handleMessage) + eventSourceRef.current?.removeEventListener('error', handleError) + eventSourceRef.current?.close() + eventSourceRef.current = null + } + } + } else { + // If shouldRun is false, close and cleanup any existing stream + if (eventSourceRef.current) { + eventSourceRef.current.close() + eventSourceRef.current = null + } + } + }, [space, shouldRun, onEvent, onError]) +} + +export default usePipelineEventStream diff --git a/web/src/i18n/strings.en.yaml b/web/src/i18n/strings.en.yaml index 4f0c5d966..e8a14d5c4 100644 --- a/web/src/i18n/strings.en.yaml +++ b/web/src/i18n/strings.en.yaml @@ -633,6 +633,9 @@ executions: description: Description time: Time completedTime: completed {{timeString}} ago + started: Execution started + failed: Failed to start build + newExecution: Run Pipeline selectRange: Shift-click to select a range allCommits: All Commits secrets: diff --git a/web/src/pages/Execution/Execution.tsx b/web/src/pages/Execution/Execution.tsx index 3c069a0c0..e762a058a 100644 --- a/web/src/pages/Execution/Execution.tsx +++ b/web/src/pages/Execution/Execution.tsx @@ -1,5 +1,5 @@ import { Container, PageBody } from '@harnessio/uicore' -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import cx from 'classnames' import { useParams } from 'react-router-dom' import { useGet } from 'restful-react' @@ -13,6 +13,7 @@ import { useStrings } from 'framework/strings' import { LoadingSpinner } from 'components/LoadingSpinner/LoadingSpinner' import { useGetRepositoryMetadata } from 'hooks/useGetRepositoryMetadata' import { ExecutionPageHeader } from 'components/ExecutionPageHeader/ExecutionPageHeader' +import usePipelineEventStream from 'hooks/usePipelineEventStream' import noExecutionImage from '../RepositoriesListing/no-repo.svg' import css from './Execution.module.scss' @@ -20,18 +21,44 @@ const Execution = () => { const { pipeline, execution: executionNum } = useParams() const { getString } = useStrings() - const { repoMetadata, error, loading, refetch } = useGetRepositoryMetadata() + const { repoMetadata, error, loading, refetch, space } = useGetRepositoryMetadata() const { data: execution, error: executionError, - loading: executionLoading + loading: executionLoading, + refetch: executionRefetch } = useGet({ path: `/api/v1/repos/${repoMetadata?.path}/+/pipelines/${pipeline}/executions/${executionNum}`, lazy: !repoMetadata }) + //TODO remove null type here? const [selectedStage, setSelectedStage] = useState(1) + //TODO - do not want to show load between refetchs - remove if/when we move to event stream method + const [isInitialLoad, setIsInitialLoad] = useState(true) + + useEffect(() => { + if (execution) { + setIsInitialLoad(false) + } + }, [execution]) + + usePipelineEventStream({ + space, + onEvent: (data: any) => { + if ( + (data.type === 'execution_updated' || data.type === 'execution_completed') && + data.data?.repo_id === execution?.repo_id && + data.data?.pipeline_id === execution?.pipeline_id && + data.data?.number === execution?.number + ) { + //TODO - revisit full refresh - can I use the message to update the execution? + executionRefetch() + } + }, + shouldRun: execution?.status === 'running' + }) return ( @@ -72,7 +99,7 @@ const Execution = () => { message: getString('executions.noData') // button: NewExecutionButton }}> - + {execution && ( { const [page, setPage] = usePageIndex(pageInit) const { showError, showSuccess } = useToaster() - const { repoMetadata, error, loading, refetch } = useGetRepositoryMetadata() + const { repoMetadata, error, loading, refetch, space } = useGetRepositoryMetadata() const { data: executions, error: executionsError, - loading: executionsLoading, response, refetch: executionsRefetch } = useGet({ @@ -60,19 +60,40 @@ const ExecutionList = () => { lazy: !repoMetadata }) - //TODO - this should NOT be hardcoded to master branch - need a modal to insert branch + //TODO - do not want to show load between refetchs - remove if/when we move to event stream method + const [isInitialLoad, setIsInitialLoad] = useState(true) + + useEffect(() => { + if (executions) { + setIsInitialLoad(false) + } + }, [executions]) + + usePipelineEventStream({ + space, + onEvent: (data: any) => { + // ideally this would include number - so we only check for executions on the page - but what if new executions are kicked off? - could check for ids that are higher than the lowest id on the page? + if ( + executions?.some( + execution => execution.repo_id === data.data?.repo_id && execution.pipeline_id === data.data?.pipeline_id + ) + ) { + //TODO - revisit full refresh - can I use the message to update the execution? + executionsRefetch() + } + } + }) + const { mutate, loading: mutateLoading } = useMutate({ verb: 'POST', - path: `/api/v1/repos/${repoMetadata?.path}/+/pipelines/${pipeline}/executions`, - queryParams: { branch: 'master' } + path: `/api/v1/repos/${repoMetadata?.path}/+/pipelines/${pipeline}/executions` }) const handleClick = async () => { try { - //TODO - really this should be handled by the event bus - await mutate(null) + //TODO - this should NOT be hardcoded to master branch - need a modal to insert branch - but useful for testing until then + await mutate({ branch: 'master' }) showSuccess('Build started') - executionsRefetch() } catch { showError('Failed to start build') } @@ -140,7 +161,7 @@ const ExecutionList = () => { - {timeDistance(record.created, Date.now())} ago + {timeDistance(record.started, Date.now())} ago @@ -177,7 +198,7 @@ const ExecutionList = () => { message: getString('executions.noData'), button: NewExecutionButton }}> - + diff --git a/web/src/pages/PipelineList/PipelineList.tsx b/web/src/pages/PipelineList/PipelineList.tsx index 2d6cebd0e..c2e583e8f 100644 --- a/web/src/pages/PipelineList/PipelineList.tsx +++ b/web/src/pages/PipelineList/PipelineList.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' import { Avatar, Button, @@ -34,6 +34,7 @@ import { ExecutionStatus, ExecutionState } from 'components/ExecutionStatus/Exec import { getStatus } from 'utils/PipelineUtils' import { PipeSeparator } from 'components/PipeSeparator/PipeSeparator' import { useGetSpaceParam } from 'hooks/useGetSpaceParam' +import usePipelineEventStream from 'hooks/usePipelineEventStream' import noPipelineImage from '../RepositoriesListing/no-repo.svg' import css from './PipelineList.module.scss' @@ -52,8 +53,8 @@ const PipelineList = () => { const { data: pipelines, error: pipelinesError, - loading: pipelinesLoading, - response + response, + refetch: pipelinesRefetch } = useGet({ path: `/api/v1/repos/${repoMetadata?.path}/+/pipelines`, queryParams: { page, limit: LIST_FETCHING_LIMIT, query: searchTerm, latest: true }, @@ -61,6 +62,28 @@ const PipelineList = () => { debounce: 500 }) + //TODO - do not want to show load between refetchs - remove if/when we move to event stream method + const [isInitialLoad, setIsInitialLoad] = useState(true) + + useEffect(() => { + if (pipelines) { + setIsInitialLoad(false) + } + }, [pipelines]) + + usePipelineEventStream({ + space, + onEvent: (data: any) => { + // should I include pipeline id here? what if a new pipeline is created? coould check for ids that are higher than the lowest id on the page? + if ( + pipelines?.some(pipeline => pipeline.repo_id === data.data?.repo_id && pipeline.id === data.data?.pipeline_id) + ) { + //TODO - revisit full refresh - can I use the message to update the execution? + pipelinesRefetch() + } + } + }) + const NewPipelineButton = (