From 9d8597b399c2dd22e48b723cadc63a6759b11d4b Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Fri, 24 Mar 2023 15:11:17 -0400 Subject: [PATCH 01/44] add self hostded expansion mm-server parts. --- model/hosted_customer.go | 10 ++++++ server/channels/api4/hosted_customer.go | 42 +++++++++++++++++++------ server/channels/einterfaces/cloud.go | 1 + 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/model/hosted_customer.go b/model/hosted_customer.go index 4f1917bdaf..d2856eab45 100644 --- a/model/hosted_customer.go +++ b/model/hosted_customer.go @@ -32,6 +32,11 @@ type SelfHostedConfirmPaymentMethodRequest struct { Subscription CreateSubscriptionRequest `json:"subscription"` } +type SelfHostedExpansionConfirmPaymentMethodRequest struct { + StripeSetupIntentID string `json:"stripe_setup_intent_id"` + ExpandRequest SelfHostedExpansionRequest `json:"expand_request"` +} + // SelfHostedSignupPaymentResponse contains feels needed for self hosted signup to confirm payment and receive license. type SelfHostedSignupCustomerResponse struct { CustomerId string `json:"customer_id"` @@ -58,3 +63,8 @@ type SelfHostedBillingAccessRequest struct { type SelfHostedBillingAccessResponse struct { Token string `json:"token"` } + +type SelfHostedExpansionRequest struct { + Seats int `json:"seats"` + LicenseId string `json:"license_id"` +} diff --git a/server/channels/api4/hosted_customer.go b/server/channels/api4/hosted_customer.go index 4792969c15..3662582891 100644 --- a/server/channels/api4/hosted_customer.go +++ b/server/channels/api4/hosted_customer.go @@ -65,9 +65,18 @@ func checkSelfHostedPurchaseEnabled(c *Context) bool { return enabled != nil && *enabled } +func checkSelfHostedExpansionEnabled(c *Context) bool { + config := c.App.Config() + if config == nil { + return false + } + enabled := config.ServiceSettings.SelfHostedExpansion + return enabled != nil && *enabled +} + func selfHostedBootstrap(c *Context, w http.ResponseWriter, r *http.Request) { const where = "Api4.selfHostedBootstrap" - if !checkSelfHostedPurchaseEnabled(c) { + if !checkSelfHostedPurchaseEnabled(c) && !checkSelfHostedExpansionEnabled(c) { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusNotImplemented) return } @@ -151,25 +160,40 @@ func selfHostedConfirm(c *Context, w http.ResponseWriter, r *http.Request) { return } + expand := r.URL.Query().Get("expand") == "true" + bodyBytes, err := io.ReadAll(r.Body) if err != nil { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusBadRequest).Wrap(err) return } - var confirm model.SelfHostedConfirmPaymentMethodRequest - err = json.Unmarshal(bodyBytes, &confirm) - if err != nil { - c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) - return - } - user, userErr := c.App.GetUser(c.AppContext.Session().UserId) if userErr != nil { c.Err = userErr return } - confirmResponse, err := c.App.Cloud().ConfirmSelfHostedSignup(confirm, user.Email) + + var confirmResponse *model.SelfHostedSignupConfirmResponse + if expand { + var confirm model.SelfHostedExpansionConfirmPaymentMethodRequest + err = json.Unmarshal(bodyBytes, &confirm) + if err != nil { + c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) + return + } + + confirmResponse, err = c.App.Cloud().ConfirmSelfHostedExpansion(confirm, user.Email) + } else { + var confirm model.SelfHostedConfirmPaymentMethodRequest + err = json.Unmarshal(bodyBytes, &confirm) + if err != nil { + c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) + return + } + + confirmResponse, err = c.App.Cloud().ConfirmSelfHostedSignup(confirm, user.Email) + } if err != nil { if confirmResponse != nil { c.App.NotifySelfHostedSignupProgress(confirmResponse.Progress, user.Id) diff --git a/server/channels/einterfaces/cloud.go b/server/channels/einterfaces/cloud.go index b5d6a75b68..8d92474cc8 100644 --- a/server/channels/einterfaces/cloud.go +++ b/server/channels/einterfaces/cloud.go @@ -37,6 +37,7 @@ type CloudInterface interface { BootstrapSelfHostedSignup(req model.BootstrapSelfHostedSignupRequest) (*model.BootstrapSelfHostedSignupResponse, error) CreateCustomerSelfHostedSignup(req model.SelfHostedCustomerForm, requesterEmail string) (*model.SelfHostedSignupCustomerResponse, error) ConfirmSelfHostedSignup(req model.SelfHostedConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) + ConfirmSelfHostedExpansion(req model.SelfHostedExpansionConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) ConfirmSelfHostedSignupLicenseApplication() error GetSelfHostedInvoices() ([]*model.Invoice, error) GetSelfHostedInvoicePDF(invoiceID string) ([]byte, string, error) From ff01fabc32821268dc3810846ec13d7e8e09df7f Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Fri, 24 Mar 2023 16:30:26 -0400 Subject: [PATCH 02/44] add mocks. --- plugin/api_timer_layer_generated.go | 2 +- plugin/hooks_timer_layer_generated.go | 2 +- .../einterfaces/mocks/CloudInterface.go | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/plugin/api_timer_layer_generated.go b/plugin/api_timer_layer_generated.go index a084188c62..c54c6ac7bb 100644 --- a/plugin/api_timer_layer_generated.go +++ b/plugin/api_timer_layer_generated.go @@ -11,8 +11,8 @@ import ( "net/http" timePkg "time" - "github.com/mattermost/mattermost-server/v6/server/channels/einterfaces" "github.com/mattermost/mattermost-server/v6/model" + "github.com/mattermost/mattermost-server/v6/server/channels/einterfaces" ) type apiTimerLayer struct { diff --git a/plugin/hooks_timer_layer_generated.go b/plugin/hooks_timer_layer_generated.go index 6093048d54..87e79ca7e6 100644 --- a/plugin/hooks_timer_layer_generated.go +++ b/plugin/hooks_timer_layer_generated.go @@ -11,8 +11,8 @@ import ( "net/http" timePkg "time" - "github.com/mattermost/mattermost-server/v6/server/channels/einterfaces" "github.com/mattermost/mattermost-server/v6/model" + "github.com/mattermost/mattermost-server/v6/server/channels/einterfaces" ) type hooksTimerLayer struct { diff --git a/server/channels/einterfaces/mocks/CloudInterface.go b/server/channels/einterfaces/mocks/CloudInterface.go index db7c86acc2..b287dc0680 100644 --- a/server/channels/einterfaces/mocks/CloudInterface.go +++ b/server/channels/einterfaces/mocks/CloudInterface.go @@ -88,6 +88,29 @@ func (_m *CloudInterface) ConfirmCustomerPayment(userID string, confirmRequest * return r0 } +// ConfirmSelfHostedExpansion provides a mock function with given fields: req, requesterEmail +func (_m *CloudInterface) ConfirmSelfHostedExpansion(req model.SelfHostedExpansionConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) { + ret := _m.Called(req, requesterEmail) + + var r0 *model.SelfHostedSignupConfirmResponse + if rf, ok := ret.Get(0).(func(model.SelfHostedExpansionConfirmPaymentMethodRequest, string) *model.SelfHostedSignupConfirmResponse); ok { + r0 = rf(req, requesterEmail) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.SelfHostedSignupConfirmResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(model.SelfHostedExpansionConfirmPaymentMethodRequest, string) error); ok { + r1 = rf(req, requesterEmail) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // ConfirmSelfHostedSignup provides a mock function with given fields: req, requesterEmail func (_m *CloudInterface) ConfirmSelfHostedSignup(req model.SelfHostedConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) { ret := _m.Called(req, requesterEmail) From 336176f8cb59621b6d1d784080fc85e7e5451277 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Mon, 27 Mar 2023 11:12:08 -0400 Subject: [PATCH 03/44] remove get customer by license id functionality in favor of a check in CWS. --- model/hosted_customer.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/model/hosted_customer.go b/model/hosted_customer.go index d2856eab45..8d83d2792c 100644 --- a/model/hosted_customer.go +++ b/model/hosted_customer.go @@ -68,3 +68,7 @@ type SelfHostedExpansionRequest struct { Seats int `json:"seats"` LicenseId string `json:"license_id"` } + +type GetSelfHostedCustomerRequest struct { + LicenseID string `json:"license_id"` +} From a8a71d5deee66b7ca7087b63a7c0c75708471e94 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 28 Mar 2023 10:44:27 -0400 Subject: [PATCH 04/44] Remove unused request struct. --- model/hosted_customer.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/model/hosted_customer.go b/model/hosted_customer.go index ea293b0ef2..2337a48569 100644 --- a/model/hosted_customer.go +++ b/model/hosted_customer.go @@ -69,7 +69,3 @@ type SelfHostedExpansionRequest struct { Seats int `json:"seats"` LicenseId string `json:"license_id"` } - -type GetSelfHostedCustomerRequest struct { - LicenseID string `json:"license_id"` -} From dd7e84aca2de629265ba39de7b07a51e20f8825f Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 28 Mar 2023 14:46:27 -0400 Subject: [PATCH 05/44] Add missing checks for self hosted expansion config enabled. --- server/channels/api4/hosted_customer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/channels/api4/hosted_customer.go b/server/channels/api4/hosted_customer.go index e5ab945611..b82fb8719f 100644 --- a/server/channels/api4/hosted_customer.go +++ b/server/channels/api4/hosted_customer.go @@ -114,7 +114,7 @@ func selfHostedCustomer(c *Context, w http.ResponseWriter, r *http.Request) { if c.Err != nil { return } - if !checkSelfHostedPurchaseEnabled(c) { + if !checkSelfHostedPurchaseEnabled(c) && !checkSelfHostedExpansionEnabled(c) { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusNotImplemented) return } @@ -157,7 +157,7 @@ func selfHostedConfirm(c *Context, w http.ResponseWriter, r *http.Request) { if c.Err != nil { return } - if !checkSelfHostedPurchaseEnabled(c) { + if !checkSelfHostedPurchaseEnabled(c) && !checkSelfHostedExpansionEnabled(c) { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusNotImplemented) return } From 451f169fea3de84226896269bdf7c981f3254773 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Wed, 12 Apr 2023 14:12:28 -0400 Subject: [PATCH 06/44] use a more generic model for self hosted confirm payment method. --- server/channels/api4/hosted_customer.go | 3 +-- server/channels/einterfaces/cloud.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/server/channels/api4/hosted_customer.go b/server/channels/api4/hosted_customer.go index b82fb8719f..31cc047085 100644 --- a/server/channels/api4/hosted_customer.go +++ b/server/channels/api4/hosted_customer.go @@ -177,8 +177,8 @@ func selfHostedConfirm(c *Context, w http.ResponseWriter, r *http.Request) { } var confirmResponse *model.SelfHostedSignupConfirmResponse + var confirm model.SelfHostedConfirmPaymentMethodRequest if expand { - var confirm model.SelfHostedExpansionConfirmPaymentMethodRequest err = json.Unmarshal(bodyBytes, &confirm) if err != nil { c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) @@ -187,7 +187,6 @@ func selfHostedConfirm(c *Context, w http.ResponseWriter, r *http.Request) { confirmResponse, err = c.App.Cloud().ConfirmSelfHostedExpansion(confirm, user.Email) } else { - var confirm model.SelfHostedConfirmPaymentMethodRequest err = json.Unmarshal(bodyBytes, &confirm) if err != nil { c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) diff --git a/server/channels/einterfaces/cloud.go b/server/channels/einterfaces/cloud.go index 8d92474cc8..d8c261aa6d 100644 --- a/server/channels/einterfaces/cloud.go +++ b/server/channels/einterfaces/cloud.go @@ -37,7 +37,7 @@ type CloudInterface interface { BootstrapSelfHostedSignup(req model.BootstrapSelfHostedSignupRequest) (*model.BootstrapSelfHostedSignupResponse, error) CreateCustomerSelfHostedSignup(req model.SelfHostedCustomerForm, requesterEmail string) (*model.SelfHostedSignupCustomerResponse, error) ConfirmSelfHostedSignup(req model.SelfHostedConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) - ConfirmSelfHostedExpansion(req model.SelfHostedExpansionConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) + ConfirmSelfHostedExpansion(req model.SelfHostedConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) ConfirmSelfHostedSignupLicenseApplication() error GetSelfHostedInvoices() ([]*model.Invoice, error) GetSelfHostedInvoicePDF(invoiceID string) ([]byte, string, error) From 4bd37013638986119628f50396f925c69e8893ec Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Wed, 12 Apr 2023 14:15:11 -0400 Subject: [PATCH 07/44] remove new model in favor of making self hosted confirm payment method request more generic. --- model/hosted_customer.go | 10 +++------- server/channels/einterfaces/mocks/CloudInterface.go | 6 +++--- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/model/hosted_customer.go b/model/hosted_customer.go index 2337a48569..f4cb8b999f 100644 --- a/model/hosted_customer.go +++ b/model/hosted_customer.go @@ -29,13 +29,9 @@ type SelfHostedCustomerForm struct { } type SelfHostedConfirmPaymentMethodRequest struct { - StripeSetupIntentID string `json:"stripe_setup_intent_id"` - Subscription CreateSubscriptionRequest `json:"subscription"` -} - -type SelfHostedExpansionConfirmPaymentMethodRequest struct { - StripeSetupIntentID string `json:"stripe_setup_intent_id"` - ExpandRequest SelfHostedExpansionRequest `json:"expand_request"` + StripeSetupIntentID string `json:"stripe_setup_intent_id"` + Subscription *CreateSubscriptionRequest `json:"subscription"` + ExpandRequest *SelfHostedExpansionRequest `json:"expand_request"` } // SelfHostedSignupPaymentResponse contains feels needed for self hosted signup to confirm payment and receive license. diff --git a/server/channels/einterfaces/mocks/CloudInterface.go b/server/channels/einterfaces/mocks/CloudInterface.go index b287dc0680..9b133ce079 100644 --- a/server/channels/einterfaces/mocks/CloudInterface.go +++ b/server/channels/einterfaces/mocks/CloudInterface.go @@ -89,11 +89,11 @@ func (_m *CloudInterface) ConfirmCustomerPayment(userID string, confirmRequest * } // ConfirmSelfHostedExpansion provides a mock function with given fields: req, requesterEmail -func (_m *CloudInterface) ConfirmSelfHostedExpansion(req model.SelfHostedExpansionConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) { +func (_m *CloudInterface) ConfirmSelfHostedExpansion(req model.SelfHostedConfirmPaymentMethodRequest, requesterEmail string) (*model.SelfHostedSignupConfirmResponse, error) { ret := _m.Called(req, requesterEmail) var r0 *model.SelfHostedSignupConfirmResponse - if rf, ok := ret.Get(0).(func(model.SelfHostedExpansionConfirmPaymentMethodRequest, string) *model.SelfHostedSignupConfirmResponse); ok { + if rf, ok := ret.Get(0).(func(model.SelfHostedConfirmPaymentMethodRequest, string) *model.SelfHostedSignupConfirmResponse); ok { r0 = rf(req, requesterEmail) } else { if ret.Get(0) != nil { @@ -102,7 +102,7 @@ func (_m *CloudInterface) ConfirmSelfHostedExpansion(req model.SelfHostedExpansi } var r1 error - if rf, ok := ret.Get(1).(func(model.SelfHostedExpansionConfirmPaymentMethodRequest, string) error); ok { + if rf, ok := ret.Get(1).(func(model.SelfHostedConfirmPaymentMethodRequest, string) error); ok { r1 = rf(req, requesterEmail) } else { r1 = ret.Error(1) From dab14be745b97a8b1934a8e73ffa6a0103f9053d Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Wed, 12 Apr 2023 14:44:33 -0400 Subject: [PATCH 08/44] fix mocks --- server/channels/einterfaces/mocks/CloudInterface.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/channels/einterfaces/mocks/CloudInterface.go b/server/channels/einterfaces/mocks/CloudInterface.go index d308239e23..74236d2038 100644 --- a/server/channels/einterfaces/mocks/CloudInterface.go +++ b/server/channels/einterfaces/mocks/CloudInterface.go @@ -99,6 +99,10 @@ func (_m *CloudInterface) ConfirmSelfHostedExpansion(req model.SelfHostedConfirm ret := _m.Called(req, requesterEmail) var r0 *model.SelfHostedSignupConfirmResponse + var r1 error + if rf, ok := ret.Get(0).(func(model.SelfHostedConfirmPaymentMethodRequest, string) (*model.SelfHostedSignupConfirmResponse, error)); ok { + return rf(req, requesterEmail) + } if rf, ok := ret.Get(0).(func(model.SelfHostedConfirmPaymentMethodRequest, string) *model.SelfHostedSignupConfirmResponse); ok { r0 = rf(req, requesterEmail) } else { @@ -107,7 +111,6 @@ func (_m *CloudInterface) ConfirmSelfHostedExpansion(req model.SelfHostedConfirm } } - var r1 error if rf, ok := ret.Get(1).(func(model.SelfHostedConfirmPaymentMethodRequest, string) error); ok { r1 = rf(req, requesterEmail) } else { From 374166bba9790165a4b974986c2c7acd9b1205f9 Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Mon, 17 Apr 2023 10:17:48 -0500 Subject: [PATCH 09/44] add ci steps --- .github/workflows/channels-ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/channels-ci.yml b/.github/workflows/channels-ci.yml index d6a1a6258c..3321fd717f 100644 --- a/.github/workflows/channels-ci.yml +++ b/.github/workflows/channels-ci.yml @@ -83,6 +83,16 @@ jobs: npm run mmjstool -- i18n clean-empty --webapp-dir ./src --mobile-dir /tmp/fake-mobile-dir --check npm run mmjstool -- i18n check-empty-src --webapp-dir ./src --mobile-dir /tmp/fake-mobile-dir rm -rf tmp + - name: ci/lint + working-directory: webapp/boards + run: | + npm run i18n-extract + git --no-pager diff --exit-code i18n/en.json || (echo "Please run \"cd webapp/boards && npm run i18n-extract\" and commit the changes in webapp/boards/i18n/en.json." && exit 1) + - name: ci/lint + working-directory: webapp/playbooks + run: | + npm run i18n-extract + git --no-pager diff --exit-code i18n/en.json || (echo "Please run \"cd webapp/playbooks && npm run i18n-extract\" and commit the changes in webapp/playbooks/i18n/en.json." && exit 1) check-types: runs-on: ubuntu-22.04 defaults: From 4779700a06b3d74099592a247159230b3e418c44 Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Mon, 17 Apr 2023 10:29:12 -0500 Subject: [PATCH 10/44] test ci extract lint --- webapp/boards/src/components/addContentMenuItem.tsx | 2 +- webapp/playbooks/src/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/boards/src/components/addContentMenuItem.tsx b/webapp/boards/src/components/addContentMenuItem.tsx index 1e147b2563..335a6e4c9d 100644 --- a/webapp/boards/src/components/addContentMenuItem.tsx +++ b/webapp/boards/src/components/addContentMenuItem.tsx @@ -42,7 +42,7 @@ const AddContentMenuItem = (props: Props): JSX.Element => { newBlock.boardId = card.boardId const typeName = handler.getDisplayText(intl) - const description = intl.formatMessage({id: 'ContentBlock.addElement', defaultMessage: 'add {type}'}, {type: typeName}) + const description = intl.formatMessage({id: 'ContentBlock.addElement', defaultMessage: 'add {type} __ci-test__'}, {type: typeName}) const afterRedo = async (nb: Block) => { const contentOrder = card.fields.contentOrder.slice() diff --git a/webapp/playbooks/src/index.tsx b/webapp/playbooks/src/index.tsx index d72b244f2f..6e9f4b1bbf 100644 --- a/webapp/playbooks/src/index.tsx +++ b/webapp/playbooks/src/index.tsx @@ -213,7 +213,7 @@ export default class Plugin { const siteStats = await fetchSiteStats(); return { playbook_count: { - name: , + name: , id: 'total_playbooks', icon: 'fa-book', // font-awesome-4.7.0 handler value: siteStats?.total_playbooks, From 01dede9b1991419f654ef39525b3b5e377d2b2ca Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Mon, 17 Apr 2023 11:12:40 -0500 Subject: [PATCH 11/44] Revert "test ci extract lint" This reverts commit 4779700a06b3d74099592a247159230b3e418c44. --- webapp/boards/src/components/addContentMenuItem.tsx | 2 +- webapp/playbooks/src/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/boards/src/components/addContentMenuItem.tsx b/webapp/boards/src/components/addContentMenuItem.tsx index 335a6e4c9d..1e147b2563 100644 --- a/webapp/boards/src/components/addContentMenuItem.tsx +++ b/webapp/boards/src/components/addContentMenuItem.tsx @@ -42,7 +42,7 @@ const AddContentMenuItem = (props: Props): JSX.Element => { newBlock.boardId = card.boardId const typeName = handler.getDisplayText(intl) - const description = intl.formatMessage({id: 'ContentBlock.addElement', defaultMessage: 'add {type} __ci-test__'}, {type: typeName}) + const description = intl.formatMessage({id: 'ContentBlock.addElement', defaultMessage: 'add {type}'}, {type: typeName}) const afterRedo = async (nb: Block) => { const contentOrder = card.fields.contentOrder.slice() diff --git a/webapp/playbooks/src/index.tsx b/webapp/playbooks/src/index.tsx index 6e9f4b1bbf..d72b244f2f 100644 --- a/webapp/playbooks/src/index.tsx +++ b/webapp/playbooks/src/index.tsx @@ -213,7 +213,7 @@ export default class Plugin { const siteStats = await fetchSiteStats(); return { playbook_count: { - name: , + name: , id: 'total_playbooks', icon: 'fa-book', // font-awesome-4.7.0 handler value: siteStats?.total_playbooks, From a1605d51f6f29e8eb3e16362cbbc5dcd2f4abbb8 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Mon, 17 Apr 2023 16:02:00 -0400 Subject: [PATCH 12/44] Remove checks for self hosted expansion featue flags/configs, add copy of the self hosted confirm handler specifically for expansions. --- server/channels/api4/hosted_customer.go | 124 +++++++++++++++++------- 1 file changed, 91 insertions(+), 33 deletions(-) diff --git a/server/channels/api4/hosted_customer.go b/server/channels/api4/hosted_customer.go index 53204e58ad..9942dcabf7 100644 --- a/server/channels/api4/hosted_customer.go +++ b/server/channels/api4/hosted_customer.go @@ -32,6 +32,8 @@ func (api *API) InitHostedCustomer() { api.BaseRoutes.HostedCustomer.Handle("/customer", api.APISessionRequired(selfHostedCustomer)).Methods("POST") // POST /api/v4/hosted_customer/confirm api.BaseRoutes.HostedCustomer.Handle("/confirm", api.APISessionRequired(selfHostedConfirm)).Methods("POST") + // POST /api.v4/hosted_customer/confirm-expand + api.BaseRoutes.HostedCustomer.Handle("/confirm-expand", api.APISessionRequired(selfHostedConfirmExpand)).Methods("POST") // GET /api/v4/hosted_customer/invoices api.BaseRoutes.HostedCustomer.Handle("/invoices", api.APISessionRequired(selfHostedInvoices)).Methods("GET") // GET /api/v4/hosted_customer/invoices/{invoice_id:in_[A-Za-z0-9]+}/pdf @@ -68,18 +70,9 @@ func checkSelfHostedPurchaseEnabled(c *Context) bool { return enabled != nil && *enabled } -func checkSelfHostedExpansionEnabled(c *Context) bool { - config := c.App.Config() - if config == nil { - return false - } - enabled := config.ServiceSettings.SelfHostedExpansion - return enabled != nil && *enabled -} - func selfHostedBootstrap(c *Context, w http.ResponseWriter, r *http.Request) { const where = "Api4.selfHostedBootstrap" - if !checkSelfHostedPurchaseEnabled(c) && !checkSelfHostedExpansionEnabled(c) { + if !checkSelfHostedPurchaseEnabled(c) { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusNotImplemented) return } @@ -115,7 +108,7 @@ func selfHostedCustomer(c *Context, w http.ResponseWriter, r *http.Request) { if c.Err != nil { return } - if !checkSelfHostedPurchaseEnabled(c) && !checkSelfHostedExpansionEnabled(c) { + if !checkSelfHostedPurchaseEnabled(c) { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusNotImplemented) return } @@ -158,44 +151,31 @@ func selfHostedConfirm(c *Context, w http.ResponseWriter, r *http.Request) { if c.Err != nil { return } - if !checkSelfHostedPurchaseEnabled(c) && !checkSelfHostedExpansionEnabled(c) { + if !checkSelfHostedPurchaseEnabled(c) { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusNotImplemented) return } - expand := r.URL.Query().Get("expand") == "true" - bodyBytes, err := io.ReadAll(r.Body) if err != nil { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusBadRequest).Wrap(err) return } + var confirm model.SelfHostedConfirmPaymentMethodRequest + err = json.Unmarshal(bodyBytes, &confirm) + if err != nil { + c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) + return + } + user, userErr := c.App.GetUser(c.AppContext.Session().UserId) if userErr != nil { c.Err = userErr return } - var confirmResponse *model.SelfHostedSignupConfirmResponse - var confirm model.SelfHostedConfirmPaymentMethodRequest - if expand { - err = json.Unmarshal(bodyBytes, &confirm) - if err != nil { - c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) - return - } - - confirmResponse, err = c.App.Cloud().ConfirmSelfHostedExpansion(confirm, user.Email) - } else { - err = json.Unmarshal(bodyBytes, &confirm) - if err != nil { - c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) - return - } - - confirmResponse, err = c.App.Cloud().ConfirmSelfHostedSignup(confirm, user.Email) - } + confirmResponse, err := c.App.Cloud().ConfirmSelfHostedSignup(confirm, user.Email) if err != nil { if confirmResponse != nil { c.App.NotifySelfHostedSignupProgress(confirmResponse.Progress, user.Id) @@ -348,3 +328,81 @@ func handleSubscribeToNewsletter(c *Context, w http.ResponseWriter, r *http.Requ ReturnStatusOK(w) } + +func selfHostedConfirmExpand(c *Context, w http.ResponseWriter, r *http.Request) { + const where = "Api4.selfHostedConfirmExpand" + + ensureSelfHostedAdmin(c, where) + if c.Err != nil { + return + } + + if !checkSelfHostedPurchaseEnabled(c) { + c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusNotImplemented) + return + } + + bodyBytes, err := io.ReadAll(r.Body) + if err != nil { + c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusBadRequest).Wrap(err) + return + } + + var confirm model.SelfHostedConfirmPaymentMethodRequest + err = json.Unmarshal(bodyBytes, &confirm) + if err != nil { + c.Err = model.NewAppError(where, "api.cloud.request_error", nil, "", http.StatusBadRequest).Wrap(err) + return + } + + user, userErr := c.App.GetUser(c.AppContext.Session().UserId) + if userErr != nil { + c.Err = userErr + return + } + + confirmResponse, err := c.App.Cloud().ConfirmSelfHostedExpansion(confirm, user.Email) + if err != nil { + if confirmResponse != nil { + c.App.NotifySelfHostedSignupProgress(confirmResponse.Progress, user.Id) + } + + if err.Error() == fmt.Sprintf("%d", http.StatusUnprocessableEntity) { + c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusUnprocessableEntity).Wrap(err) + return + } + c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusInternalServerError).Wrap(err) + return + } + + license, err := c.App.Srv().Platform().SaveLicense([]byte(confirmResponse.License)) + + // dealing with an AppError + if !(reflect.ValueOf(err).Kind() == reflect.Ptr && reflect.ValueOf(err).IsNil()) { + if confirmResponse != nil { + c.App.NotifySelfHostedSignupProgress(confirmResponse.Progress, user.Id) + } + c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusInternalServerError).Wrap(err) + return + } + clientResponse, err := json.Marshal(model.SelfHostedSignupConfirmClientResponse{ + License: utils.GetClientLicense(license), + Progress: confirmResponse.Progress, + }) + if err != nil { + if confirmResponse != nil { + c.App.NotifySelfHostedSignupProgress(confirmResponse.Progress, user.Id) + } + c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusInternalServerError).Wrap(err) + return + } + + go func() { + err := c.App.Cloud().ConfirmSelfHostedSignupLicenseApplication() + if err != nil { + c.Logger.Warn("Unable to confirm license application", mlog.Err(err)) + } + }() + + _, _ = w.Write(clientResponse) +} From e841c75ac5e797ea6e952ad4c4e5991705b15aff Mon Sep 17 00:00:00 2001 From: Mattermod Date: Tue, 18 Apr 2023 17:59:27 +0300 Subject: [PATCH 13/44] Update minor version to 7.11.0 (#22959) Co-authored-by: Mmbot Co-authored-by: Akis Maziotis --- server/model/version.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server/model/version.go b/server/model/version.go index 1683e810d5..51b6257e7f 100644 --- a/server/model/version.go +++ b/server/model/version.go @@ -13,6 +13,7 @@ import ( // It should be maintained in chronological order with most current // release at the front of the list. var versions = []string{ + "7.11.0", "7.10.0", "7.9.0", "7.8.0", From 97296418231cfab3f95f6a70f6cfa888b0bd0052 Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:01:52 -0400 Subject: [PATCH 14/44] Bump autolink plugin version to 1.4.0 (#22966) --- server/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/Makefile b/server/Makefile index 83b4fd5531..62e30b7a1a 100644 --- a/server/Makefile +++ b/server/Makefile @@ -138,7 +138,7 @@ TEMPLATES_DIR=templates # Plugins Packages PLUGIN_PACKAGES ?= mattermost-plugin-antivirus-v0.1.2 -PLUGIN_PACKAGES += mattermost-plugin-autolink-v1.2.2 +PLUGIN_PACKAGES += mattermost-plugin-autolink-v1.4.0 PLUGIN_PACKAGES += mattermost-plugin-aws-SNS-v1.2.0 PLUGIN_PACKAGES += mattermost-plugin-calls-v0.15.1 PLUGIN_PACKAGES += mattermost-plugin-channel-export-v1.0.0 From 9b81c086226fc9b3f95d233f1419a8746eb9fedb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Peso?= Date: Tue, 18 Apr 2023 18:22:16 +0200 Subject: [PATCH 15/44] safer base64 generated values in settings (#22990) Generated values for settings are a random base64 string with a length of 32. Unfortunately, base64 has some accepted characters like `+` and `/` that don't behave correctly if we use them in a URL without the proper additional encoding. Use instead this safe version of base64 https://datatracker.ietf.org/doc/html/rfc4648#section-5, where: - `/` becomes `_` - `+` becomes `-` Fixes https://mattermost.atlassian.net/browse/MM-51923 --- .../src/components/admin_console/generated_setting.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapp/channels/src/components/admin_console/generated_setting.tsx b/webapp/channels/src/components/admin_console/generated_setting.tsx index 8f00f5c862..4665443779 100644 --- a/webapp/channels/src/components/admin_console/generated_setting.tsx +++ b/webapp/channels/src/components/admin_console/generated_setting.tsx @@ -38,7 +38,11 @@ export default class GeneratedSetting extends React.PureComponent { private regenerate = (e: React.MouseEvent) => { e.preventDefault(); - this.props.onChange(this.props.id, crypto.randomBytes(256).toString('base64').substring(0, 32)); + // Pure base64 implementation can contain characters that are not URL safe without additional + // encoding. Adopt a URL/Filename safer alphabet as noted in https://datatracker.ietf.org/doc/html/rfc4648#section-5 + // where: 62 - (minus) , 63 _ (underscore) + const value = crypto.randomBytes(256).toString('base64').substring(0, 32); + this.props.onChange(this.props.id, value.replaceAll('+', '-').replaceAll('/', '_')); }; public render() { From b95e546482347b776f8afef36769f48b69c4af12 Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Tue, 18 Apr 2023 11:29:31 -0500 Subject: [PATCH 16/44] step names --- .github/workflows/channels-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/channels-ci.yml b/.github/workflows/channels-ci.yml index 3321fd717f..7d71862ba7 100644 --- a/.github/workflows/channels-ci.yml +++ b/.github/workflows/channels-ci.yml @@ -83,12 +83,12 @@ jobs: npm run mmjstool -- i18n clean-empty --webapp-dir ./src --mobile-dir /tmp/fake-mobile-dir --check npm run mmjstool -- i18n check-empty-src --webapp-dir ./src --mobile-dir /tmp/fake-mobile-dir rm -rf tmp - - name: ci/lint + - name: ci/lint-boards working-directory: webapp/boards run: | npm run i18n-extract git --no-pager diff --exit-code i18n/en.json || (echo "Please run \"cd webapp/boards && npm run i18n-extract\" and commit the changes in webapp/boards/i18n/en.json." && exit 1) - - name: ci/lint + - name: ci/lint-playbooks working-directory: webapp/playbooks run: | npm run i18n-extract From f0ed400732d226ee66e257c97bb28d307396cb22 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 18 Apr 2023 13:47:35 -0400 Subject: [PATCH 17/44] remove use of reflection to detect app err. --- server/channels/api4/hosted_customer.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/channels/api4/hosted_customer.go b/server/channels/api4/hosted_customer.go index 5a6ceda767..5affb6c1b1 100644 --- a/server/channels/api4/hosted_customer.go +++ b/server/channels/api4/hosted_customer.go @@ -188,9 +188,8 @@ func selfHostedConfirm(c *Context, w http.ResponseWriter, r *http.Request) { c.Err = model.NewAppError(where, "api.cloud.app_error", nil, "", http.StatusInternalServerError).Wrap(err) return } - license, err := c.App.Srv().Platform().SaveLicense([]byte(confirmResponse.License)) - // dealing with an AppError - if !(reflect.ValueOf(err).Kind() == reflect.Ptr && reflect.ValueOf(err).IsNil()) { + license, appErr := c.App.Srv().Platform().SaveLicense([]byte(confirmResponse.License)) + if appErr != nil { if confirmResponse != nil { c.App.NotifySelfHostedSignupProgress(confirmResponse.Progress, user.Id) } From 84a304224966b28416aafeef8e81206b3826bf03 Mon Sep 17 00:00:00 2001 From: Ben Schumacher Date: Tue, 18 Apr 2023 21:54:20 +0200 Subject: [PATCH 18/44] Update slash command permission (#22468) * Update slash command permission * Fix permission --- server/channels/api4/command.go | 16 +++++- server/channels/api4/command_test.go | 78 ++++++++++++++++++++++++++++ server/model/permission.go | 3 ++ 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/server/channels/api4/command.go b/server/channels/api4/command.go index cd2fe01d49..312c0d093f 100644 --- a/server/channels/api4/command.go +++ b/server/channels/api4/command.go @@ -323,7 +323,14 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) { defer c.LogAuditRec(auditRec) audit.AddEventParameterAuditable(auditRec, "command_args", &commandArgs) - // checks that user is a member of the specified channel, and that they have permission to use slash commands in it + // Checks that user is a member of the specified channel, and that they have permission to create a post in it. + if !c.App.SessionHasPermissionToChannel(c.AppContext, *c.AppContext.Session(), commandArgs.ChannelId, model.PermissionCreatePost) { + c.SetPermissionError(model.PermissionCreatePost) + return + } + + // For compatibility reasons, PermissionCreatePost is also checked. + // TODO: Remove in 8.0: https://mattermost.atlassian.net/browse/MM-51274 if !c.App.SessionHasPermissionToChannel(c.AppContext, *c.AppContext.Session(), commandArgs.ChannelId, model.PermissionUseSlashCommands) { c.SetPermissionError(model.PermissionUseSlashCommands) return @@ -343,6 +350,13 @@ func executeCommand(c *Context, w http.ResponseWriter, r *http.Request) { // if the slash command was used in a DM or GM, ensure that the user is a member of the specified team, so that // they can't just execute slash commands against arbitrary teams if c.AppContext.Session().GetTeamByTeamId(commandArgs.TeamId) == nil { + if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PermissionCreatePost) { + c.SetPermissionError(model.PermissionCreatePost) + return + } + + // For compatibility reasons, PermissionCreatePost is also checked. + // TODO: Remove in 8.0: https://mattermost.atlassian.net/browse/MM-51274 if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PermissionUseSlashCommands) { c.SetPermissionError(model.PermissionUseSlashCommands) return diff --git a/server/channels/api4/command_test.go b/server/channels/api4/command_test.go index 8517a344fe..b1328da3b1 100644 --- a/server/channels/api4/command_test.go +++ b/server/channels/api4/command_test.go @@ -14,6 +14,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/mattermost/mattermost-server/server/v8/channels/app/request" "github.com/mattermost/mattermost-server/server/v8/model" "github.com/mattermost/mattermost-server/server/v8/platform/shared/mlog" ) @@ -1065,3 +1066,80 @@ func TestExecuteCommandInTeamUserIsNotOn(t *testing.T) { require.Error(t, err) CheckForbiddenStatus(t, resp) } + +func TestExecuteCommandReadOnly(t *testing.T) { + th := Setup(t).InitBasic() + ctx := request.EmptyContext(th.TestLogger) + defer th.TearDown() + client := th.Client + + enableCommands := *th.App.Config().ServiceSettings.EnableCommands + allowedInternalConnections := *th.App.Config().ServiceSettings.AllowedUntrustedInternalConnections + defer func() { + th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnableCommands = &enableCommands }) + th.App.UpdateConfig(func(cfg *model.Config) { + cfg.ServiceSettings.AllowedUntrustedInternalConnections = &allowedInternalConnections + }) + }() + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCommands = true }) + th.App.UpdateConfig(func(cfg *model.Config) { + *cfg.ServiceSettings.AllowedUntrustedInternalConnections = "localhost,127.0.0.1" + }) + + expectedCommandResponse := &model.CommandResponse{ + Text: "test post command response", + ResponseType: model.CommandResponseTypeInChannel, + Type: "custom_test", + Props: map[string]any{"someprop": "somevalue"}, + } + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, http.MethodPost, r.Method) + r.ParseForm() + require.Equal(t, th.BasicTeam.Name, r.FormValue("team_domain")) + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(expectedCommandResponse); err != nil { + th.TestLogger.Warn("Error while writing response", mlog.Err(err)) + } + })) + defer ts.Close() + + // create a slash command on that team + postCmd := &model.Command{ + CreatorId: th.BasicUser.Id, + TeamId: th.BasicTeam.Id, + URL: ts.URL, + Method: model.CommandMethodPost, + Trigger: "postcommand", + } + _, appErr := th.App.CreateCommand(postCmd) + require.Nil(t, appErr, "failed to create post command") + + // Confirm that the command works when the channel is not read only + _, resp, err := client.ExecuteCommandWithTeam(th.BasicChannel.Id, th.BasicChannel.TeamId, "/postcommand") + require.NoError(t, err) + CheckOKStatus(t, resp) + + // Enable Enterprise features + th.App.Srv().SetLicense(model.NewTestLicense()) + + th.App.SetPhase2PermissionsMigrationStatus(true) + + _, appErr = th.App.PatchChannelModerationsForChannel( + ctx, + th.BasicChannel, + []*model.ChannelModerationPatch{{ + Name: &model.PermissionCreatePost.Id, + Roles: &model.ChannelModeratedRolesPatch{ + Guests: model.NewBool(false), + Members: model.NewBool(false), + }, + }}) + require.Nil(t, appErr) + + // Confirm that the command fails when the channel is read only + _, resp, err = client.ExecuteCommandWithTeam(th.BasicChannel.Id, th.BasicChannel.TeamId, "/postcommand") + require.Error(t, err) + CheckForbiddenStatus(t, resp) +} diff --git a/server/model/permission.go b/server/model/permission.go index a44a566964..231154e2d4 100644 --- a/server/model/permission.go +++ b/server/model/permission.go @@ -21,6 +21,9 @@ type Permission struct { var PermissionInviteUser *Permission var PermissionAddUserToTeam *Permission + +// Deprecated: PermissionCreatePost should be used to determine if a slash command can be executed. +// TODO: Remove in 8.0: https://mattermost.atlassian.net/browse/MM-51274 var PermissionUseSlashCommands *Permission var PermissionManageSlashCommands *Permission var PermissionManageOthersSlashCommands *Permission From 7bdc5a4a39d6e6bec4247a711c5be390caab048a Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 18 Apr 2023 16:27:37 -0400 Subject: [PATCH 19/44] Fix rhs expansion card resize in resized windows, fix credit card title section being overlapped with the credit card number input hint. --- .../self_hosted_expansion_modal/expansion_card.scss | 2 +- .../self_hosted_expansion_modal.scss | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/expansion_card.scss b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/expansion_card.scss index 089f296671..e6910940f0 100644 --- a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/expansion_card.scss +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/expansion_card.scss @@ -1,6 +1,6 @@ .SelfHostedExpansionRHSCard { display: flex; - max-width: 280px; + width: 280px; flex-direction: column; &__Content { diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/self_hosted_expansion_modal.scss b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/self_hosted_expansion_modal.scss index 5a98adfbbf..1938890b37 100644 --- a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/self_hosted_expansion_modal.scss +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/self_hosted_expansion_modal.scss @@ -58,7 +58,8 @@ } .section-title { - margin-bottom: 24px; + display: block; + margin-bottom: 10px; color: rgba(var(--center-channel-color-rgb), 0.72); font-size: 16px; font-weight: 600; From c9e081d0b1781ee724dec87e0d6adeca893be6f1 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 18 Apr 2023 17:03:20 -0400 Subject: [PATCH 20/44] Ensure submitting and success screen icon messages are at the same position, ensure no overflow at the bottom of the page, try to hide overflow peeking through on the right side of the page. --- .../self_hosted_expansion_modal/submitting.tsx | 2 ++ .../self_hosted_expansion_modal/submitting_page.scss | 6 ++++++ .../self_hosted_expansion_modal/success_page.scss | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx index 9dc1ce0620..e87af1842e 100644 --- a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx @@ -13,6 +13,8 @@ import {ValueOf} from '@mattermost/types/utilities'; import CreditCardSvg from 'components/common/svg_images_components/credit_card_svg'; import IconMessage from 'components/purchase_modal/icon_message'; +import './submitting_page.scss' + function useConvertProgressToWaitingExplanation(progress: ValueOf, planName: string): React.ReactNode { const intl = useIntl(); switch (progress) { diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss new file mode 100644 index 0000000000..7171883350 --- /dev/null +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss @@ -0,0 +1,6 @@ +.submitting { + overflow: hidden; + .processing { + margin-top: 163px; + } +} \ No newline at end of file diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss index 8986942706..b32204d8f3 100644 --- a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss @@ -15,5 +15,8 @@ } .self_hosted_expansion_success { - margin-top: 163px; + overflow: hidden; + .selfHostedExpansionModal__success { + margin-top: 163px; + } } From 42f457fec24c32178647b3e94a03b37db250f110 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 18 Apr 2023 17:16:06 -0400 Subject: [PATCH 21/44] lint. --- .../self_hosted_expansion_modal/submitting.tsx | 2 +- .../self_hosted_expansion_modal/submitting_page.scss | 3 ++- .../self_hosted_expansion_modal/success_page.scss | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx index e87af1842e..7eafc6c9b1 100644 --- a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting.tsx @@ -13,7 +13,7 @@ import {ValueOf} from '@mattermost/types/utilities'; import CreditCardSvg from 'components/common/svg_images_components/credit_card_svg'; import IconMessage from 'components/purchase_modal/icon_message'; -import './submitting_page.scss' +import './submitting_page.scss'; function useConvertProgressToWaitingExplanation(progress: ValueOf, planName: string): React.ReactNode { const intl = useIntl(); diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss index 7171883350..46179472b8 100644 --- a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/submitting_page.scss @@ -1,6 +1,7 @@ .submitting { overflow: hidden; + .processing { margin-top: 163px; } -} \ No newline at end of file +} diff --git a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss index b32204d8f3..522384347e 100644 --- a/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss +++ b/webapp/channels/src/components/self_hosted_purchases/self_hosted_expansion_modal/success_page.scss @@ -16,6 +16,7 @@ .self_hosted_expansion_success { overflow: hidden; + .selfHostedExpansionModal__success { margin-top: 163px; } From 4ef3081f6572331185784d25711ebc95201022fc Mon Sep 17 00:00:00 2001 From: Aditya Jain Date: Wed, 19 Apr 2023 08:32:32 +0530 Subject: [PATCH 22/44] MM-T4276 : E2E for set up Board emoji (#22887) * MM-T4276 Added cypress tests for board emoji * Update e2e-tests/cypress/tests/integration/boards/create_board_spec.ts --------- Co-authored-by: Aditya Jain Co-authored-by: Mattermost Build Co-authored-by: Saturnino Abril --- .../integration/boards/create_board_spec.ts | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/e2e-tests/cypress/tests/integration/boards/create_board_spec.ts b/e2e-tests/cypress/tests/integration/boards/create_board_spec.ts index 17ed47c57b..0d0e0b2ad8 100644 --- a/e2e-tests/cypress/tests/integration/boards/create_board_spec.ts +++ b/e2e-tests/cypress/tests/integration/boards/create_board_spec.ts @@ -98,6 +98,72 @@ describe('Create and delete board / card', () => { cy.findByText('for testing purposes only').should('be.visible'); }); + it('MM-T4276 Set up Board emoji', () => { + cy.visit('/boards'); + + // # Create an empty board and change tile to Testing + cy.findByText('Create an empty board').should('exist').click({force: true}); + cy.get('.BoardComponent').should('exist'); + + // # Change Title + cy.findByPlaceholderText('Untitled board').should('be.visible').wait(timeouts.HALF_SEC); + + // * Assert that the title is changed to "testing" + cy.findByPlaceholderText('Untitled board'). + clear(). + type('Testing'). + type('{enter}'). + should('have.value', 'Testing'); + + // # "Add icon" and "Show description" options appear + cy.findByText('Add icon').should('exist'); + cy.findByText('show description').should('exist'); + + // # Click on "Add icon" + cy.findByText('Add icon').should('exist').click({force: true}); + + // * Assert that a random emoji is selected and added at the beginning of the board title + cy.get('.IconSelector').should('exist'); + + // # Click on the emoji next to the board title + cy.get('.IconSelector .MenuWrapper').should('exist').click({force: true}); + + // * Assert that Dropdown menu with 3 options appears + cy.findByText('Random').should('exist'); + cy.findByText('Pick icon').should('exist'); + cy.findByText('Remove icon').should('exist'); + + // # Hover your mouse over the "Pick Icon" option + cy.findByText('Pick icon').trigger('mouseover'); + + // * Assert that emoji picker menu appears + cy.get('.IconSelector .menu-contents').should('exist'); + + // # Click on the emoji from the picker + cy.get('.EmojiPicker').should('exist').and('be.visible').within(() => { + // # Click on the emoji + cy.get("[aria-label='😀, grinning']").should('exist'); + cy.get("[aria-label='😀, grinning']").eq(0).click({force: true}); + }); + + // * Assert that Selected emoji is now displayed next to the board title + cy.get('.IconSelector span').contains('😀'); + + // # Click on the emoji next to the board title + cy.get('.IconSelector .MenuWrapper').should('exist').click({force: true}); + + // * Assert that Dropdown menu with 3 options appears + cy.findByText('Random').should('exist'); + cy.findByText('Pick icon').should('exist'); + cy.findByText('Remove icon').should('exist'); + + // # Click "Remove icon" + cy.findByText('Remove icon').click({force: true}); + + // * Assert that Icon next to the board title is removed + cy.get('.IconSelector').should('not.exist'); + }); + it('MM-T5397 Can create and delete a board and a card', () => { // Visit a page and create new empty board cy.visit('/boards'); From 6ca5824ea1d673598a7d24b7f9f787fd49b53880 Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Wed, 19 Apr 2023 12:04:25 +0800 Subject: [PATCH 23/44] E2E/Playwright: Update dependencies, screenshots, config and type (#23000) * update dependencies * update default server config and client type * close browser context once test is done * fix test when switching a product * update screenshots and readme * add cross-env and make headless mode as default --------- Co-authored-by: Mattermost Build --- e2e-tests/playwright/README.md | 19 +- e2e-tests/playwright/package-lock.json | 991 +++++++++--------- e2e-tests/playwright/package.json | 26 +- e2e-tests/playwright/sample.env | 2 +- .../playwright/support/browser_context.ts | 12 +- e2e-tests/playwright/support/server/client.ts | 4 +- .../support/server/default_config.ts | 12 +- e2e-tests/playwright/support/server/init.ts | 17 +- e2e-tests/playwright/support/test_fixture.ts | 1 + .../support/ui/components/global_header.ts | 2 +- e2e-tests/playwright/test.config.ts | 2 +- .../board-template-chrome-linux.png | Bin 132437 -> 129821 bytes .../board-template-firefox-linux.png | Bin 188426 -> 186305 bytes .../board-template-ipad-linux.png | Bin 251504 -> 243453 bytes .../view-untitled-board-chrome-linux.png | Bin 39208 -> 39080 bytes .../view-untitled-board-firefox-linux.png | Bin 66372 -> 64299 bytes .../view-untitled-board-ipad-linux.png | Bin 86868 -> 85946 bytes ...o-channel-as-regular-user-chrome-linux.png | Bin 79204 -> 72893 bytes ...-channel-as-regular-user-firefox-linux.png | Bin 115737 -> 108312 bytes ...-to-channel-as-regular-user-ipad-linux.png | Bin 187170 -> 171228 bytes ...o-channel-as-regular-user-iphone-linux.png | Bin 182293 -> 151142 bytes .../landing-login-chrome-linux.png | Bin 107583 -> 107128 bytes .../landing-login-firefox-linux.png | Bin 173304 -> 174161 bytes .../landing-login-ipad-linux.png | Bin 216895 -> 217813 bytes .../landing-login-iphone-linux.png | Bin 160350 -> 159954 bytes .../login-chrome-linux.png | Bin 153192 -> 153704 bytes .../login-error-chrome-linux.png | Bin 150727 -> 150165 bytes .../login-error-firefox-linux.png | Bin 275966 -> 277363 bytes .../login-error-ipad-linux.png | Bin 319337 -> 319229 bytes .../login-error-iphone-linux.png | Bin 246778 -> 246784 bytes .../login-firefox-linux.png | Bin 282502 -> 283869 bytes .../login-ipad-linux.png | Bin 303941 -> 304319 bytes .../login-iphone-linux.png | Bin 235971 -> 235846 bytes .../signup-email-chrome-linux.png | Bin 160275 -> 169173 bytes .../signup-email-error-chrome-linux.png | Bin 164336 -> 173620 bytes .../signup-email-error-firefox-linux.png | Bin 292167 -> 303130 bytes .../signup-email-error-ipad-linux.png | Bin 376866 -> 420896 bytes .../signup-email-error-iphone-linux.png | Bin 283059 -> 363638 bytes .../signup-email-firefox-linux.png | Bin 286303 -> 297842 bytes .../signup-email-ipad-linux.png | Bin 356465 -> 402248 bytes .../signup-email-iphone-linux.png | Bin 261719 -> 272287 bytes webapp/platform/types/src/config.ts | 1 - 42 files changed, 575 insertions(+), 514 deletions(-) diff --git a/e2e-tests/playwright/README.md b/e2e-tests/playwright/README.md index 25dd2c9d68..0a2a005243 100644 --- a/e2e-tests/playwright/README.md +++ b/e2e-tests/playwright/README.md @@ -2,8 +2,21 @@ #### 1. Start local server in a separate terminal. +``` +# Typically run the local server with: +cd server && make run + +# Or build and distribute webapp including channels, boards and playbooks +# so that their product URLs do not rely on Webpack dev server. +# Especially important when running test inside the Playwright's docker container. +cd webapp && make dist +cd server && make run-server +``` + #### 2. Install dependencies and run the test. +Note: If you're using Node.js version 18 and above, you may need to set `NODE_OPTIONS='--no-experimental-fetch'`. + ``` # Install npm packages npm i @@ -32,14 +45,16 @@ npm run test Change to root directory, run docker container ``` -docker run -it --rm -v "$(pwd):/mattermost/" --ipc=host mcr.microsoft.com/playwright:v1.30.0-focal /bin/bash +docker run -it --rm -v "$(pwd):/mattermost/" --ipc=host mcr.microsoft.com/playwright:v1.32.0-focal /bin/bash ``` #### 2. Inside the docker container ``` +export NODE_OPTIONS='--no-experimental-fetch' export PW_BASE_URL=http://host.docker.internal:8065 -cd mattermost/e2e/playwright +export PW_HEADLESS=true +cd mattermost/e2e-tests/playwright # Install npm packages. Use "npm ci" to match the automated environment npm ci diff --git a/e2e-tests/playwright/package-lock.json b/e2e-tests/playwright/package-lock.json index 6d5a200c81..ef8f199c95 100644 --- a/e2e-tests/playwright/package-lock.json +++ b/e2e-tests/playwright/package-lock.json @@ -6,30 +6,31 @@ "packages": { "": { "dependencies": { - "@percy/cli": "1.18.0", + "@percy/cli": "1.23.0", "@percy/playwright": "1.0.4", "@playwright/test": "1.32.3", "async-wait-until": "2.0.12", "chalk": "4.1.2", - "deepmerge": "4.3.0", + "deepmerge": "4.3.1", "dotenv": "16.0.3", "form-data": "4.0.0", "isomorphic-unfetch": "4.0.2", "uuid": "9.0.0" }, "devDependencies": { - "@types/uuid": "9.0.0", - "@typescript-eslint/eslint-plugin": "5.51.0", - "@typescript-eslint/parser": "5.51.0", - "eslint": "8.34.0", - "prettier": "2.8.4", - "typescript": "4.9.5" + "@types/uuid": "9.0.1", + "@typescript-eslint/eslint-plugin": "5.59.0", + "@typescript-eslint/parser": "5.59.0", + "cross-env": "7.0.3", + "eslint": "8.38.0", + "prettier": "2.8.7", + "typescript": "5.0.4" } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -58,17 +59,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -82,47 +72,39 @@ "node": ">=4" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -159,6 +141,15 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@eslint/js": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", + "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -225,19 +216,19 @@ } }, "node_modules/@percy/cli": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.18.0.tgz", - "integrity": "sha512-yfvVh2uwTqMGxn2wF/RCvGVsyfXkeKOt05Cil4s8PRSBQ94iDY872lMJ3al0gSq0y4GLAH9CO7ZVt3uqD2tlBg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.23.0.tgz", + "integrity": "sha512-3S+QUWdeJq6ZUWoRNLuX+wdJx8civJdrSmYG9WS2CP9auJNbuA+13xQnB5AkkWUvHEcC/yXzZpi5NAjoW86jgw==", "dependencies": { - "@percy/cli-app": "1.18.0", - "@percy/cli-build": "1.18.0", - "@percy/cli-command": "1.18.0", - "@percy/cli-config": "1.18.0", - "@percy/cli-exec": "1.18.0", - "@percy/cli-snapshot": "1.18.0", - "@percy/cli-upload": "1.18.0", - "@percy/client": "1.18.0", - "@percy/logger": "1.18.0" + "@percy/cli-app": "1.23.0", + "@percy/cli-build": "1.23.0", + "@percy/cli-command": "1.23.0", + "@percy/cli-config": "1.23.0", + "@percy/cli-exec": "1.23.0", + "@percy/cli-snapshot": "1.23.0", + "@percy/cli-upload": "1.23.0", + "@percy/client": "1.23.0", + "@percy/logger": "1.23.0" }, "bin": { "percy": "bin/run.cjs" @@ -247,36 +238,36 @@ } }, "node_modules/@percy/cli-app": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.18.0.tgz", - "integrity": "sha512-EAqD61ivuCwfl6PacXW9Wx9kTRvMPCBlQnxmrhx7jJG5tIp418p4XB3zkFOAirUa/LOdwNIVaPCHJyVAcJ1V5Q==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.23.0.tgz", + "integrity": "sha512-2L5chuBFp016LlkB7BihGtm0XJFCZEDNIcOFchsK7l2REBUkxVeM6hNQ89uuP2F9eKXwWKqtDEIYCzdzW0hfIQ==", "dependencies": { - "@percy/cli-command": "1.18.0", - "@percy/cli-exec": "1.18.0" + "@percy/cli-command": "1.23.0", + "@percy/cli-exec": "1.23.0" }, "engines": { "node": ">=14" } }, "node_modules/@percy/cli-build": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.18.0.tgz", - "integrity": "sha512-FuYWjXx4Wy0v27GpwxGX5qDq4xcLzlStbABNCp4H5RrNrLa1jkcViOKXTSurdjHYWlHHFWJUbk39D4g3ZRXOAA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.23.0.tgz", + "integrity": "sha512-qIhfU/UtPl181Dw2kR8klEYLUlA5C8GE0M9781vz7D0W3LriccaLLLo1wBp4q4bo83uvUBvNJhq9/S4T38kPEQ==", "dependencies": { - "@percy/cli-command": "1.18.0" + "@percy/cli-command": "1.23.0" }, "engines": { "node": ">=14" } }, "node_modules/@percy/cli-command": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.18.0.tgz", - "integrity": "sha512-2dHJalp83IygD/FqXCFNND22z7f4r5uZxqr5GAyiJ0STkQYitTgwkUp+4IRdfK1zmi+A2dbyYU0xV9txEW5v8g==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.23.0.tgz", + "integrity": "sha512-tXj5vv2BQMBmn3ZL2YNqYYrmJLyYnBqwyJkecY2BwXQsKAIv3qBgTzr1d5+LxTOi5ArjFCHAgk2w4ohy6h6t4w==", "dependencies": { - "@percy/config": "1.18.0", - "@percy/core": "1.18.0", - "@percy/logger": "1.18.0" + "@percy/config": "1.23.0", + "@percy/core": "1.23.0", + "@percy/logger": "1.23.0" }, "bin": { "percy-cli-readme": "bin/readme.js" @@ -286,22 +277,22 @@ } }, "node_modules/@percy/cli-config": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.18.0.tgz", - "integrity": "sha512-N5I7av5SGO5n0YC61wbqVniNxFwAQFFubKyGyGaVlQkmKyRuYCmDMHlPdSv3zyvVD1ZJCvtDzi/VqQGDubEieg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.23.0.tgz", + "integrity": "sha512-tI4c4MhU41rx9n7fYZrpn4gaOD9dA6PnefP397v7smqEWh7MJ+cxI/nyKU0/9G2wGjMhYACaLoR4BiCWOQZAkw==", "dependencies": { - "@percy/cli-command": "1.18.0" + "@percy/cli-command": "1.23.0" }, "engines": { "node": ">=14" } }, "node_modules/@percy/cli-exec": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.18.0.tgz", - "integrity": "sha512-4y+XIsYS5KypJmTtGKyKFU4GZ6902dCcEMJNDc69grSsco9N2lBG2gsvChCrCA2gDT8nUvKng9z9KF2OiMvF3w==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.23.0.tgz", + "integrity": "sha512-ecxnMWxUlVx0EswGraHgN4LvWbXeUZQZUxJ9wYmMSgDEaKfEiEZ5WTLSKzQAxyfw2SjoQ3cHRZbKh4qMlCgbAg==", "dependencies": { - "@percy/cli-command": "1.18.0", + "@percy/cli-command": "1.23.0", "cross-spawn": "^7.0.3", "which": "^2.0.2" }, @@ -310,11 +301,11 @@ } }, "node_modules/@percy/cli-snapshot": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.18.0.tgz", - "integrity": "sha512-3a7HqJU/wCT7fKraYw6S4cs8KrlUZ0MbDV9/dEbFh9nSfz0BLQjcK+kL8OzjxM+bVwZ6pf62FJl44nVLpXqrGw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.23.0.tgz", + "integrity": "sha512-QOrUfyPCnjfIAcUBjNlO299NRPDxofcYQUCBYZE3CtemsNFtygFt0yPnZCwWmt0voSpnPl1Izc6/FA3wYUfuBQ==", "dependencies": { - "@percy/cli-command": "1.18.0", + "@percy/cli-command": "1.23.0", "yaml": "^2.0.0" }, "engines": { @@ -322,11 +313,11 @@ } }, "node_modules/@percy/cli-upload": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.18.0.tgz", - "integrity": "sha512-JSRoE0aTnBH1HGNGmDJxGNkNIGor7H8pv6lO8AUiwCwQ55EHgLqtWlhwq+2AHz7QOiGD8aOHQTwJk6GcCIIa3A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.23.0.tgz", + "integrity": "sha512-faRHjzaUf21RK9Ra051gKUl4HmMNPZxUKSZNmdG0yP+tc5KxU9cXkmEeCKGH7LOcVs0IfyRX0vv58YEZ6GsIRw==", "dependencies": { - "@percy/cli-command": "1.18.0", + "@percy/cli-command": "1.23.0", "fast-glob": "^3.2.11", "image-size": "^1.0.0" }, @@ -335,23 +326,23 @@ } }, "node_modules/@percy/client": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.18.0.tgz", - "integrity": "sha512-onuVIpB6TPNjEhLlPsyhJYXTY2xdv3iNx4bj8Yfk751vQ33US2z4FEWDQKIEvHJGcFT7NEIHXFT3bYcFDmREdQ==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.23.0.tgz", + "integrity": "sha512-m0qNCrlfh6Pf0t2GfoeShuK7r2GeRk5rWVjIbdnDigvmtL0G+HJM1gvysLOxzKFHkZ1cLBfM1SnH1Yn6RM/6qQ==", "dependencies": { - "@percy/env": "1.18.0", - "@percy/logger": "1.18.0" + "@percy/env": "1.23.0", + "@percy/logger": "1.23.0" }, "engines": { "node": ">=14" } }, "node_modules/@percy/config": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.18.0.tgz", - "integrity": "sha512-bjAiZuhORij3vxeolVjpf7ZU1Sjqv2Y9CgsBthoIu20f5o0a10w6JGgPkDjT3NaAIZDXgbxVsrWovlslbRC57w==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.23.0.tgz", + "integrity": "sha512-giPIdNLcG1Qg0dkc/VDOkTzI4szzM4QAoJfMLEP0UYPkIU2Y0Xc8NH5GN3DEiudRJge72iGfeah6GugxmXmKXw==", "dependencies": { - "@percy/logger": "1.18.0", + "@percy/logger": "1.23.0", "ajv": "^8.6.2", "cosmiconfig": "^7.0.0", "yaml": "^2.0.0" @@ -361,15 +352,15 @@ } }, "node_modules/@percy/core": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.18.0.tgz", - "integrity": "sha512-9d8mkE6bfp0nRxhnGgC8N2KBG+MRiCxfvmZGfKENEoSY8NTTjJ5LqF+ol1JRwQ+uTABPZgy9XItWLINrS3yC1Q==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.23.0.tgz", + "integrity": "sha512-/BNHdvbD7r1p3k3HWgxYLBo2L2Ye9RDcmTuA6en2xUYaagf+0vfcAK8iyBvVm6ir2ZjAsMW0PGRa7OIfetvHHg==", "hasInstallScript": true, "dependencies": { - "@percy/client": "1.18.0", - "@percy/config": "1.18.0", - "@percy/dom": "1.18.0", - "@percy/logger": "1.18.0", + "@percy/client": "1.23.0", + "@percy/config": "1.23.0", + "@percy/dom": "1.23.0", + "@percy/logger": "1.23.0", "content-disposition": "^0.5.4", "cross-spawn": "^7.0.3", "extract-zip": "^2.0.1", @@ -385,22 +376,22 @@ } }, "node_modules/@percy/dom": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.18.0.tgz", - "integrity": "sha512-FoaUgmdCaymSVV/5UQsDwPlZYpSymViODiGJxEJnfESKB4L5aNWQTL3QefFOAI67Q9lUIezW7oueLPsH2XlCNg==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.23.0.tgz", + "integrity": "sha512-68q3ceCWsWpUFyF/pnELSCTdbTAibGVyNwp+iZCFd/914sUhERYrrX8AqCgkCDerOzCwAQZQDe2Nv3jaB+d0ng==" }, "node_modules/@percy/env": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.18.0.tgz", - "integrity": "sha512-b+RTDPst4yKk67EQMjGeBIjfAkqZy2jUXgW3SKaNCyCOzI+16IXJ1gJSrniv29TpxgqDa1y3OUyWTPkmuDVi2A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.23.0.tgz", + "integrity": "sha512-oKvJBC/Zhfwp2QpFBpfHeAVuGhgaPeI7S4H2/68XT30pInfVJzaCjD/8ySAELGyMWmgHc51s+k09DZCo3C3Gyg==", "engines": { "node": ">=14" } }, "node_modules/@percy/logger": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.18.0.tgz", - "integrity": "sha512-ZC9OqaTVPjnndcSfbQaU0NcquC0J4KZFx7hEDznukXNsLIK4WSLiEK1QS+tGxAkIKZilHmVc/vv9q3lMvlQDaQ==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.23.0.tgz", + "integrity": "sha512-kNtdKQ9Kou/RcWgDoSK+ofOVqOzuzyHBNsK+I92XNh8HHO6ow08Cmw+LtZbDxmj3uq7nXG9Nhgj4ZqSgdk7J6Q==", "engines": { "node": ">=14" } @@ -468,9 +459,9 @@ "dev": true }, "node_modules/@types/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", "dev": true }, "node_modules/@types/yauzl": { @@ -483,19 +474,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", - "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", + "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/type-utils": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/type-utils": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -517,14 +508,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", - "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", + "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" }, "engines": { @@ -544,13 +535,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -561,13 +552,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", - "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -588,9 +579,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -601,13 +592,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -628,18 +619,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", - "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", + "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -654,12 +645,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/types": "5.59.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -716,17 +707,14 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/argparse": { @@ -814,7 +802,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/color-convert": { + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -825,11 +827,43 @@ "node": ">=7.0.0" } }, - "node_modules/color-name": { + "node_modules/chalk/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -880,6 +914,24 @@ "node": ">= 6" } }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -921,9 +973,9 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { "node": ">=0.10.0" } @@ -993,12 +1045,15 @@ } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", + "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.38.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1009,10 +1064,9 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -1033,7 +1087,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -1070,40 +1123,16 @@ "node": ">=4.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ajv": { @@ -1154,14 +1183,14 @@ "dev": true }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1171,9 +1200,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -1499,11 +1528,11 @@ "dev": true }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/ignore": { @@ -1963,9 +1992,9 @@ } }, "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -2021,18 +2050,6 @@ } ] }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -2199,14 +2216,14 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/text-table": { @@ -2272,16 +2289,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/unfetch": { @@ -2342,9 +2359,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "engines": { "node": ">=10.0.0" }, @@ -2393,9 +2410,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "requires": { "@babel/highlight": "^7.18.6" } @@ -2415,14 +2432,6 @@ "js-tokens": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2432,44 +2441,33 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } } } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2498,6 +2496,12 @@ } } }, + "@eslint/js": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", + "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -2545,114 +2549,114 @@ } }, "@percy/cli": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.18.0.tgz", - "integrity": "sha512-yfvVh2uwTqMGxn2wF/RCvGVsyfXkeKOt05Cil4s8PRSBQ94iDY872lMJ3al0gSq0y4GLAH9CO7ZVt3uqD2tlBg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.23.0.tgz", + "integrity": "sha512-3S+QUWdeJq6ZUWoRNLuX+wdJx8civJdrSmYG9WS2CP9auJNbuA+13xQnB5AkkWUvHEcC/yXzZpi5NAjoW86jgw==", "requires": { - "@percy/cli-app": "1.18.0", - "@percy/cli-build": "1.18.0", - "@percy/cli-command": "1.18.0", - "@percy/cli-config": "1.18.0", - "@percy/cli-exec": "1.18.0", - "@percy/cli-snapshot": "1.18.0", - "@percy/cli-upload": "1.18.0", - "@percy/client": "1.18.0", - "@percy/logger": "1.18.0" + "@percy/cli-app": "1.23.0", + "@percy/cli-build": "1.23.0", + "@percy/cli-command": "1.23.0", + "@percy/cli-config": "1.23.0", + "@percy/cli-exec": "1.23.0", + "@percy/cli-snapshot": "1.23.0", + "@percy/cli-upload": "1.23.0", + "@percy/client": "1.23.0", + "@percy/logger": "1.23.0" } }, "@percy/cli-app": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.18.0.tgz", - "integrity": "sha512-EAqD61ivuCwfl6PacXW9Wx9kTRvMPCBlQnxmrhx7jJG5tIp418p4XB3zkFOAirUa/LOdwNIVaPCHJyVAcJ1V5Q==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-app/-/cli-app-1.23.0.tgz", + "integrity": "sha512-2L5chuBFp016LlkB7BihGtm0XJFCZEDNIcOFchsK7l2REBUkxVeM6hNQ89uuP2F9eKXwWKqtDEIYCzdzW0hfIQ==", "requires": { - "@percy/cli-command": "1.18.0", - "@percy/cli-exec": "1.18.0" + "@percy/cli-command": "1.23.0", + "@percy/cli-exec": "1.23.0" } }, "@percy/cli-build": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.18.0.tgz", - "integrity": "sha512-FuYWjXx4Wy0v27GpwxGX5qDq4xcLzlStbABNCp4H5RrNrLa1jkcViOKXTSurdjHYWlHHFWJUbk39D4g3ZRXOAA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.23.0.tgz", + "integrity": "sha512-qIhfU/UtPl181Dw2kR8klEYLUlA5C8GE0M9781vz7D0W3LriccaLLLo1wBp4q4bo83uvUBvNJhq9/S4T38kPEQ==", "requires": { - "@percy/cli-command": "1.18.0" + "@percy/cli-command": "1.23.0" } }, "@percy/cli-command": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.18.0.tgz", - "integrity": "sha512-2dHJalp83IygD/FqXCFNND22z7f4r5uZxqr5GAyiJ0STkQYitTgwkUp+4IRdfK1zmi+A2dbyYU0xV9txEW5v8g==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.23.0.tgz", + "integrity": "sha512-tXj5vv2BQMBmn3ZL2YNqYYrmJLyYnBqwyJkecY2BwXQsKAIv3qBgTzr1d5+LxTOi5ArjFCHAgk2w4ohy6h6t4w==", "requires": { - "@percy/config": "1.18.0", - "@percy/core": "1.18.0", - "@percy/logger": "1.18.0" + "@percy/config": "1.23.0", + "@percy/core": "1.23.0", + "@percy/logger": "1.23.0" } }, "@percy/cli-config": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.18.0.tgz", - "integrity": "sha512-N5I7av5SGO5n0YC61wbqVniNxFwAQFFubKyGyGaVlQkmKyRuYCmDMHlPdSv3zyvVD1ZJCvtDzi/VqQGDubEieg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.23.0.tgz", + "integrity": "sha512-tI4c4MhU41rx9n7fYZrpn4gaOD9dA6PnefP397v7smqEWh7MJ+cxI/nyKU0/9G2wGjMhYACaLoR4BiCWOQZAkw==", "requires": { - "@percy/cli-command": "1.18.0" + "@percy/cli-command": "1.23.0" } }, "@percy/cli-exec": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.18.0.tgz", - "integrity": "sha512-4y+XIsYS5KypJmTtGKyKFU4GZ6902dCcEMJNDc69grSsco9N2lBG2gsvChCrCA2gDT8nUvKng9z9KF2OiMvF3w==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.23.0.tgz", + "integrity": "sha512-ecxnMWxUlVx0EswGraHgN4LvWbXeUZQZUxJ9wYmMSgDEaKfEiEZ5WTLSKzQAxyfw2SjoQ3cHRZbKh4qMlCgbAg==", "requires": { - "@percy/cli-command": "1.18.0", + "@percy/cli-command": "1.23.0", "cross-spawn": "^7.0.3", "which": "^2.0.2" } }, "@percy/cli-snapshot": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.18.0.tgz", - "integrity": "sha512-3a7HqJU/wCT7fKraYw6S4cs8KrlUZ0MbDV9/dEbFh9nSfz0BLQjcK+kL8OzjxM+bVwZ6pf62FJl44nVLpXqrGw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.23.0.tgz", + "integrity": "sha512-QOrUfyPCnjfIAcUBjNlO299NRPDxofcYQUCBYZE3CtemsNFtygFt0yPnZCwWmt0voSpnPl1Izc6/FA3wYUfuBQ==", "requires": { - "@percy/cli-command": "1.18.0", + "@percy/cli-command": "1.23.0", "yaml": "^2.0.0" } }, "@percy/cli-upload": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.18.0.tgz", - "integrity": "sha512-JSRoE0aTnBH1HGNGmDJxGNkNIGor7H8pv6lO8AUiwCwQ55EHgLqtWlhwq+2AHz7QOiGD8aOHQTwJk6GcCIIa3A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.23.0.tgz", + "integrity": "sha512-faRHjzaUf21RK9Ra051gKUl4HmMNPZxUKSZNmdG0yP+tc5KxU9cXkmEeCKGH7LOcVs0IfyRX0vv58YEZ6GsIRw==", "requires": { - "@percy/cli-command": "1.18.0", + "@percy/cli-command": "1.23.0", "fast-glob": "^3.2.11", "image-size": "^1.0.0" } }, "@percy/client": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.18.0.tgz", - "integrity": "sha512-onuVIpB6TPNjEhLlPsyhJYXTY2xdv3iNx4bj8Yfk751vQ33US2z4FEWDQKIEvHJGcFT7NEIHXFT3bYcFDmREdQ==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.23.0.tgz", + "integrity": "sha512-m0qNCrlfh6Pf0t2GfoeShuK7r2GeRk5rWVjIbdnDigvmtL0G+HJM1gvysLOxzKFHkZ1cLBfM1SnH1Yn6RM/6qQ==", "requires": { - "@percy/env": "1.18.0", - "@percy/logger": "1.18.0" + "@percy/env": "1.23.0", + "@percy/logger": "1.23.0" } }, "@percy/config": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.18.0.tgz", - "integrity": "sha512-bjAiZuhORij3vxeolVjpf7ZU1Sjqv2Y9CgsBthoIu20f5o0a10w6JGgPkDjT3NaAIZDXgbxVsrWovlslbRC57w==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.23.0.tgz", + "integrity": "sha512-giPIdNLcG1Qg0dkc/VDOkTzI4szzM4QAoJfMLEP0UYPkIU2Y0Xc8NH5GN3DEiudRJge72iGfeah6GugxmXmKXw==", "requires": { - "@percy/logger": "1.18.0", + "@percy/logger": "1.23.0", "ajv": "^8.6.2", "cosmiconfig": "^7.0.0", "yaml": "^2.0.0" } }, "@percy/core": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.18.0.tgz", - "integrity": "sha512-9d8mkE6bfp0nRxhnGgC8N2KBG+MRiCxfvmZGfKENEoSY8NTTjJ5LqF+ol1JRwQ+uTABPZgy9XItWLINrS3yC1Q==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.23.0.tgz", + "integrity": "sha512-/BNHdvbD7r1p3k3HWgxYLBo2L2Ye9RDcmTuA6en2xUYaagf+0vfcAK8iyBvVm6ir2ZjAsMW0PGRa7OIfetvHHg==", "requires": { - "@percy/client": "1.18.0", - "@percy/config": "1.18.0", - "@percy/dom": "1.18.0", - "@percy/logger": "1.18.0", + "@percy/client": "1.23.0", + "@percy/config": "1.23.0", + "@percy/dom": "1.23.0", + "@percy/logger": "1.23.0", "content-disposition": "^0.5.4", "cross-spawn": "^7.0.3", "extract-zip": "^2.0.1", @@ -2665,19 +2669,19 @@ } }, "@percy/dom": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.18.0.tgz", - "integrity": "sha512-FoaUgmdCaymSVV/5UQsDwPlZYpSymViODiGJxEJnfESKB4L5aNWQTL3QefFOAI67Q9lUIezW7oueLPsH2XlCNg==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.23.0.tgz", + "integrity": "sha512-68q3ceCWsWpUFyF/pnELSCTdbTAibGVyNwp+iZCFd/914sUhERYrrX8AqCgkCDerOzCwAQZQDe2Nv3jaB+d0ng==" }, "@percy/env": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.18.0.tgz", - "integrity": "sha512-b+RTDPst4yKk67EQMjGeBIjfAkqZy2jUXgW3SKaNCyCOzI+16IXJ1gJSrniv29TpxgqDa1y3OUyWTPkmuDVi2A==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.23.0.tgz", + "integrity": "sha512-oKvJBC/Zhfwp2QpFBpfHeAVuGhgaPeI7S4H2/68XT30pInfVJzaCjD/8ySAELGyMWmgHc51s+k09DZCo3C3Gyg==" }, "@percy/logger": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.18.0.tgz", - "integrity": "sha512-ZC9OqaTVPjnndcSfbQaU0NcquC0J4KZFx7hEDznukXNsLIK4WSLiEK1QS+tGxAkIKZilHmVc/vv9q3lMvlQDaQ==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.23.0.tgz", + "integrity": "sha512-kNtdKQ9Kou/RcWgDoSK+ofOVqOzuzyHBNsK+I92XNh8HHO6ow08Cmw+LtZbDxmj3uq7nXG9Nhgj4ZqSgdk7J6Q==" }, "@percy/playwright": { "version": "1.0.4", @@ -2725,9 +2729,9 @@ "dev": true }, "@types/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", "dev": true }, "@types/yauzl": { @@ -2740,71 +2744,71 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz", - "integrity": "sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", + "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/type-utils": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/type-utils": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/parser": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.51.0.tgz", - "integrity": "sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", + "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz", - "integrity": "sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0" + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" } }, "@typescript-eslint/type-utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz", - "integrity": "sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.51.0", - "@typescript-eslint/utils": "5.51.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.51.0.tgz", - "integrity": "sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz", - "integrity": "sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/visitor-keys": "5.51.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2813,28 +2817,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.51.0.tgz", - "integrity": "sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", + "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.51.0", - "@typescript-eslint/types": "5.51.0", - "@typescript-eslint/typescript-estree": "5.51.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz", - "integrity": "sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==", + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.51.0", + "@typescript-eslint/types": "5.59.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -2869,11 +2873,11 @@ "dev": true }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" } }, "argparse": { @@ -2937,20 +2941,56 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "color-name": "~1.1.4" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "combined-stream": { "version": "1.0.8", @@ -2992,6 +3032,15 @@ } } }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3024,9 +3073,9 @@ "dev": true }, "deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, "delayed-stream": { "version": "1.0.0", @@ -3078,12 +3127,15 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", + "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.1", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.38.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3094,10 +3146,9 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", @@ -3118,7 +3169,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -3178,44 +3228,27 @@ } } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -3449,9 +3482,9 @@ "dev": true }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "ignore": { "version": "5.2.0", @@ -3781,9 +3814,9 @@ "dev": true }, "prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "pump": { @@ -3813,12 +3846,6 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3916,11 +3943,11 @@ "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" } }, "text-table": { @@ -3968,9 +3995,9 @@ "dev": true }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true }, "unfetch": { @@ -4016,9 +4043,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "requires": {} }, "yaml": { diff --git a/e2e-tests/playwright/package.json b/e2e-tests/playwright/package.json index d2c21cbc69..e2e7ecf1ee 100644 --- a/e2e-tests/playwright/package.json +++ b/e2e-tests/playwright/package.json @@ -1,33 +1,35 @@ { "scripts": { - "test": "PW_SNAPSHOT_ENABLE=true playwright test", - "percy": "PERCY_TOKEN=$PERCY_TOKEN PW_PERCY_ENABLE=true percy exec -- playwright test --project=chrome --project=iphone --project=ipad", + "test": "cross-env PW_SNAPSHOT_ENABLE=true playwright test", + "percy": "cross-env PERCY_TOKEN=$PERCY_TOKEN PW_PERCY_ENABLE=true percy exec -- playwright test --project=chrome --project=iphone --project=ipad", "tsc": "tsc -b", "lint": "eslint . --ext .js,.ts", "prettier": "prettier --write .", "check": "npm run tsc && npm run lint && npm run prettier", - "codegen": "playwright codegen $PW_BASE_URL", - "test-slomo": "PW_SNAPSHOT_ENABLE=true PW_HEADLESS=false PW_SLOWMO=1000 playwright test", + "codegen": "cross-env playwright codegen $PW_BASE_URL", + "playwright-ui": "playwright test --ui", + "test-slomo": "cross-env PW_SNAPSHOT_ENABLE=true PW_SLOWMO=1000 playwright test", "show-report": "npx playwright show-report" }, "dependencies": { - "@percy/cli": "1.18.0", + "@percy/cli": "1.23.0", "@percy/playwright": "1.0.4", "@playwright/test": "1.32.3", "async-wait-until": "2.0.12", "chalk": "4.1.2", - "deepmerge": "4.3.0", + "deepmerge": "4.3.1", "dotenv": "16.0.3", "form-data": "4.0.0", "isomorphic-unfetch": "4.0.2", "uuid": "9.0.0" }, "devDependencies": { - "@types/uuid": "9.0.0", - "@typescript-eslint/eslint-plugin": "5.51.0", - "@typescript-eslint/parser": "5.51.0", - "eslint": "8.34.0", - "prettier": "2.8.4", - "typescript": "4.9.5" + "@types/uuid": "9.0.1", + "@typescript-eslint/eslint-plugin": "5.59.0", + "@typescript-eslint/parser": "5.59.0", + "cross-env": "7.0.3", + "eslint": "8.38.0", + "prettier": "2.8.7", + "typescript": "5.0.4" } } diff --git a/e2e-tests/playwright/sample.env b/e2e-tests/playwright/sample.env index d474d199e6..73ffe19981 100644 --- a/e2e-tests/playwright/sample.env +++ b/e2e-tests/playwright/sample.env @@ -35,7 +35,7 @@ # - Default to "false" if not set. # 12. PW_HEADLESS -# - Default to "true" if not set. Set to false to run test in head mode. +# - Default to "false" or headless mode if not set. Set to true to run test in headed mode. # 13. PW_SLOWMO # - Default to "0" if not set which means normal test speed run. Slows down Playwright operations by the specified amount of milliseconds. Useful so that you can see what is going on. diff --git a/e2e-tests/playwright/support/browser_context.ts b/e2e-tests/playwright/support/browser_context.ts index 59badf9a9c..3aead7e46e 100644 --- a/e2e-tests/playwright/support/browser_context.ts +++ b/e2e-tests/playwright/support/browser_context.ts @@ -3,16 +3,18 @@ import {writeFile} from 'node:fs/promises'; -import {request, Browser} from '@playwright/test'; +import {request, Browser, BrowserContext} from '@playwright/test'; import {UserProfile} from '@mattermost/types/users'; import testConfig from '@e2e-test.config'; export class TestBrowser { readonly browser: Browser; + context: BrowserContext | null; constructor(browser: Browser) { this.browser = browser; + this.context = null; } async login(user: UserProfile | null) { @@ -27,8 +29,16 @@ export class TestBrowser { const context = await this.browser.newContext(options); const page = await context.newPage(); + this.context = context; + return {context, page}; } + + async close() { + if (this.context) { + await this.context.close(); + } + } } export async function loginByAPI(loginId: string, password: string, token = '', ldapOnly = false) { diff --git a/e2e-tests/playwright/support/server/client.ts b/e2e-tests/playwright/support/server/client.ts index 703275e0d7..6a41218e23 100644 --- a/e2e-tests/playwright/support/server/client.ts +++ b/e2e-tests/playwright/support/server/client.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -// This is based on "packages/client/src/client4.ts". Modified for node client. +// This is based on "webapp/platform/client/src/client4.ts". Modified for node client. // Update should be made in comparison with the base Client4. import fs from 'node:fs'; @@ -134,7 +134,7 @@ export default class Client extends Client4 { // ***************************************************************************** // Boards client - // based on https://github.com/mattermost/focalboard/blob/main/webapp/src/octoClient.ts + // based on "webapp/boards/src/octoClient.ts" // ***************************************************************************** async patchUserConfig(userID: string, patch: UserConfigPatch): Promise { diff --git a/e2e-tests/playwright/support/server/default_config.ts b/e2e-tests/playwright/support/server/default_config.ts index a82775d783..4e7c589644 100644 --- a/e2e-tests/playwright/support/server/default_config.ts +++ b/e2e-tests/playwright/support/server/default_config.ts @@ -319,7 +319,6 @@ const defaultServerConfig: AdminConfig = { LoginButtonColor: '#0000', LoginButtonBorderColor: '#2389D7', LoginButtonTextColor: '#2389D7', - EnableInactivityEmail: true, }, RateLimitSettings: { Enable: false, @@ -622,12 +621,6 @@ const defaultServerConfig: AdminConfig = { 'com.mattermost.nps': { Enable: true, }, - focalboard: { - Enable: true, - }, - playbooks: { - Enable: true, - }, }, EnableMarketplace: true, EnableRemoteMarketplace: true, @@ -671,13 +664,12 @@ const defaultServerConfig: AdminConfig = { BoardsFeatureFlags: '', BoardsDataRetention: false, NormalizeLdapDNs: false, - EnableInactivityCheckJob: true, UseCaseOnboarding: true, GraphQL: false, InsightsEnabled: true, CommandPalette: false, SendWelcomePost: true, - WorkTemplate: false, + WorkTemplate: true, PostPriority: true, WysiwygEditor: false, PeopleProduct: false, @@ -686,7 +678,9 @@ const defaultServerConfig: AdminConfig = { ThreadsEverywhere: false, GlobalDrafts: true, OnboardingTourTips: true, + DeprecateCloudFree: false, AppsSidebarCategory: false, + CloudReverseTrial: false, }, ImportSettings: { Directory: './import', diff --git a/e2e-tests/playwright/support/server/init.ts b/e2e-tests/playwright/support/server/init.ts index c8527ea318..4f33bafb80 100644 --- a/e2e-tests/playwright/support/server/init.ts +++ b/e2e-tests/playwright/support/server/init.ts @@ -3,7 +3,9 @@ import path from 'node:path'; import {expect} from '@playwright/test'; +import chalk from 'chalk'; +import {ClientError} from '@mattermost/client/client4'; import {PreferenceType} from '@mattermost/types/preferences'; import testConfig from '@e2e-test.config'; @@ -77,10 +79,21 @@ export async function initSetup({ offTopicUrl: getUrl(team.name, 'off-topic'), townSquareUrl: getUrl(team.name, 'town-square'), }; - } catch (err) { + } catch (error) { // log an error for debugging // eslint-disable-next-line no-console - console.log(err); + const err = error as ClientError; + if (err.message === 'Could not parse multipart form.') { + // eslint-disable-next-line no-console + console.log(chalk.yellow(`node version: ${process.version}\nNODE_OPTIONS: ${process.env.NODE_OPTIONS}`)); + + // eslint-disable-next-line no-console + console.log( + chalk.green( + `This failed due to the experimental fetch support in Node.js starting v18.0.0.\nYou may set environment variable: "export NODE_OPTIONS='--no-experimental-fetch'", then try again.'` + ) + ); + } expect(err, 'Should not throw an error').toBeFalsy(); throw err; } diff --git a/e2e-tests/playwright/support/test_fixture.ts b/e2e-tests/playwright/support/test_fixture.ts index d35435dd7c..1614f5a3cc 100644 --- a/e2e-tests/playwright/support/test_fixture.ts +++ b/e2e-tests/playwright/support/test_fixture.ts @@ -18,6 +18,7 @@ export const test = base.extend({ pw: async ({browser}, use) => { const pw = new PlaywrightExtended(browser); await use(pw); + await pw.testBrowser.close(); }, // eslint-disable-next-line no-empty-pattern pages: async ({}, use) => { diff --git a/e2e-tests/playwright/support/ui/components/global_header.ts b/e2e-tests/playwright/support/ui/components/global_header.ts index ccd1d48ee4..8ab49d6307 100644 --- a/e2e-tests/playwright/support/ui/components/global_header.ts +++ b/e2e-tests/playwright/support/ui/components/global_header.ts @@ -16,7 +16,7 @@ export default class GlobalHeader { async switchProduct(name: string) { await this.productSwitchMenu.click(); - await this.container.getByRole('link', {name: ` ${name}`}).click(); + await this.container.getByRole('link', {name}).click(); } async toBeVisible(name: string) { diff --git a/e2e-tests/playwright/test.config.ts b/e2e-tests/playwright/test.config.ts index 5a370a541e..e0f8eb9055 100644 --- a/e2e-tests/playwright/test.config.ts +++ b/e2e-tests/playwright/test.config.ts @@ -55,7 +55,7 @@ const config: TestConfig = { // CI isCI: !!process.env.CI, // Playwright - headless: parseBool(process.env.PW_HEADLESS, false), + headless: parseBool(process.env.PW_HEADLESS, true), slowMo: parseNumber(process.env.PW_SLOWMO, 0), workers: parseNumber(process.env.PW_WORKERS, 1), // Visual tests diff --git a/e2e-tests/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-chrome-linux.png b/e2e-tests/playwright/tests/visual/boards/board_template.spec.ts-snapshots/board-template-chrome-linux.png index f15014aaa40199db6fc3eedb6fb9f1a4d0fb2534..987b4d5b8da11a484005c30bb23be861b1878c17 100644 GIT binary patch literal 129821 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

1_bg|C*8zHMV2W9^3*N)bV2>fNW*YjC8aQ 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